こんにちは!インターライフメディアです。
サーバー環境の移行作業後や、久しぶりに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 と入力し、直接フォルダを開いてみてください。