SSHバージョン2 で公開鍵認証を使う場合のポイント
- 秘密鍵・公開鍵のペアを作成(Linux: ssh-keygen, Windows: PuTTyGen 等)
- 秘密鍵はクライアント側、公開鍵はサーバ側でそれぞれ使用
- 鍵の受け渡しには経路上で盗まれないように十分注意(物理メディアを使用して受け渡す等。また、鍵作成はクライアント側で実施し、公開鍵のみをサーバ側に移す方が比較的安全かも)
- 鍵の管理に注意(特に秘密鍵にはパスフレーズ及び適切なパーミッションの設定(600)を行う等)
- (自分で管理しているホストの場合は)公開鍵認証の設定が終わったら、サーバ側でパスワード認証を無効化しておく
参照:
PuTTY を SSH クライアントとして使う場合は…
わかりやすい記事がたくさんあるので、探して適宜設定のこと。
参照例:
特記事項として、PuTTY で作成された公開鍵(下記例では id_rsa.pub.putty)は、OpenSSH 互換形式へと変換後に、サーバに登録する必要がある。
この変換には、ssh-keygen コマンドのオプション -if(-i -fと等価)を使用する。
$ ssh-keygen -if id_rsa.pub.putty >> ~/.ssh/authorized_keys
Linux(Unix系OS)同士で SSH ログインを行う場合
以下の例では、便宜上、
- SSHクライアント側: myname@myhost
- SSHサーバ側: user@myserver
としている。
クライアント側で RSAキーペア(秘密鍵・公開鍵のペア)作成
[myname@myhost ~]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/myname/.ssh/id_rsa): Enter passphrase (empty for no passphrase): :
デフォルトでは、
- 秘密鍵: ~/.ssh/id_rsa
- 公開鍵: ~/.ssh/id_rsa.pub
としてそれぞれ作成される。
また、パスフレーズ(passphrase)は、クライアント側で秘密鍵を使用する際に確認されるもので、セキュリティをより高めるため、なるべく設定しておくこと(空にすると無効となるが、推奨されない)。
サーバ側で公開鍵を登録
~/.ssh/authorized_keys ファイルに、公開鍵を追加する。
例では、あらかじめなんらかの手段でサーバ側の ~/ にクライアントで作成した公開鍵(id_rsa.pub)が転送されていることを想定。
[user@myserver ~]$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys [user@myserver ~]$ rm ~/id_rsa.pub
クライアントからサーバへのSSHログイン確認
[myname@myhost ~]$ ssh user@myserver Enter passphrase for key '/home/myname/.ssh/id_rsa': Last login: Xxx Xxx x xx:xx:xx XXXX from myhost [user@myserver ~]$
- 使用する秘密鍵(id_rsa)*1のパスフレーズを尋ねられること
- サーバ側のユーザパスワードは尋ねられないこと
をそれぞれ確認。
サーバでパスワード認証を無効化
[root@myserver ~]# vi /etc/ssh/sshd_config
PasswordAuthentication yes
を探し、
PasswordAuthentication no
に変更し、sshd を再起動。
[root@myserver ~]# service sshd restart
リモート接続時の RSA key fingerprint の確認について
特定のサーバに初めて SSH 接続する場合には、
[myname@myhost ~]$ ssh user@myserver The authenticity of host 'myserver (xxx.xxx.xxx.xxx)' can't be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)?
のように、RSA key fingerprint 尋ねられる。
これは、サーバ側の指紋であり、接続しようとしているサーバが正しいかどうか(なりすましではないか)をユーザが判断するためのものであるが、肝心の当該サーバの RSA key fingerprint を知らないと照合しようがない。
RSA key fingerprint 確認方法
自分が管理しているサーバであれば、ssh-keygen コマンドを -lf オプション付で実行すれば、RSA key fingerprint を確認できる。
[user@myserver ~]$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /etc/ssh/ssh_host_rsa_key.pub
ssh_host_rsa_key.pubの場所は、OpenSSHのインストール環境によって異なる場合があるので注意。
それ以外の場合は、当該サーバの管理者に確認する必要がある。
以前のリモート接続時からサーバ側の環境が変わった場合
サーバ側の環境が変わったりした場合、SSH 接続をしようとしたとき、
[myname@myhost ~]$ ssh user@myserver @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! :
のように WARNING が表示されて接続できないことがある。
成りすましのサーバへと接続されている可能性もあるため、サーバ管理者に確認を行う等、十分注意すること。
known_hosts より特定ホスト(SSHサーバ)を削除
サーバ側の環境が変わったことによる WARNING であったことが確認できた場合は、クライアント側の ~/.ssh/known_hosts より当該サーバの情報を削除してから接続しなおせばよい。
直接 known_hosts を編集することもできるが、ssh-keygen を使った方がベター。
ssh-keygen コマンドで、当該サーバの記述を確認し(-Fオプション)、削除する(-Rオプション)。
[myname@myhost ~]$ ssh-keygen -F myserver # Host myserver found: line x type RSA myserver ssh-rsa ... [myname@myhost ~]$ ssh-keygen -R myserver /home/myname/.ssh/known_hosts updated. Original contents retained as /home/myname/.ssh/known_hosts.old [myname@myhost ~]$ ssh user@myserver The authenticity of host 'myserver (xxx.xxx.xxx.xxx)' can't be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)?
新たに、RSA key fingerprint の確認を求められるので、新しい環境でのサーバの RSA key fingerprint を調べて、照合する。
*1:デフォルト以外の秘密鍵を使用する場合、ssh の -i オプションで指定