エラーメッセージ
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
別の表記
- IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
- Offending ED25519 key in /root/.ssh/known_hosts:1
`@` 文字の行で囲まれたブロックとして出力され、その後に新しい鍵のフィンガープリント、問題のある known_hosts の行、「Host key verification failed.」が続きます。
OpenSSH client — host key differs from the one recorded in known_hosts
このエラーの意味
サーバーが提示したホスト鍵が、`known_hosts` にこのホスト名またはアドレスで記録されているものと異なります。ssh は正当な変更(再インストール、同じ IP の背後にある新しいマシン)と接続の傍受を区別できないため、バッチモードでは続行を拒否し、それ以外の場合はパスワード認証とキーボードインタラクティブ認証を無効にします。「Offending … key in …:N」の行で、古い鍵がある known_hosts の行がわかります。
発生する理由
サーバーが再構築された
よくある再インストール、イメージからの再デプロイ、起動時にホスト鍵を生成するコンテナーでは、同じ名前のまま新しいホスト鍵が作成されます。
アドレスが別のマシンのものになっている
よくあるクラウドの IP アドレスや DHCP のリースは再利用されます。IP で記録されたエントリには、以前のマシンの鍵が残ったままです。
1 つの名前の背後に鍵の異なる複数のホストがある
ときどきホスト鍵を共有していない複数のサーバーの前段にラウンドロビン DNS や TCP ロードバランサーがあると、警告がランダムに表示されます。
通信の間に誰かが入り込んでいる
まれまれですが、このチェックはまさにこのためにあります。侵害されたネットワーク、悪意のある Wi-Fi、DNS の乗っ取りが、独自の鍵で応答しているケースです。受け入れる前に検証してください。
修正方法
- 1.
新しい鍵を検証してからエントリを置き換える
新しいフィンガープリントを、信頼できる情報源のものと比較してください。そのうえで初めて、`ssh-keygen -R` で古い行を削除します(名前と IP の両方で)。
bash # 1. Get the new fingerprint from a trusted channel (cloud console, provisioning logs, the admin) ssh-keyscan -t ed25519 server.example.com 2>/dev/null | ssh-keygen -lf - # 2. Only if it matches: remove the old entry and connect again ssh-keygen -R server.example.com ssh-keygen -R 203.0.113.10 - 2.
多数のサーバーには SSH ホスト証明書を使う
ホスト CA を信頼するクライアントは、新しい鍵がその CA によって署名されていれば、再構築されたサーバーをホストごとのピンニングなしで受け入れます。
text # known_hosts: trust host keys signed by your SSH CA instead of pinning each key @cert-authority *.internal.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ssh-host-ca