Q. SSH プロトコル 1 の RSA 公開鍵暗号を使った認証で ssh(1) を運用したいの
ですが、どうしたらよいでしょうか?
A. サーバ側の設定は終っているものとして説明します。FreeBSD の場合、
/etc/rc.conf に
sshd_enable="YES"
という設定をいれておけば SSH1 の RSA 認証が使えます。
まずローカルホストで ssh-keygen(1) を実行し、認証鍵を作成します。
この際に秘密鍵を保護するためのパスフレーズが尋ねられます。
パスフレーズは自由に決められ、バージョンによってはパスフレーズなしでも
運用が可能ですが、他人が推測しにくく、できるだけ長いもの
(数十文字でも構いません。)にしましょう。
% ssh-keygen
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/user/.ssh/identity): (リターン)
Enter passphrase (empty for no passphrase): (パスフレーズを入力)
Enter same passphrase again: (再度同じパスフレーズを入力)
Your identification has been saved in /home/user/.ssh/identity.
Your public key has been saved in /home/user/.ssh/identity.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@local
これで秘密鍵が ~/.ssh/identity に、公開鍵が ~/.ssh/identity.pub に
保存されます(上記実行例は OpenSSH 2.9 ベースのもの、4.3-RELEASE
などでは、OpenSSH 2.3 ベースなので多少出力は異なります)。
また、OpenSSH 2.9 ベースの FreeBSD なら、タイプを指定して
% ssh-keygen -t rsa1
でも可能です。
次に slogin(1) ないしは ssh(1) でリモートホストにログインし、
相手先の ~/.ssh/authorized_keys に公開鍵 (ローカルにできた
~/.ssh/identity.pub) の内容をそのままコピーし追加します。
このとき、公開鍵一つにつき一行なので、余計な改行や空白を入れないよ
うに注意します。もし ~/.ssh/authorized_keys がなければ新規作成しま
す。理論上はこれは公開鍵なので人に見られても構いませんし、事実
ssh-keygen(1) の man page にもそのような記述がありますが、念のため
% chmod 600 ~/.ssh/authorized_keys
とパーミッションは落としておいたほうが無難です。
再度、ローカルから
% slogin remote.hoge.ac.jp -l username
とします。すると、今度は
username@remote.hoge.ac.jp's password:
でなく、
Enter passphrase for RSA key 'username@local.hoge.ac.jp':
と表示されるはずです。ここでパスフレーズを入力するとログインできます。
ここでは相手側の /etc/master.passwd のパスワードエントリは *全く* 参照
されていません。パスワードとパスフレーズは全くの別物です。
また、パスフレーズも秘密鍵もいずれもネットワークを介してやりとりさ
れていません。原理だけ説明すると、接続先の sshd(8) で生成した乱数を
~/.ssh/authorized_keys に入れておいた公開鍵で encrypt してクライアン
トに送り、クライアントはこれを秘密鍵で decrypt して sshd に返します。
sshd はかえって来たものが最初に送った乱数と一致していればログインを
許可しているだけです。
まとめると、ホスト A、B、C があり、ホスト A から ホスト B、C に
SSH プロトコル 1 の RSA 認証を行う場合は、
- ホスト A で ssh-keygen
- ホスト A の ~/.ssh/identity.pub を ホスト B とホスト C の
~/.ssh/authorized_keys にコピーし、chmod 600。
とします。さらに ホスト B から ホスト C に RSA 認証を行いたいなら
- ホスト B で ssh-keygen
- ホスト B の ~/.ssh/identity.pub を ホスト C の
~/.ssh/authorized_keys に追加。
となります。つまりホスト C の ~/.ssh/authorized_keys には
ホスト A とホスト B 両方の公開鍵 (identity.pub) が入っているわけです。
パスフレーズ以外では、ssh・scp・slogin の使い方は rsh・rcp・rlogin と
ほぼ同じです。
[管理番号 1576] rsh・rlogin・rcp って何ですか。
を参考にして下さい。
毎回パスフレーズを入力しなくてもすむ方法については [管理番号 1578] で、
より便利な ssh の機能については [管理番号 1579] で解説しています。
グループ名: ssh