初回接続確認(ホスト鍵検証 TOFU)| SSH
初回接続確認(ホスト鍵検証1)についてまとめています。
SSH でリモートホストへ接続すると、SSH サーバーはクライアントへ ホスト鍵(Host Key) を送信します。
初回接続時にホスト鍵が受け入れられると、通常は known_hosts に保存されます。
[!NOTE] どの
known_hostsを使用するかは SSH の設定によります。一般的にはユーザーごとの
~/.ssh/known_hostsが使用されますが、システム全体の/etc/ssh/ssh_known_hostsを使用する場合もあります。
known_hosts の役割
known_hosts は接続先ホストのホスト鍵を保存するファイルです。
例えば、次のような形式で保存されます。
example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...
1 行は「ホスト名・鍵の種類・ホスト鍵」で構成されています。
接続履歴のあるリモートホスト
2 回目以降の接続では、SSH は接続先から受け取ったホスト鍵と known_hosts に保存済みのホスト鍵を比較します。
一致すれば同じサーバーであることを確認し、そのまま接続を続行します。
この仕組みにより、中間者(MITM)攻撃を検知できます。
新規に接続するリモートホスト
known_hosts にホスト鍵が登録されていない場合は、ホスト鍵を受け入れるか確認するプロンプトが表示されます。
The authenticity of host 'server1.example.com (198.51.100.172)' can't be established.
ED25519 key fingerprint is SHA256:i45KP8BeY5c6nO87hjUrqo1fXsGgQkCpA5dHchXBWbk.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
出典: Oracle OpenSSH ドキュメント https://docs.oracle.com/cd/F61410_01/openssh/openssh-WorkingWithknownhosts.html
ここでホスト鍵を受け入れると、通常は known_hosts に保存されます。
[!NOTE] SSH サーバーはホスト鍵そのものを送信しますが、人間には判別しづらいため、プロンプトにはホスト鍵を短く表現した フィンガープリント が表示されます。
可能であれば、事前にサーバー管理者から受け取ったフィンガープリントと一致することを確認してから受け入れることを推奨します。
[!IMPORTANT]
known_hostsにホスト鍵が登録済み(2 回目以降)の場合は、通常は確認プロンプトは表示されず、自動的に接続が開始されます。
CI(CircleCI など)で入力待ちになる原因
CircleCI などの CI 環境で SSH 接続時に入力待ちになってハングする原因は、known_hosts に接続先(例: github.com)のホスト鍵が登録されていないケースが多くあります。
The authenticity of host 'github.com' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
対話入力できない環境では、事前に known_hosts を準備しておくことで回避できます。
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
ホスト鍵が変わると、SSH は保存済みのホスト鍵と一致しないことを検知し、接続を拒否します。
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
出典: Oracle OpenSSH ドキュメント https://docs.oracle.com/cd/F61410_01/openssh/openssh-WorkingWithknownhosts.html
これは次のような場合に発生します。
- 中間者(MITM)攻撃によって別のサーバーへ誘導されている
- サーバーを再構築し、ホスト鍵が新しくなった
- クラウド環境(EC2 など)でインスタンスを作り直し、ホスト鍵が変わった
補足
IP アドレスが変わっただけでは通常この警告は発生しません。
発生する原因は ホスト鍵が変わったこと です。
対処方法
サーバーのホスト鍵が正しく更新されたことを確認できた場合は、古いエントリを削除します。
ssh-keygen -R example.com
その後、再度接続して新しいホスト鍵を登録します。
ssh example.com
Warning: Permanently added …
新しい接続先が既存のホスト鍵と一致する場合は、次のメッセージが表示されることがあります。
Warning: Permanently added 'example.com,192.0.2.50' (ED25519) to the list of known hosts.
これは、新しい接続先が同じホスト鍵を引き継いでいるため、known_hosts に正常に登録されたことを示しています。
-
専門用語では TOFU(Trust On First Use / 初回利用時の信頼) と呼ばれます。 ↩