SSH小技集: SSH Agent

クララオンライン グローバルソリューション事業部の平田です。Techblog ということで、インフラやプログラミング周りのネタを書いていきたいと思いますので、よろしくお願いします。

初回は SSH ネタです。

はじめに

エンジニアの方であればUnix系サーバ (FreeBSDやLinuxなど) へアクセスする際、SSHを利用していると思います。パスワードを利用していたのは昔の話、今時は公開鍵認証を利用するのが当然ですが、厄介なのは秘密鍵のパスフレーズ (パスワード) です。

複数のサーバへのアクセスに利用するという性質上、パスフレーズを設定しない・簡単なものにしておくのは避けたいところですが、毎回長いパスフレーズを入力するというのも面倒で、悩みの種になっている方も多いのではないでしょうか。今回は、そんな悩みを解決してくれる SSH agent について概要を説明したいと思います。

なお、SSH agent はセキュリティレベルを低下させて利便性を向上させる仕組みです。末尾にはセキュリティに関する注意書きがありますので、必ずそちらをご覧ください。

SSH agentとは

SSH agent はSSHの秘密鍵を保持し、SSHクライアントの依頼に応じて秘密鍵の処理を行うためのプログラムです。(SSH agent が SSH クライアントに直接秘密鍵を提供することはありません。)

OpenSSHには ssh-agent(1)、Windows 用は PuTTY の Pagent などがあり、これらを起動しておくことで、SSH クライアントはパスフレーズの入力を省略してリモートへのアクセスが可能となります。

SSH agent を利用したアクセス

以下の解説では、鍵生成はすでに終わっていること、アクセス先サーバの ~/.ssh/authorized_keys に公開鍵が登録されていることを前提としています。

PuTTY (Windows)

インストーラを利用して PuTTY をインストールした場合、SSH agent である Pagent は自動的にインストールされます。なお、Pagent は PuTTY だけではなく、TeraTerm や WinSCP など他のプログラムからも利用することができます。

  1. Pagent (スタート→すべてのプログラム→PuTTY) を起動します。
  2. 通知領域のPagentアイコンをダブルクリックして鍵一覧を表示させます。(デフォルトでは空になっています。)
    pagent_0
  3. “Add key” をクリックして秘密鍵を選択、パスフレーズを入力します。
    pagent_1
  4. Pagent Key Listに秘密鍵の情報が追加されていることを確認します。
    pagent_3

これ以降、Pagentを起動している間はPuTTY上で秘密鍵のパスフレーズの入力が不要となります。(PuTTY側の追加設定は不要です。)

OpenSSH (Unix系OS)

OpenSSH では ssh-agent / ssh-add というコマンドを利用します。

ssh-agent の起動

ssh-agentを起動すると環境変数を設定するコマンドが表示されるので、そのままコピー&ペーストで実行します。ここで、SSH_AGENT_PIDはssh-agentのプロセスID、SSH_AUTH_SOCKは通信に利用するUnixドメインソケットのパスを表しています。

実際に起動する場合は以下のようにバッククオートを利用してそのまま eval することになるでしょう。ssh-agentはシェルを自動判定して適切なコマンドを出力しますが、正常に判定できない場合には -b (bsh系)、-c (csh系) のオプションを試してみてください。

その後は、ssh-addコマンドで秘密鍵を登録します。

以上の操作で、SSHのコマンド群はssh-agentから秘密鍵を取得することが可能となりました。あとは ssh / slogin / scp などのコマンドを利用してリモートホストへ自由にアクセスすることができます。

鍵の一覧

ssh-agent に登録されている鍵の一覧は、ssh-add コマンドで表示することが可能です。

鍵の削除

ssh-agent に登録されている鍵の削除は、ssh-add コマンドで行います。

ssh-agent の停止

ssh-agent は -k オプションを付けることで、ssh-agent を停止することができます。(SSH_AGENT_PID に指定された ssh-agent が対象となります。)

通常は eval を使用して環境変数の削除まで行います。

ssh-agent でシェルを起動する

ssh-agentにコマンドを渡すことで、ssh-agentは環境変数を設定した状態でコマンド (通常はシェルを指定することになるでしょう) を起動します。また、プログラムが終了する (シェルを exit する) と、ssh-agent は自動的に終了します。

ssh-agentを共有する

.zshrc や .bashrc に ssh-agent の起動コマンド (eval ssh-agent) を追記することで、自動的にssh-agentを起動することができますが、セッションごとに ssh-agent が起動する・毎回パスフレーズを入力する必要があるなどの欠点があります。そこで、一回起動した ssh-agent を共用する方法について考えます。

ssh-agent との通信はUNIXドメインソケットを通して行われるため、ソケットのパスが分かり、アクセス権限があればagentから秘密鍵を取得することが可能です。

先に記載したとおり OpenSSH では、SSH_AGENT_PID と SSH_AUTH_SOCK の2つの環境変数を設定することで、通信する ssh-agent を指定します。このため、別のセッションから次のように環境変数を設定すると、起動中の ssh-agent から秘密鍵を取得可能になります。

実際には .zshrc や .bashrc に次のようなスクリプトを追記して、自動化することになるでしょう。(http://superuser.com/a/230872 のスクリプトをベースに作成。)

※ここでは、ssh-add を実行しないよう設定しています。必要に応じて、コメントアウトを外してください。

セキュリティ

SSH agentが起動している間は、パスフレーズを入力すること無く秘密鍵を利用することができるため、セキュリティレベルは低下します。このため、外に持ち出す場合には SSH agent を終了する、秘密鍵を削除するなどの対策が必要になるでしょう。

また、自分が管理していない計算機を利用する際にも注意が必要です。UNIXドメインソケットでは、通常のファイルと同様のアクセス権管理が行われます。すなわち、root ユーザであれば起動中の ssh-agent へ自由にアクセスして秘密鍵を利用することが可能になります。たとえば、root ユーザは以下のように環境変数 SSH_AUTH_SOCK を設定することで、ユーザの ssh-agent 利用することができます。

冒頭でも述べたように、SSH agent はセキュリティレベルを低下させて利便性を向上させる仕組みです。重要なサーバへのアクセスは SSH agent を利用しない別の鍵を利用などの工夫が必要です。

Share on LinkedIn
LINEで送る
Pocket

平田

平田

本業はインフラエンジニアだけど、最近はプログラミングやっています。