AWS

【AWS】EC2にSSH接続時の”WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!” 対応

以前接続したことのあるEC2インスタンスに改めてSSH接続しようとすると、エラーが出て困ったのでその対応をメモ。併せて、SSHに関して学んだことも少し記載しておく。

状況とエラー内容

下記コマンドにてSSH接続を試みた。エラーメッセージを含めて掲載。

$ ssh ec2-user@zXXX.XXX.XXX.XXX -i ~/.ssh/XXXXX.pem
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 ECDSA key sent by the remote host is
SHA256:XXXXXXXXXXXX
Please contact your system administrator.
Add correct host key in /Users/username/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/username/.ssh/known_hosts:20
ECDSA host key for XXX.XXX.XXX.XXX has changed and you have requested strict checking.
Host key verification failed.




端的に言うと、ローカル(クライアント)側のknown_hosts に登録されているものと、接続先(remote host)のsshd の認証鍵が変わっているために、中間者攻撃の可能性があるとみなされて、怒られている状況。

対応方法

エラーメッセージから、known_hosts の20行目に原因があることがわかります。従って、該当部分を削除して改めて接続すればいいのですが、手動でknown_hosts を編集する必要はなく、コマンド操作「ssh-keygen -R hostname」で対応が可能。

実行コマンドとその結果

# known_hostsファイルからXXX.XXX.XXX.XXXに属する鍵を全て取り除く
$ ssh-keygen -R XXX.XXX.XXX.XXX
# Host XXX.XXX.XXX.XXX found: line 20
/Users/username/.ssh/known_hosts updated.
Original contents retained as /Users/username/.ssh/known_hosts.old

SSHについてメモ

SSH(Secure SHell)は、暗号や認証を使って通信を行うためのプロトコル

ssh-keygen コマンド

秘密鍵と公開鍵の鍵ペアを作成することができるコマンド。

オプションをつけることにより、作成した鍵の情報を出力したりすることもできる。

ssh-keygen の主なオプションは以下。

オプション|意味
-1 | 鍵ファイルをSSH1からSSH2の形式に変換する
-C | 鍵のコメントを新規作成する
-b | 鍵の長さを指定する(最低値は768bit、初期値は2048bit)
-c | 鍵のコメントを指定する
-f | ファイルを指定する
-i | 鍵ファイルの情報を表示する
-l | 公開鍵の情報(種別、指紋、コメントなど)を確認する
-p | 秘密鍵のパスフレーズを変更する
-t | 鍵タイプを指定する(rsa/dsa)

ssh-keygen の「known_host関連の」主なオプションは以下。

オプション | 意味
-F ホスト名 | 指定したホスト名を、鍵ファイルとともに保存されている「known_hosts」ファイルから探して表示する(-fオプションでknown_hostsファイルを指定可能、-lオプションで対応する指紋を表示可能)
-H | 「known_hosts」ファイルを更新する(-fオプションでknown_hostsファイルを指定可能、元のファイルは拡張子.oldで保存される)
-R ホスト名 | 指定したホストに属する鍵を全て取り除く(-fオプションでknown_hostsファイルを指定可能)
-r ホスト名 | 指定したホストに対応する指紋を表示する(-fオプションでknown_hostsファイルを指定可能)





コマンドサンプル

# ~/.ssh/known_hosts内の鍵一覧を表示する
$ ssh-keygen -l -f ~/.ssh/known_hosts
​
# 任意の鍵ファイルの情報を表示する
$ $ ssh-keygen -l -f ~/.ssh/XXXXX.pem




余談

SSHについて調べている中で面白い記事を見つけたのでシェア。

・GitHubユーザーのSSH鍵6万個を調べてみた