理系学生日記

おまえはいつまで学生気分なのか

known_hostsからエントリを消す

定期的に忘れるんだけど、~/.ssh/known_hosts にあるエントリをスクリプトから消すコマンドは、ssh-kengen -R

そもそも known_hosts とは

接続したことのある各ホストの公開鍵を保存しているファイルで、普通の文脈だとユーザレベルのファイルである ~/.ssh/known_hosts を指します。 サーバレベルのファイルとして、/etc/ssh/known_hosts もあります。

よくあるケースでは、ssh ではじめて特定ホストに接続しようとしたときに、エントリが追加されます。 最初に接続するとき以下のようなことを要求され、「このサーバを信頼するか」どうかを判断することになります。

The authenticity of host 'sshsvr (192.168.0.1)' can't be established.
RSA key fingerprint is 28:d2:80:56:a3:3c:bf:5b:58:f6:68:97:7d:7d:68:db.
Are you sure you want to continue connecting (yes/no)? yes

(http://www.turbolinux.co.jp/products/server/11s/user_guide/sshconnect.html より)

ここで信頼する(yes) と答えると、そのサーバの fingerprint が ~/.ssh/known_hosts に追加されます。 ハッシュ化や、証明書のことを考えなければ、だいたい以下のような内容になるはずです。

cvs.example.net,192.0.2.10 ssh-rsa AAAA1234.....=

このエントリは、その後のサーバ認証に使われます。 クライアント(ssh 接続を行っているホスト) が ssh 接続を行おうとする度に、接続先とこれらのエントリのホスト名(正確には、hostnames) が比較され、 合致したエントリの fingerprint と、サーバが提示してくる fingerprint が一致しているかを基準にして、ssh は接続して良いかを判断します。

fingerprint が一致していない場合は、以下のようなおなじみのメッセージを出力して、接続は拒絶されます。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

~/.ssh/known_hosts のエントリを消すユースケース

個人としてのユースケースとしては対象先のサーバをインストールしなおしたとかが多いでしょうし、 サーバのセットアップが自動化された大規模システムにおいては、それらの設定サーバから一時的に ssh 経由でコマンドを投入したい、みたいなケースがあります。

$ vi ~/.ssh/known_hosts でいけるケースは多いんですが、ハッシュ化されているとそういうわけにもいきません。。。

おまえを消す方法

こんなかんじです。はい。

$ ssh-keygen -R 192.168.99.100
# Host 192.168.99.100 found: line 1
/Users/kiririmode/.ssh/known_hosts updated.
Original contents retained as /Users/kiririmode/.ssh/known_hosts.old

参考文献