server-memo.net

ssh-agentを使って公開鍵認証方式のsshパスワード入力を省略する方法

   

ssh-agentを使用した、公開鍵認証方式のSSHパスフレーズ入力を省略する方法です。

ssh-agentとは

簡単に説明すると、公開鍵認証方式による認証を行っているSSHサーバへ接続する際、秘密鍵に設定されているパスフレーズの入力を代わりにやってくれるアプリケーションです。(秘密鍵とパスフレーズはメモリ上にキャッシュされます)

このssh-agentは、パスフレーズの入力回数を減らしてくれるという便利アプリケーションなのですが、以下のちょっと使いづらい仕様もあったりします。

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

ssh-agentの使い方

実際に「ssh-agent」を使用する方法について説明していきます。

ssh-agentの簡単な使い方

「ssh-agent」は「eval `ssh-agent`」で「ssh-agent」を起動して、「ssh-add 秘密鍵」で秘密鍵とパスフレーズの登録を行うことで、パスフレーズの入力を行わずにssh接続が可能となります。

ssh-agent実行

「ssh-agent」を実行する場合は「eval」コマンドと合わせて実行する必要があります。

$ eval `ssh-agent`

実際に起動させた際のログが下記となります。

$ eval `ssh-agent`
Agent pid 37343

eval無しで実行した場合

「ssh-agent」はそのまま実行すると、使用するための必要な環境変数を出力して動作し始めますが、この環境変数を手動で設定しなければ「ssh-agent」を使用することが出来ません。

ですので、通常は「eval」コマンドで環境変数を設定させて「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_AUTH_SOCK=/tmp/ssh-NacKBwK56etU/agent.3193; export SSH_AUTH_SOCK;
$ SSH_AGENT_PID=3194; export SSH_AGENT_PID;

「eval」無しで実行した場合は、このように手動で環境変数を設定しなくてはいけないので、とても面倒です…

ssh-addによる秘密鍵とパスフレーズの登録

「ssh-agent」を起動させたら、次に「ssh-add」を使用して秘密鍵の登録とパスフレーズの入力を行っていきます。

$ ssh-add 秘密鍵

秘密鍵は複数指定可能で、登録された秘密鍵とパスフレーズの情報はメモリ上にキャッシュされます。

下記は「id_ecdsa_100」と「id_ecdsa_co」2つの秘密鍵を実際に登録した際の作業ログとなります。

$ ssh-add ~/.ssh/id_ecdsa_100 ~/.ssh/id_ecdsa_co
Enter passphrase for /home/tamohiko/.ssh/id_ecdsa_100:
Identity added: /home/tamohiko/.ssh/id_ecdsa_100 (/home/tamohiko/.ssh/id_ecdsa_100)
Enter passphrase for /home/tamohiko/.ssh/id_ecdsa_co:
Identity added: /home/tamohiko/.ssh/id_ecdsa_co (/home/tamohiko/.ssh/id_ecdsa_co)

秘密鍵ごとにパスフレーズの入力を求められますので、それぞれ入力をしてください。

秘密鍵の登録確認

登録されている秘密鍵は下記のコマンドで確認することが出来ます。

$ ssh-add -l 

先ほど登録した鍵の確認をしてみると、2つの鍵が登録されていることが確認できます。

$ ssh-add -l
521 7e:93:12:13:23:c7:2e:18:d9:5b:12:35:9e:42:29:5e /home/tamohiko/.ssh/id_ecdsa_100 (ECDSA)
521 fc:61:19:a3:bf:9c:d7:ab:ec:9c:b0:0e:7a:6e:18:31 /home/tamohiko/.ssh/id_ecdsa_co (ECDSA)

ちなみに、鍵の登録がない場合は下記のように表示されます。

$ ssh-add -l
The agent has no identities.

ssh-agentが起動してい場合

「ssh-agent」が起動していない状態で「ssh-add」コマンドを実行した場合は、下記のようなメッセージが表示されます。

秘密鍵登録時
$ ssh-add ~/.ssh/id_ecdsa_100 ~/.ssh/id_ecdsa_co
Could not open a connection to your authentication agent.
登録秘密鍵の確認時
$ ssh-add -l
Could not open a connection to your authentication agent.

sshでの接続

「ssh-add」コマンドで秘密鍵とパスフレーズの登録が完了したら、SSHでの接続確認を行ってみましょう。

登録した秘密鍵の1つは「192.168.1.100」サーバのだったので、そのサーバに接続してみます。

$ ssh tamohiko@192.168.1.100
Last login: Tue Sep 13 14:49:13 2016 from 192.168.1.110

パスフレーズを聞かれることなく対象サーバにログインできることが確認できました。

秘密鍵情報の引き継ぎ(ssh-agent転送機能)

sshで接続を行う際に「-A」オプションを指定すると、接続先にも秘密鍵とパスフレーズの情報が引き継がれます。

$ ssh -A ユーザ名@接続先サーバ
接続例

「192.168.1.100」サーバにSSHで接続した後に、「ssh-add -l」コマンドで登録されている秘密鍵情報を確認したところ、秘密鍵の情報が引き継がれて登録されていることが確認できました。

$ ssh -A tamohiko@192.168.1.100
Last login: Tue Sep 13 14:54:53 2016 from 192.168.1.110
$ ssh-add -l
521 7e:93:12:13:23:c7:2e:18:d9:5b:12:35:9e:42:29:5e /home/tamohiko/.ssh/id_ecdsa_100 (ECDSA)
521 fc:61:19:a3:bf:9c:d7:ab:ec:9c:b0:0e:7a:6e:18:31 /home/tamohiko/.ssh/id_ecdsa_co (ECDSA)

ssh-agnetの停止について

「ssh-agent」の停止は「ssh-agent -k」コマンドで行いますが、起動時と同じように「eval」コマンドを使用して環境変数の削除も行うようにします。

$ eval `ssh-agent -k`

実際に「ssh-agent」を停止させてみると、プロセスがkillされていることが確認できます。

$ 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;

ssh-agent -k 自動実行

「ssh-agent」はユーザがサーバからログアウトしても起動したままなので、「ssh-agent -k」コマンドで停止させずにログインするたびに「ssh-agent」を起動させていると、下記のように多重起動状態になってしまいます。

$ ps -ef | grep ssh-agent
tamohiko  2622     1  0 14:58 ?        00:00:00 ssh-agent
tamohiko  2936     1  0 15:37 ?        00:00:00 ssh-agent
tamohiko  2966     1  0 15:38 ?        00:00:00 ssh-agent

ですが、毎回手動で「ssh-agent -k」コマンドを実行するのは面倒ですよね。

そこで、このコマンドを自動実行させるために、ユーザのホームディレクトリにある「.bash_logout」に下記の設定を追加することで、ログアウト時に「ssh-agent」を自動終了させることができます。

$ vi ~/.bash_logout
設定内容
/bin/ssh-agent -k

セキュリティ上の注意点

「ssh-agent」を使用すると、パスフレーズの入力を省略できるため非常に便利なのですが、その分セキュリティレベルは当然低下します。

作業端末から離れる場合は「ssh-agent」を停止させたり、重要なサーバ(本番サーバ等)への接続には使用しないといったルールを作って使用しましょう。

 - SSH