[Route 153]

SSH 関係の tips

ssh-agent な認証

Unix を使う人ならほとんど誰でも、 ssh を使って他のマシンにログインしたり、 scp でファイルを転送したりするわけですが、 いちいちパスワードを入れるのが非常に面倒だったりするわけです。

大昔は、~/.rhosts とかに、マシン名とユーザ名を書いておくと、 rsh や rlogin でパスワードを聞かれずに操作ができて、 非常に便利だったのですが、r 系のコマンドはセキュリティ的に、 最近では使わないのが無難です。 SSH では、これに似た (しかも安全な) 仕掛けとして、 パスフレーズを使った認証方式が用意されています。 パスフレーズ (パスワードのように短いものではなく、 数十文字程度の秘密の文) に対応する秘密鍵・公開鍵を利用して、 ユーザ認証を行います。

これを使うと、ログインが楽ちんなのは言うまでもなく、 scp だとか ssh 経由の rsync とかが、あらゆる簡単になります。 便利なので、ぜひ使いましょう。

まず鍵を作る

SSH2 では RSA 鍵か、DSA 鍵を使います (SSH1 では RSA1 ですが、 もう使ってる人はきっといないでしょう)。ssh-keygen -t dsa とかすると、DSA 鍵を作れます。-t rsa なら RSA 鍵です。 どちらも、しばらく待たされたあとでまずファイル名を聞かれますが、 これはデフォルトのままで OK です。続いて、 パスフレーズの入力を2度求められます。

% ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/yasu/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/yasu/.ssh/id_dsa.
Your public key has been saved in /home/yasu/.ssh/id_dsa.pub.
The key fingerprint is:
f3:32:88:f9:1a:7c:2a:6d:71:15:7a:e3:f5:47:72:9f

パスフレーズを入力すると、~/.ssh/ 以下に秘密鍵と公開鍵のファイルが作られます。 .pub で終わるファイル名のほうが、公開鍵ですので注意してください。

鍵を配る

パスフレーズ認証でログインしたいホストには、 あらかじめ公開鍵を置いておく必要があります。SSH2 の公開鍵の一覧は、 ~/.ssh/authorized_keys2に書いておきますので、

% cat .ssh/id_dsa.pub | ssh user@host.to.login 'cat >> .ssh/authorized_keys2'

のようにして、 公開鍵をログイン先のホストの鍵ファイルに追加します。 ~/.ssh/authorized_keys2 には、いくつでも鍵を書くことができるので、 他のホストで作った鍵を必要なだけ列挙しておくことができます。

さて、鍵を転送したら、ログインしてみます。 普段パスワードをきかれるところで、 次のようにパスフレーズの入力を求められれば OK です。

% ssh user@host.to.login
Enter passphrase for key '/home/xxx/xxx/.ssh/id_dsa':

ssh-agent を起動

パスフレーズは長いので、いちいち入力するのはやたら面倒なのですが、 ssh-agent を使うと、これにパスフレーズを覚えさせて、 ログイン時の認証を自動化することができます。

この場合に、ssh-agent を使った認証を無条件に行えるようでは、 非常にセキュリティリスクが高いため、ssh-agent を利用した認証は ssh-agent の子プロセスに限られる ことになっています。こう書くと、なんだか難しそうですが、 要するに

% ssh-agent xinit

とかすれば、X window の上で動くすべてのターミナルから、 ssh-agent を使った認証を行うことができます。xinit を、 'ssh-agent xinit' に alias してしまってもよいですし、 ~/.xinitrc から呼ばれる偉いプロセス (ウィンドウマネージャとか) を、ssh-agent fvwm2 みたいに起動してもよいでしょう。

ssh-add する

ssh-agent にパスフレーズを覚えさせてやると、 いよいよパスフレーズ認証が可能になります。 これをするためのコマンドが ssh-add で、

% ssh-add ~/.ssh/id_dsa

のように、秘密鍵ファイルを指定すると、

Enter passphrase for /home/yasu/.ssh/id_dsa:

のようにパスフレーズを聞かれます。ここで、 正しくパスフレーズを入力すれば OK、間違っていた場合は、 正しく入力できるまでパスフレーズの入力を求められます。

いちど ssh-add でパスフレーズを入力すると、 その後は ssh でログインする際に、 パスフレーズの入力をする必要がなくなります。scp などを使う場合に、 非常に便利です。

そのほか

ssh-agent による認証を行うためには、ログイン先の sshd で、 RSAAuthentication が許可されている必要があります (デフォルトでは許可されているはず)。sshd の設定は、 /etc/ssh/sshd_config (古い設定だと /etc/sshd_config かも) などに書いてありますので、確認してください。

ssh-agent による認証でログインしたその先から、 さらに同じ鍵を使って認証を行う場合には、 ログイン元の ssh の設定で、ForwardAgent が許可されている必要があります。これも、/etc/ssh/ssh_config などを確認してください。 ssh のクライアントに関するシステム的な設定は、 ~/.ssh/config に ForwardAgent yes のようにオプションを書くか、ssh -A のようにコマンドラインオプションをつけて起動することで、 オーバーライドすることが可能です。

Yasunori Osana
Last modified at: