Akio's Log

ソフトウェア開発、プロジェクトマネジメント、プログラミング、ランニングなどなど

自分サーバの構築その14:ssh-agentでノンパスワードを実現

公開鍵認証を利用してのsshログインの環境は既に構築できた。しかし、sshでログインする度に、鍵ファイルのパスフレーズを入力しなければいけない。せっかくなので、パスワード入力の手間を省きたい。

ssh-agentを使えば、問題は解決できる。

参考にしたのは、以下のサイト。

基本的な方法としては、ssh-agentプロセスを起動し、ssh-addコマンドでパスフレーズを入力する、というやり方。

[hanzawa@local]$ eval `ssh-agent`
Agent pid 3059
[hanzawa@local]$ ssh-add
Enter passphrase for /home/hanzawa/.ssh/id_rsa:
Identity added: /home/hanzawa/.ssh/id_rsa (/home/hanzawa/.ssh/id_rsa)

[hanzawa@local] ssh remote
[hanzawa@remote]

これで、remoteにパスワードなしでログインする事が出来た。

ssh-agentは、ログアウトしてもデーモンが生存したままなので、ログアウト時にkillする必要があるそうだ。killし忘れないように.bash_logoutファイルに記述した方が良いとの事。

最後の注意点として,ssh-agentデーモンは次のようにログアウト前にkillする必要があることだ。これを自動化させるには,~/.bash_logoutに「ssh-agent -k」をフルパスで記述しておくとよいだろう。
ITmedia エンタープライズ : Linux Tips「ssh-agentでパスフレーズをキャッシュさせたい ノンパスワードの実現 」

手動でkillする場合。

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

上記の方法を自動化するためには、.bash_profileに「eval `ssh-agent`」を記述するらしい。

bash_profileに追加する便利なスクリプトが紹介されていたので、引用してみる。

echo -n "ssh-agent: "
source ~/.ssh-agent-info
ssh-add -l >&/dev/null
if [ $? == 2 ] ; then
echo -n "ssh-agent: restart...."
ssh-agent >~/.ssh-agent-info
source ~/.ssh-agent-info
fi

if ssh-add -l >&/dev/null ; then
echo "ssh-agent: Identity is already stored."
else
ssh-add
fi

このスクリプトを「~/.bash_profile」に追記して、ログインし直してみた。

ssh-agent: -bash: /home/hanzawa/.ssh-agent-info: そのようなファイルやディレクトリはありません
ssh-agent: restart....Agent pid 3290
Enter passphrase for /home/hanzawa/.ssh/id_rsa:
Identity added: /home/hanzawa/.ssh/id_rsa (/home/hanzawa/.ssh/id_rsa)
[hanzawa@local]$ ssh remote
[hanzawa@remote]$

シェルの起動時にパスフレーズが聞かれ、一度入力するとその後はノンパスワードでsshログインする事が出来た。

cygwin では、次の設定を .bash_profile か .bashrc に書いておくのをおすすめする。これは、ssh-agent を常駐させて、複数の cygwin ウィンドウを開いても最初の1回しかパスフレーズを聞いてこないようにするものだ。

.bash_profileに「eval `ssh-agent`」を記述するだけでは、シェルを起動するたびに、パスフレーズの入力が必要になってしまうが、上記の方法だと「.ssh-agent-info」というファイルを生成しているため、最初の1回しかパスフレーズが要求されない。

ほほう。これは便利だ。さっそく使わせていただこう。感謝感謝。


他にも、ssh-agentと組み合わせて利用する便利なツールとして、「keychain」というツールがあるようだ。

keychain はログインセッションごとに ssh-agent プロセスを使うのではなく、システムごとにひとつの ssh-agent プロセスを使うので秘密鍵を登録する際パスフレーズの入力は起動した時のログイン時の一回で済む。ssh-agent + ssh-add の場合だとログアウトすると ssh-agent は生きているのですが、ssh-add で登録したパスフレーズは消えてしまいます。keychain に登録しておけば、ログアウトしてもパスフレーズが残った状態なのです。
ssh-agent & keychain の勉強 : Hasta Pronto.org

先ほど.bash_profileに追記した機能と同じような機能を実現するようだ。

こちらは、また後ほど余裕がある時にでも試してみたい。