OpenSSH は普段から使用しているのでだいぶ使うのに慣れてきたのですが、どうにも毎回サーバーにログインするためにパスフレーズを入力するのは面倒臭いなぁと思い、その辺りを便利にするにはどうしたらいいか調べてみました。
ssh-agent は公開鍵認証のパスフレーズ入力を省略出来るようにするツール。これは OpenSSH をインストールすれば一緒に入っているはずです。これにより、パスフレーズ無しの公開鍵と秘密鍵のペアを作らなくてすみます。(余談ですが、Linux サーバー Hacks にはパスフレーズ無しの技が載ってました)
keychain は bash ベースの ssh-agent フロントエンドで、ログイン間で ssh-agent を再利用したり、任意でユーザがログインする時はいつでもパスフレーズの入力を促したりすることができる。
要点
- ssh-agent を使うとパスフレーズ入力省略出来る。
- ssh-agent を普通に使うだけでは便利性が高くない。
- keychain は ssh-agent をもっと便利にしてくれるツール。
- keychain を導入すればパスフレーズ入力が PC 起動につき一回で済む。
- keychain を使えば複数 ssh-agent を起動する必要がなくなる。
ssh-agent の仕組み
ssh-agent は引数有りで起動と引数無しでの起動と二種類がある。
% ssh-agent bash
% ssh-agent
引数に Shell を渡せば、子プロセスとして Shell が起動される。また Shell が終了すれば認証エージェンシー(ssh-agent)も終了する。安全面ではこちらの方が断然安心出来るとおもわれるが、screen などを使っている場合は毎回 ssh-agent を起動させるとなると面倒になる。
また RedHatLinux9 以上だと ssh-agent がある場合、PC 起動時に ssh-agent が立ち上がり子プロセスとして Shell が起動するようになっているらしい。
僕的にはクライアント側で ssh-agent を起動するのなら子プロセスで Shell を起動しない引数無しの ssh-agent でもいいように思う。なぜならクライアントならほぼ確実に電源を落として PC 自体を終了することになると思うから。子プロセスで shell を起動するのを薦めているわけは、ssh-agent の終了し忘れがあってセキュリティ的に危険だからで、そのような事は立ち上げっぱなしのサーバー側で ssh-agent を使う場合は妥当するけど、立ち上げっぱなしでない確実に終了するクライアントの場合問題はなさそう。クライアントの終了や再起動の際 ssh-agent は終了する。
ssh-agent に秘密鍵をキャッシュさせるには
% ssh-add 秘密鍵の PATH
(enter passphrase)
としてあげないといけない。これをすませば ssh-agent が起動している間は秘密鍵キャッシュされた状態を保つのでサーバーにログインする際にパスフレーズをきかれることはなくなります。しかしあくまでもキャッシュなので ssh-agent が終了すればキャッシュも消滅してしまいます。またログアウトするとキャッシュは消滅します。
引数無しで ssh-agent を起動した際、環境変数 SSH_AUTH_SOCK と SSH_AGENT_PID が設定されます。ssh-agent を起動させた Shell の中ではこの環境変数は有効になりますが、このままだと新たに Shell を起動した場合はこの環境変数が有効になりません。(screen を使った場合とか引き継げない)有効にさせたいのならば
% eval `ssh-agent`
っと eval で評価して起動させれば、今後この ssh-agent を起動した Terminal 内の全ての Shell で環境変数が有効になります。(でも Terminal をもう一枚開いた場合は環境変数を共有することは出来ない)
これを login Shell 起動時に実行される .bash_profile などのスクリプトに書き込めば、login 時に ssh-agent が環境変数を共有して起動されることになるのですが、Shell 起動時に ssh-agent が立ち上がってしまうので、複数 Shell を起動した場合(screenなども含む) ssh-agent も 起動した Shell の数だけ立ち上がってしまうことになります。っということで ssh-agent を起動したいなら一回 eval `ssh-agent` と打ち込む方がよさそうです。ですが、もっといい方法が他にあるのでこの eval で起動もあまりお薦めできません。
起動している ssh-agent を終了させる場合は
% ssh-agent -k
ただしこれで kill 出来るのは環境変数が有効な場合だけで、eval で起動しないとこのコマンドは使えません。具体的に言うと eval 無しで起動した場合の PID は ssh-agent -k で使う SSH_AGENT_PID となぜか一致しないため kill 出来ないでエラーが返ってきます。そのようなプロセスを終了させたい場合は ps で PID を調べて素直に kill PID番号 とするしかありません。
オプション -t で何秒後に接続を解除するか指定出来る。
% ssh-agent -t 3600 #この場合 3600秒 = 1時間
% ssh-add -t 3600 #ssh-add でも秘密鍵をキャッシュしている時間の設定が出来る。
keychain
keychain はログインセッションごとに ssh-agent プロセスを使うのではなく、システムごとにひとつの ssh-agent プロセスを使うので秘密鍵を登録する際パスフレーズの入力は起動した時のログイン時の一回で済む。ssh-agent + ssh-add の場合だとログアウトすると ssh-agent は生きているのですが、ssh-add で登録したパスフレーズは消えてしまいます。keychain に登録しておけば、ログアウトしてもパスフレーズが残った状態なのです。
tar ボールでインストールする場合は Keychain から。MacOSX, FreeBSD, FedoraCore などほとんどのディストリビューションで使えるみたいです。
wget http://dev.gentoo.org/~agriffis/keychain/keychain-2.6.8.tar.bz2
tar xvjf keychain-2.6.8.tar.bz2
cd keychain-2.6.8/
install -m0755 keychain /usr/bin/keychain
っとこんな感じでインストール出来ます。パッケージシステムでもあると思うのでそちらを使えばもっと簡単にインストールできるでしょう。
まず keychainは、実行されると、ssh-agent が実行されているかされていないか確認する。実行されていなかったら ssh-agent を起動してくれる。実行されていたら ssh-agent は立ち上げない。ログイン時に keychain が起動するように profile ファイルに書いておけば ssh-agent を起動するだけの時とは違いセッションを複数起動しても ssh-agent のプロセスは一個で済むことになる。(eval `ssh-agent` でもプロセスは一個だが複数セッションを開くと環境変数を共有出来ない)
また keychain は ssh-agent 起動時に環境変数 SSH_AUTH_SOCK, SSH_AGENT_PID を ~/.keychain/$HOST-sh ファイルに記憶させます。すでに ssh-agent が実行されていても ~/.keychain/$HOST-sh ファイルを使用して適切な環境変数を取得してくれるので問題はないみたいです。
.zlogin とか .bash_profile とかに
/usr/bin/keychain ~/.ssh/id_rsa
source ~/.keychain/$HOST-sh
って書いておけばコンソール起動時に keychain を起動してくれる。初回起動時はこんな感じ
KeyChain 2.6.8; http://www.gentoo.org/proj/en/keychain/
Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL
* Initializing /Users/Ashizawa/.keychain/Ashizawa.local-sh file...
* Initializing /Users/Ashizawa/.keychain/Ashizawa.local-csh file...
* Initializing /Users/Ashizawa/.keychain/Ashizawa.local-fish file...
* Starting ssh-agent
* Adding 1 ssh key(s)...
Enter passphrase for /Users/Ashizawa/.ssh/id_rsa:
二度目以降はこんな感じ。
KeyChain 2.6.8; http://www.gentoo.org/proj/en/keychain/
Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL
* Found existing ssh-agent (589)
* Known ssh key: /Users/Ashizawa/.ssh/id_rsa
なんですが実際は色も付いていてカラフルでかなりかっこいいです。
使用感
これ凄いです、凄すぎます。zsh 使っている場合はサーバー側のフォルダやファイルまで補完出来ちゃってます。確認のため keychain 無しでアクセスしてみましたが、無い場合はキーの場所聞かれたのちパスフレーズ求められるんで頻繁に scp とか使う人は幸せになれそうです。
コメントする