ある日、Gitでリモートへのプッシュをかけた際にこんなエラーが発生しました。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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. The fingerprint for the RSA key sent by the remote host is SHA256:RGRZ/*********************************************. Please contact your system administrator. Add correct host key in /Users/XXXX/.ssh/known_hosts to get rid of this message. Offending RSA key in /Users/XXXX/.ssh/known_hosts:2 RSA host key for [git.xxxxx.com]:XXXX has changed and you have requested strict checking. Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
数分前までは正常にGitコマンドが使用できていたところ、突然WARNINGなどと仰々しいプリントでエラーが出力されたのでビビり散らかしてしまいました。
今回はGitHubにSSHで接続しているユーザーが、稀にエンカウントするかもしれないタイトルのエラーについて、その原因と対処法をまとめました。
原因
GitHubはセキュリティ上の理由から、不定期でIPアドレスを変更することがあります。
これはGitHubがユーザーのリポジトリやコードなどの重要な情報を保護するために、様々なセキュリティ対策を講じているためです。
IPアドレスの変更は、主にDDoS攻撃などの攻撃からGitHubを保護するための一つの方法です。
IPアドレスを定期的に変更することにより、攻撃者が特定のIPアドレスに対して攻撃を仕掛けることを困難にし、攻撃の影響を軽減することができます。
また、GitHubはクラウドサービスプロバイダー(CSP)からサーバーを借りているおり、そのCSP側がIPアドレスの変更を実施することもあります。
CSP側のIPアドレス変更は、GitHub側から直接制御することができないため、そうした理由からも不定期なIPアドレスの変更につながる場合があります。
これらの前提を踏まえて、今回のエラーが発生した原因は何かというと、SSHで接続するリモートホストの接続先情報、つまりはGitHubのIPアドレスが変更されたことが原因でした。
過去にSSH接続を行った実績のあるリモートホストの接続先情報(公開鍵)はローカルマシンの~/.ssh/known_hosts
に保存されています。
このknown_hostsファイルに保存されているGitHubのIPアドレスと、今接続しようとしているGitHubのIPアドレスとが食い違っているため、中間者攻撃ではありませんか??危険な接続先ではないですか??大丈夫ですか??システム管理者に確認して問題ないようであれば、/Users/XXXX/.ssh/known_hosts内の2行目の接続先に関する情報を見直してくださいねというような旨の警告を出してくれていたということです。
ChatGPT先生曰く
最近はググるよりもChatGPT先生に聞いた方が問題解決が早いので、脳死でエラー文をChatGPTにぶん投げてます。
今回も例に漏れず細かな原因を探る前に、大まかな問題や解決フローを探る意図でこんな感じの質問を投げてみました。
Gitでリモートリポジトリへのプッシュ操作を行った際に「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」 というエラーが発生しました。どのように対処すればいいですか?
余談ですが自分はAIチャットにも敬語で問いかけるタイプの人間。
ChatGPT先生から返ってきた返答は以下の通り。
このエラーメッセージは、SSH経由でリモートホストに接続したことがある場合に表示されます。 このエラーは、SSHで接続しようとするホストの公開鍵が以前と異なることを示しています。 これは、例えばリモートホストが更新された場合や、新しいホストに接続する場合に発生する可能性があります。 この問題を解決するには、以下の手順を実行してください。
対処法1(ChatGPT案)
そしてChatGPTが提案してくれた解決策がこちら。
- まず、警告メッセージに記載されているリモートホストのIPアドレスを確認します。
次に、リモートホストの公開鍵を削除します。これは、リモートホストに接続する前に行う必要があります。以下のコマンドを実行してください。
ssh-keygen -R [リモートホストのIPアドレス]
例えば、IPアドレスが「192.168.0.1」の場合は以下のようになります。
ssh-keygen -R 192.168.0.1
再度接続を試みます。接続時にリモートホストの公開鍵を再び取得し、接続を許可するかどうかを確認するメッセージが表示されます。接続を許可する場合は、「yes」と入力してEnterキーを押します。
ssh [ユーザー名]@[リモートホストのIPアドレス]
接続が成功したら、再度プッシュ操作を行ってください。
以上の手順を実行することで、SSH経由でリモートホストに接続してプッシュ操作を行うことができるようになるはずです。
このようにssh-keygen -R
で指定したIPをキーに持つknowm_hostsファイル内の公開鍵を削除し、再度SSH接続を行うことで公開鍵が再登録されるまでの流れを出力してくれました。
ちなみに1の手順の「リモートホストのIPアドレス」は以下のコマンドで確認することが可能です。
$ sed -n '2p' ~/.ssh/known_hosts
これは第二引数で与えたファイルの第一引数で与えた行数を出力するコマンドで、2p(2行目)という数字がどこから出てきたかというと、冒頭のエラーメッセージの以下の箇所から参照した形です。
Offending RSA key in /Users/XXXX/.ssh/known_hosts:2
3の手順ではsshコマンドによる認証を行なったのちにプッシュ操作を〜と記載されていますが、sshコマンドの実行は省略可能です。
対処法2
今回は以下の方法で実際に解消まで漕ぎ着けました。やってることとしてはChatGPTが出力してくれた解決案を手動で実行しているに過ぎないので、詳細については割愛します。
- エラーメッセージに従い、
~/.ssh/known_hosts
の2行目を削除
vim ~/.ssh/known_hosts
- 展開されたknown_hostsの2行目にカーソルを移動して
dd
:wq
で保存して終了- 再度プッシュ操作を実行
- 以下のように対話式に接続の確認がとられるのでそれぞれに
yes
を入力
The authenticity of host 'github.com (xx.xx.xxx.xxx)' can't be established. ECDSA key fingerprint is SHA256: xxxx Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'github.com' (ECDSA) to the list of known hosts. Warning: the ECDSA host key for 'github.com' differs from the key for the IP address ‘xx.xx.xxx.xxx' Offending key for IP in /Users/xxxx/.ssh/known_hosts:10 Are you sure you want to continue connecting (yes/no)? yes
まとめ
- GitHubはセキュリティ対策の一環として、不定期でIPアドレスの変更を行う
- ローカルに保存されている接続先情報との不一致によりがWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!が発生する
~/.ssh/known_hosts
のエラーメッセージに記載されている行(変更前の接続先情報)を削除し、再度SSH接続を行うことで、リモートホストの接続先情報が更新されてSSH接続が可能となる