ssh-agentで手元の公開鍵をリモートサーバから使う

ssh-agentは公開鍵を保持して、認証処理を代行するデーモンプロセスである。

パスフレーズの入力を一度で済ませる

ssh-agent経由でシェルを起動し、鍵を登録しておくことで、以降シェルを抜けるまでパスフレーズなしで認証できる。

$ ssh-agent bash
$ ssh-add
Enter passphrase for /home/user/.ssh/id_rsa: [type a passphrase here]
$ ssh-add -l
2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /home/user/.ssh/id_rsa (RSA)
$ ssh user@server    # パスフレーズを聞かれない

手元の公開鍵をリモートサーバで使う

手元のPCから共有サーバAに接続し、さらに個人サーバBに接続することを考える。 個人サーバBに公開鍵認証で接続したい場合、個人サーバBには共有サーバAの公開鍵を登録する必要がある。 しかし、共有サーバAのroot権限を複数のユーザが持っているとき、自分以外のユーザも共有サーバAにある秘密鍵を使い、個人サーバBにログインすることができてしまう。

ssh-agentを使うと、手元のPCの鍵をネットワーク経由で共有サーバA上でも使うことができる。 このとき、個人サーバBには手元のPCの公開鍵を登録しておけばよい。 エージェントの転送を有効にするには、sshコマンドの引数として-Aを指定する。

$ ssh-agent bash
$ ssh-add
Enter passphrase for /home/user/.ssh/id_rsa: [type a passphrase here]
$ ssh-add -l
2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /home/user/.ssh/id_rsa (RSA)
$ ssh -A user@server
(user@server)$ ssh-add -l    # リモートサーバでも手元のPCの鍵を扱えている
2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /home/user/.ssh/id_rsa (RSA)

個人サーバBからさらに別のサーバへ接続する場合も、同様にsshコマンドの引数として-Aを指定すればよい。

screen上のすべてのシェルで使う

ssh-agentを立ち上げる際bashの代わりにscreenを引数に与えれば、その上で作られるすべてのシェルでssh-agentが使われるようになる。

$ ssh-agent screen -U
$ ssh-add

仕組み

ssh-agentはUNIXドメインソケットを利用し、ssh等の他のプロセスとのプロセス間通信を行う。 このソケットへのパスは、シェルを起動した際に環境変数$SSH_AUTH_SOCKに設定される。 また、エージェントの転送を有効にした場合は、リモートサーバからsshを経由し、手元のssh-agentが認証処理を行う。

参考リソース