WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

ssh-agent でパスフレーズの入力を省く

SSH ではログインするときにパスフレーズの入力が必要ですが、ときどきこれが億劫になるときがあります。例えば scp コマンドでファイル転送を繰り返すときなど、転送のたびにパスワードを打ち込まなければなりません。

元来、人間というのは単調作業が苦手です(プログラマーなどと呼ばれる人種はこの傾向が顕著なようです^^;)。同じパスフレーズを何回も入力するなど、苦痛以外の何者でもありません。秘密鍵を暗号化しなければよいのでしょうが、秘密鍵を盗まれたときが心配です。なんとか秘密鍵を暗号化した状態で、パスフレーズの入力を省けないものでしょうか。

そんな我侭な要望に応えてくれる素晴らしいプログラムが OpenSSH には標準で付属しています。それが ssh-agent 、「認証エージェント」と呼ばれるものです。本日は、この ssh-agent の使い方をご紹介したいと思います。

使ってみる

それでは、さっそく使ってみましょう。

ssh-agent の起動

ssh-agent は以下のようにして起動します。

ssh-agent bash

引数は起動するシェルの名前です。ここでは bash を指定していますが、それ以外のシェルでもいけるはずです。実行すると ssh-agent は指定されたシェルを起動し、自身もバックグラウンドで動作し続けています。

秘密鍵の登録

次に、使用する秘密鍵を ssh-add コマンドで登録してやります。

ssh-add ~/.ssh/id_rsa

このときにパスフレーズを尋ねてきますので、指定した秘密鍵に合ったパスフレーズを入力してください。これで暗号化が解除された秘密鍵がメモリにストックされ、以降の SSH 接続では自動的にそちらが使用されます。もし複数の秘密鍵を使用している場合は、 ssh-add コマンドでいくつでも登録できます。

また、秘密鍵ファイルの指定を省略すると "~/.ssh/id_rsa", "~/.ssh/id_dsa", "~/.ssh/identify" が登録されます。

SSH 接続

試しにサーバーに接続してみましょう。

ssh www.example.com

使用する秘密鍵が ssh-add で正常に登録されていれば、パスフレーズを入力することなく接続できるはずです。これ以降、何回接続してもパスフレーズを尋ねられることはありません。もちろん、 scp など、 ssh 以外のプログラムでも有効です。

ssh-agent の終了

ssh-agent が起動したシェルを終了すれば、 ssh-agent も同時に終了します。exit コマンドで普通に終了すれば OK です。

ssh-agent の転送機能を利用する

ssh-agent のもうひとつの特徴的な機能として、認証の転送機能があります。通常、 ssh でリモートサーバーに接続して、そこからさらに別の SSH サーバーに接続するには、リモートサーバーのほうにログイン先の秘密鍵を置いておかなければなりません。しかし、この転送機能を使うと、大元のクライアントにある秘密鍵を使って、さらに別のホストにログインすることが可能です。

なにに便利かというと、例えばログイン先に別のサーバーから scp コマンドでファイルを転送したいとき、などでしょうか。ログイン先で Subversion を使って別ホストにあるリポジトリを参照したなんてこともあるかもしれませんね。

やり方は簡単、上記の方法で ssh-agent を起動した後、 -A コマンドを付けて ssh コマンドを実行するだけです。

ssh -A www.example.com

こうすると、ログイン先でローカルの ssh-agent に登録した秘密鍵が使えるようになります。後は、普通に ssh や scp で別のホストにログインすることができます。

ssh-agent の仕組み

最後に、 ssh-agent による認証処理の仕組みを簡単に説明しておきます。

ssh-agent が起動すると、 UNIX ドメインソケット(UNIX でプロセス間通信に使われる、ファイルシステムベースの通信経路)を作成し、その名前を環境変数 "SSH_AUTH_SOCK" に設定します。そして、 ssh コマンドなどが起動したときは、このソケット経由で通信を行い、秘密鍵が必要な認証の処理を ssh-agent に代行させます。シェルの環境変数は子プロセスからは変更できないため、代わりに新しいシェルを起動しているわけです。

このとき注意すべきなのは、root 権限があればすべてのユーザーの UNIX ドメインソケットにアクセス可能なことです。とくに上記の転送機能で接続している場合、踏み台になっているサーバーの root ユーザーもその転送機能を利用できてしまいます。 root ユーザーが信頼できないサーバーを経由することは避けたほうがよいでしょう。

また、必要がなくなったら ssh-agent を確実に終了させることも重要です。ここでご紹介した使い方ならシェルを終了した時点で ssh-agent も終了するため、通常は問題が起こることはないはずです。ただし、子プロセスとして起動されたシェルが強制終了されたときなどは注意が必要かもしれません。

SSH を頻繁に使うようになると、 ssh-agent は非常に便利です。使い方も簡単なので、ぜひ活用してください!(^^)


2009/4/4 追記
ssh-agent の仕組みの説明が間違っていたので、修正。ご指摘くださった kazuto さん、ありがとうございます。
2013/12/25 追記
用語が間違っていた点と、 root ユーザーによる不正利用の説明が適切でなかった点を修正。ご指摘くださった inshin さん、ありがとうございます。
関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles