SSHでは初回接続時に接続先ホストの公開鍵を保存しておき、次回接続時にホスト鍵を比較して前回と同じホストに接続したかを確認するような仕組みになっています。そのため、IPアドレスの振り直しやOS再インストールなどでホスト鍵が変わってしまった場合、次のようなエラーメッセージが出てSSH接続が失敗してしまいます。
$ ssh example.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Please contact your system administrator.
Add correct host key in /Users/hnw/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/hnw/.ssh/known_hosts:133
RSA host key for example.com has changed and you have requested strict checking.
Host key verification failed.
この仕組みは中間者攻撃への対策として有用ですが、鍵の変更が意図通りであるような場合は大きなお世話だったりするわけです。
コマンド一発でknown_hosts
ファイルからホスト鍵を削除する
上記エラーへの対処としては$HOME/.ssh/known_hosts
の該当行を削除すれば同じエラーは出なくなります。これはエディタで削除してもいいのですが、下記のようにssh-keygen
コマンドの-R
オプションで消すこともできます。
$ ssh-keygen -R example.com
# Host example.com found: line 133 type RSA
/Users/hnw/.ssh/known_hosts updated.
Original contents retained as /Users/hnw/.ssh/known_hosts.old
エディタでファイルを開いて該当行を探して…とやっていると案外時間がかかるので、コマンドライン一発で消せるのは便利です。
次のような形式でホスト名に加えてポート番号を指定することもできます。[]
はシェルのワイルドカード文字ですので、クォーティングは必須です。
$ ssh-keygen -R '[example.com]:10022'
何度もSSH鍵の変更が起こるような場合
OSインストールを繰り返しているなどの理由で、特定ホストのホスト鍵が毎回変わるような状況では、上記コマンドを打つのさえ面倒だったりします。そのような場合は次のように$HOME/.ssh/config
の設定でホスト鍵のチェックを無効化することができます。
Host 192.168.1.1
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
言うまでもありませんが、全ホストに対してこの設定を行うと中間者攻撃に対して脆弱になります。必要なときだけ特定ホストのみ設定すべきでしょう。