[ホスティング] SSHサーバーのホスト認証の仕組みを理解する

初めて接続するホストへssh接続を試みると、以下のようなメッセージが表示される。

OpenSSHではRSA鍵フィンガープリントを使ってホスト認証

OpenSSHでは、なりすまし(中間者攻撃)を防ぐホスト認証においてRSA鍵フィンガープリントが使われる。

入門OpenSSH / 第3章 OpenSSH のしくみ
http://www.unixuser.org/~euske/doc/openssh/book/chap3.html

RSA鍵フィンガープリントはホストのRSA公開鍵がベース

RSA鍵フィンガープリントは、ホストのRSA公開鍵からssh-keygenを使って表示される。

ホストのRSA公開鍵

公開鍵からフィンガプリントを表示

SSHサーバのRSA fingerprintの確認方法 | server-memo.net
http://www.server-memo.net/server-setting/ssh/rsa-fingerprint.html

クライアントはホストのRSA鍵フィンガープリントを記憶

冒頭のメッセージが表示されるのは、これまで接続したことが無いホストへ初めて接続したときである。このメッセージにyesと答えてホスト認証を通過すると、クライアントはホスト名とRSA鍵フィンガープリントのペアを~/.ssh/known_hostsに記録する。以降のアクセスでは、known_hostsに記録されているRSA鍵フィンガープリントと実際のホストが返すRSA鍵フィンガープリントが一致した場合には、そのホストは認証済みであると判断され確認メッセージは表示されない。

SSHの動作 — Fabric ドキュメント
http://fabric-ja.readthedocs.org/ja/latest/usage/ssh.html

RSA鍵フィンガープリントを無視することもできるが・・・

例えばバッチでscpを実行する場合など、確認メッセージに応えなければ先へ進めないのでは困る。sshやscpには、RSA鍵フィンガープリントの変更チェックをしないオプションも用意されている。しかし、無視することでホスト認証が行われないことになり、結果としてなりすまし(中間者攻撃)をチェックできなくなる。これはいただけない。

OpenSSHの警告メッセージを黙らせる | Siguniang’s Blog
https://siguniang.wordpress.com/2014/02/28/get-rid-of-openssh-warning-message/

SCP support for -o StrictHostKeyChecking=no broken | OpenSSH | Dev
http://www.gossamer-threads.com/lists/openssh/dev/54561

known_hostsを適切に維持更新するべき

脆弱性を生まないためには、確認メッセージが邪魔といった程度の理由でホスト認証をスキップしたりしないこと。確認メッセージが表示されること自体がイレギュラーなので、その理由をしっかり究明して適切な設定をするべき。

例えばバッチでscpを実行したい場合には、事前にコマンドを使ってknown_hostsを作っておけばよい。正しいknown_hostsが存在すれば、scp経由で初めてホストにアクセスしたときでも確認メッセージは表示されない。以後もし確認メッセージが表示されることがあれば、本来のホストになりすました別ホストへ本当に誘導されているのかもしれない。ホストの管理者にホストのRSA鍵フィンガープリントが本当に変わったのかを確認するべきだろう。

SSHのknown_hostsをスマートに更新する – Qiita
http://qiita.com/kawaz/items/20983ec286088a1ae5c7

ネットワーク管理の基本Tips:SSHサーバーの公開鍵管理を効率化するには? ssh-keyscanコマンド – @IT
http://www.atmarkit.co.jp/ait/articles/1507/28/news020.html

コマンド実行例

ホストのRSA鍵フィンガープリントを取得してknown_hostsに追加

記録されているRSA鍵フィンガープリントを削除