ssh-agentのまとめ

参考サイト ssh-agentを使って公開鍵認証方式のsshパスワード入力を省略する方法 | server-memo.net

ssh-agentとは

公開鍵認証方式による認証を行っているSSHサーバへ接続する際、秘密鍵に設定されているパスフレーズの入力を代わりにやってくれる(秘密鍵パスフレーズはメモリ上にキャッシュされる)。例えば、同じ公開鍵をおいた複数台のリモートサーバーがあるとすると、それらに接続する時、通常なら1台ごとにパスワードを入力しなければならないが、ssh-agentに秘密鍵とパスワードを登録しておけば、そのようなことが不要になる。

ssh-agentは便利だが、注意点もある。

  • ssh-agentを起動したシェル内のみ有効。ログアウトしたりシェルを変更すると使えなくなりssh-agentの再実行が必要
  • ssh-addで秘密鍵パスフレーズの登録が必要。ssh-agentを起動するたびに登録が必要
  • ssh-agentが自動終了しない ログアウトしたりシェルを変更してもssh-agentは自動終了しないため、新しいシェルでssh-agentを起動すると多重起動が発生してしまう

ssh-agentの起動

一般的に

$ eval `ssh-agent`
Agent pid 37343

ssh-agentが起動し、使用できるようになる。以下のように「ssh-agent」だけでは、*環境変数を手動で設定しないと動かず、手間がかかるので、「eval `ssh-agent`」で起動するのが合理的である。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-NacKBwK56etU/agent.3193; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3194; export SSH_AGENT_PID;
echo Agent pid 3194;

なお、ssh-agentが起動していない時は以下のようなメッセージが出てくる。

$ ssh-add ~/.ssh/id_ecdsa_100 ~/.ssh/id_rsa
Could not open a connection to your authentication agent.

秘密鍵パスフレーズの登録

秘密鍵は複数同時に登録できる。

$ ssh-add ~/.ssh/id_rsa_bitbucket ~/.ssh/id_rsa
Enter passphrase for /home/vagrant/.ssh/id_rsa_bitbucket:
Identity added: /home/vagrant/.ssh/id_rsa_bitbucket (/home/vagrant/.ssh/id_rsa_bitbucket)
Enter passphrase for /home/vagrant/.ssh/id_rsa:
Identity added: /home/vagrant/.ssh/id_rsa (/home/vagrant/.ssh/id_rsa)

これによって、登録された秘密鍵に対応する公開鍵を有すSSHサーバにはパスワードなしで接続できるようになる。公開された鍵は以下のようにして確認できる。

vagrant@home:~/Project/$ ssh-add -l
2048 SHA256:salCLeOtWqM5zZeVPom2Yp+ovZFIx0T7bXkwTo71PeNtk usr410213@JKPN0009 (RSA)
3072 SHA256:sad7D7N4BhrYCOvxHYtjhVeagEn7HGP9XkMkIMY95xXkg usr410213@JKPN0009 (RSA)

秘密鍵情報の引き継ぎ

ssh-agentにローカルで秘密鍵パスフレーズ登録後、sshで接続を行う際に「-A」オプションを指定すると、接続先にも秘密鍵パスフレーズの情報が引き継がれる。capistranoなどでデプロイするときに必要となる。

vagrant@home$ ssh-add -l
2048 SHA256:salCLeOtWqM5zZeVPom2Yp+ovZFIx0T7bXkwTo71PeNtk usr4100082@JKPN0009 (RSA)
3072 SHA256:sad7D7N4BhrYCOvxHYtjhVeagEn7HGP9XkMkIMY95xXkg usr4100082@JKPN0009 (RSA)

vagrant@home$ ssh -A dev-app
Last login: Fri Sep  3 16:10:38 2020 from 127.0.0.1
・・・
kp-aaa@dev-app:~$ ssh-add -l
2048 SHA256:salCLeOtWqM5zZeVPom2Yp+ovZFIx0T7bXkwTo71PeNtk usr4100082@JKPN0009 (RSA)
3072 SHA256:sad7D7N4BhrYCOvxHYtjhVeagEn7HGP9XkMkIMY95xXkg usr4100082@JKPN0009 (RSA)

ssh-agentの停止

$ eval `ssh-agent -k`
Agent pid 2985 killed

「eval」コマンドを使用せずに「ssh-agent -k」を実行すると、起動時に登録した環境変数を削除するための「unset」が表示されるので、これをコピーして実行することで環境を変数を削除することができる。

$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 2107 killed;