sshでリモートログインする際のエラーの対処方法とは

sshでリモートログインする際に、以下のエラーになってしまう場合の対処方法を紹介します。

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 ED25519 key sent by the remote host is
SHA256:<省略>.
Please contact your system administrator.
Add correct host key in C:\\Users\\win/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in C:\\Users\\win/.ssh/known_hosts:11
Host key for 192.168.1.17 has changed and you have requested strict checking.
Host key verification failed.

エラーになる原因とは

サーバーが複数台あり、DHCPでIPアドレスが割り当てられる場合等で、上記のエラーが発生することがあります。

SSHでは、ホストキーの検証を行うことで、接続先のサーバーが本物であることを確認しています。ホストキーは、サーバーが自己紹介するために使用される公開鍵です。クライアントは、初めての接続先のサーバーから受信したホストキーを自分のキャッシュ(クライアント内に定められたファイルの中)に保存し、次回接続時にそのホストキーが変更されていないかどうかを確認します。これにより、中間者攻撃などの攻撃を防ぐことができます。
中間者とは、接続先のサーバーに成り代わってクライアントと接続し、情報を盗み出そうとする悪意のある攻撃者です。

初めて接続するサーバーの場合、クライアントから接続先を信頼して、ホストキーを自動的に受け入れるかどうか尋ねられます。
実行例が下です。1行目でSSHで接続しています。その後、5行目で入力が促されています。

PS C:\Users\win\.ssh> ssh apple@<略>
The authenticity of host '<略>(<略>)' can't be established.
ED25519 key fingerprint is SHA256:<略>.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

ざっくりの訳:「あなたが接続しようとしている相手は信頼できません。相手はこれまでに接続したことのないサーバーです。接続してもいいですか?」

ここで”yes”を入力すると、クライアントはユーザーによる承認を得たものと判断して、キャッシュにホストキーを追加し、ログインに移行します。
次回から同じサーバーにログインする際は、サーバーから送られた情報と、キャッシュを比較して、相手サーバーの真正性を確かめるわけです。

ところが、SSHでリモートログインする際に、DHCPでIPアドレスが動的に割り当てられるサーバーの場合、接続時にこのエラーが発生することがあります。その理由はDHCPの場合、以前別のサーバーに割り当てられていたIPアドレスが、接続先のサーバに割り当てられることがあるからです。この場合、ホストキーの検証でエラーが発生します。

エラーを解決する方法とは

このエラーを解決するためには、以下の方法があります。
なお、ここではWindows 11がクライアントの場合で説明しますが、UnixやLinuxでも考え方は全く同じです。

まず最初に紹介するのは、ssh-keygen -R コマンドを使用して、以前のサーバー接続時にキャッシュに書き込んだホストキーを削除する方法です。
以下はWindowsクライアントの「ターミナル」で実行されているPowerShellからのコマンド実行例です。
PS C:\Users\win.ssh> までがプロンプトです。
ssh-keygen -R <IPアドレス>で、キャッシュから削除するサーバのIPアドレスを指定します。
結果、キャッシュ(known_hostsファイル)から3行削除して保存されたことがわかります。

PS C:\Users\win\.ssh> ssh-keygen -R 192.168.1.17
# Host 192.168.1.17 found: line 11
# Host 192.168.1.17 found: line 12
# Host 192.168.1.17 found: line 13
C:\Users\win/.ssh/known_hosts updated.
Original contents retained as C:\Users\win/.ssh/known_hosts.old
PS C:\Users\win\.ssh>

上記の処置だけだと、またIPアドレスが変わるとエラーが再発します。
これを避けるためには、~/.ssh/configファイルに、ホストキーの検証を無効にする設定(下)を記述します。もし、configファイルがない場合は、新規で作成します。
ただし、企業などではこの設定はNGです。セキュリティリスクを考慮の上、実験や検証環境等でリスクよりも利便性確保が優先される場合のみ、この方法を検討ください。

Host *
    StrictHostKeyChecking no

上記設定を行った後のSSH実行例です。
これでサーバに対して、信頼性のチェックを行わなくなり、エラーが抑止されます。

PS C:\Users\win\.ssh> ssh apple@192.168.1.17
Warning: Permanently added '192.168.1.17' (ED25519) to the list of known hosts.
(apple@192.168.1.17) Password:
Last login: Tue Oct 31 14:04:48 2023 from 192.168.1.15
apple@appurunoiMac ~ %

さいごに

上で紹介した方法は、セキュリティが脆弱になる危険な方法なので、接続相手が安全であることが保障されている場合にのみ、適用するようにしてください。