SSH接続で「REMOTE HOST IDENTIFICATION HAS CHANGED!」と警告が出た時の対処法

こんにちは!インターライフメディアです。
サーバー環境の移行作業後や、久しぶりにGitを使おうとした時など、SSH接続を試みると急に以下のような恐ろしい警告メッセージが表示されて、接続できなくなることがあります。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
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.
...
Host key verification failed.

「man-in-the-middle attack(中間者攻撃)」といった物騒な単語も見えるため、驚いてしまいますよね。
今回は、この「REMOTE HOST IDENTIFICATION HAS CHANGED!」という警告の原因と、安全に解決するための手順を分かりやすく解説します。

なぜこの警告が出るのか?

この警告は、あなたのPC(クライアント)が「以前接続した時と、接続先のサーバー情報(ホストキー)が異なっている」と検知したために表示されます。

SSH接続では、初めて接続するサーバーのホストキーをローカルPCの known_hosts というファイルに記録します。これは「このサーバーは確かに以前接続した安全なサーバーだ」という証拠(指紋のようなもの)を覚えておくためです。

しかし、以下のような場合に、この「証拠」が一致しなくなります。

  • サーバー側でOSの再インストールや移行が行われた。
  • 接続先のサーバーのIPアドレスが変更され、別のサーバーに割り当てられた。
  • (警告文が指摘するように)悪意のある第三者が通信を傍受しようとしている。(中間者攻撃)

Web制作の現場では、サーバー移行やテスト環境の再構築などで、ホストキーが正当な理由で変更されるケースがほとんどです。心当たりがある場合は、PCに保存されている古いホストキー情報を削除・更新すれば解決します。

警告の解決手順 (Macの場合)

解決策は、known_hosts ファイルから、エラーの原因となっている古いホストキー情報を削除することです。
エラーメッセージの中に、削除すべき場所のヒントが書かれています。

Offending RSA key in /Users/xxx/.ssh/known_hosts:61

この例では、「/Users/xxx/.ssh/known_hosts ファイルの 61行目」に古いキーがある、と教えてくれています。(xxx はあなたのユーザー名、61 の行番号は人によって異なります)

手順1: 該当ファイルを見つける

.ssh フォルダは不可視フォルダ(普段は表示されないフォルダ)になっているため、Finderから直接開くのが少し難しいです。
Finderを開いた状態で、メニューバーの「移動」 > 「フォルダへ移動…」(またはショートカットキー Command + Shift + G)を選択してください。

表示された入力欄に、/Users/xxx/.ssh/xxx はご自身のユーザー名)と入力するか、シンプルに ~/.ssh と入力して「移動」をクリックします。

手順2: known_hosts ファイルを編集する

.ssh フォルダ内に known_hosts というファイルがあります。これをお好きなテキストエディタ(Visual Studio Codeや標準のテキストエディットなど)で開きます。

エラーメッセージで指定された行(この例では61行目)に移動し、その行全体を削除してください。行番号が分からない場合でも、ファイル内に記載されているホスト名(例:example.com)を手がかりに探すことができます。

(より簡単な方法:ターミナル操作)
もしターミナルの操作に慣れている場合は、以下のコマンドを実行する方が簡単です。example.com の部分を、接続しようとしたホスト名(またはIPアドレス)に置き換えてください。

ssh-keygen -R example.com

このコマンド一つで、known_hosts ファイルから該当のホストキーを自動的に削除してくれます。

手順3: 再度SSH接続を試みる

古いキーを削除したら、再度SSH接続(またはGitのPULLやFetchなど)を行ってみてください。

今度は「初めて接続するサーバー」として扱われるため、以下のように「本当に接続しますか?(Are you sure you want to continue connecting?)」と尋ねられます。

The authenticity of host 'example.com (192.0.2.1)' can't be established.
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

yes と入力してEnterキーを押すと、新しいホストキーが known_hosts に登録され、無事に接続が完了します。


よくある質問 (FAQ)

Q1: known_hosts ファイルの該当行を削除しても安全ですか?

A1: はい、安全です。known_hosts ファイルは、あくまで「過去に接続したサーバーの記録簿」です。該当行を削除すると、そのサーバーへの接続記録が消えるだけです。次回接続時に新しいホストキーが自動的に再登録されるため、ファイル自体を壊してしまう心配はありません。

Q2: 「中間者攻撃 (man-in-the-middle attack)」の可能性は気にしなくて良いですか?

A2: サーバーの移行や再設定などの「心当たり」が明確にある場合は、中間者攻撃の可能性は極めて低いです。しかし、公共のWi-Fiなど、信頼できないネットワーク環境で、特に何の心当たりもなく突然この警告が出た場合は、通信が傍受されている危険性もゼロではありません。その場合は、すぐに接続を中止し、ネットワーク管理者に相談することをお勧めします。

Q3: known_hosts ファイルが見つかりません。

A3: known_hosts ファイルは、SSH接続を一度も行ったことがないPCには存在しません。もしSSH接続をしたことがあるはずなのに見つからない場合は、.ssh フォルダが不可視(非表示)になっている可能性が高いです。本文の「手順1」で解説したように、Finderの「フォルダへ移動」機能(Command + Shift + G)を使って ~/.ssh と入力し、直接フォルダを開いてみてください。

CONTACT

webサイト制作、デザインに関するご相談、御見積のご依頼など、弊社へのお問い合わせはこちら