風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

CentOS 6.5 導入時のメモ(続き:SSH関連設定)

SSHバージョン2 で公開鍵認証を使う場合のポイント

  • 秘密鍵・公開鍵のペアを作成(Linux: ssh-keygen, Windows: PuTTyGen 等)
  • 秘密鍵はクライアント側、公開鍵はサーバ側でそれぞれ使用
  • 鍵の受け渡しには経路上で盗まれないように十分注意(物理メディアを使用して受け渡す等。また、鍵作成はクライアント側で実施し、公開鍵のみをサーバ側に移す方が比較的安全かも)
  • 鍵の管理に注意(特に秘密鍵にはパスフレーズ及び適切なパーミッションの設定(600)を行う等)
  • (自分で管理しているホストの場合は)公開鍵認証の設定が終わったら、サーバ側でパスワード認証を無効化しておく

参照:

鍵交換方式による認証

PuTTY を SSH クライアントとして使う場合は…

わかりやすい記事がたくさんあるので、探して適宜設定のこと。
参照例:

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 オプションで指定