はじめに
接続したことのあるホストのIPアドレスが変わってしまった時などに、以下のような警告が出ます。
※よくあるケースだと思いますが、ECS on EC2 で運用していると、EC2ホストの更新をした際に毎回この警告が出る状態になります。
$ ssh example.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Please contact your system administrator.
Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/user/.ssh/known_hosts:1
RSA host key for example.com has changed and you have requested strict checking.
Host key verification failed.
この警告を解除するためには、 $HOME/.ssh/known_hosts
の該当の行の鍵情報を削除するか、 $HOME/.ssh/config
に StrictHostKeyChecking no
の設定をする必要があります。
毎回、$HOME/.ssh/known_hosts
の該当の行の鍵情報を削除するのも手間ですし、 StrictHostKeyChecking no
を設定すると接続はできますが接続時にwarningが出るのが煩わしいというのがあります。
利用における注意
本ツールは運用におけるちょっとした手間を省略できる反面、中間者攻撃をされていることに気づかなくなるリスクがありますので、十分ご注意ください。
$HOME/.ssh/known_hosts 該当行の削除
そこで、通常のssh 実行時に、 $HOME/.ssh/known_hosts 該当行を削除するようにしました。
以下の要領で利用可能になります。
$ git clone https://github.com/koda-h/ssh_known_host_delete
$ cd ssh_known_host_delete
## $HOME/bin/ssh を配置しに行きます。 $HOME/binにPATHを通します。
$ ./setup.sh
## PATH更新(zsh利用の場合)
$ source ~/.zshrc
## PATH更新(bash利用の場合)
$ source ~/.bashrc
ssh コマンド実行時、ログをファイル出力しておき、 known_host のエラーが出た場合は ssh-keygen -R
を実行して、 $HOME/.ssh/known_hosts
の該当のホストの鍵を削除します。
#!/bin/bash
export PATH=$PATH:$HOME/bin
TMP_FILE=$(mktemp)
/usr/bin/ssh $* 2> $TMP_FILE
RET=$?
if [ "$RET" = "255" ]; then
DELETE_HOST=$(grep "Host key for" $TMP_FILE |awk '{print $4}')
if [ -n "$DELETE_HOST" ]; then
echo "REMOTE HOST IDENTIFICATION HAS CHANGED! DELETE HOST KEY FROM ~/.ssh/known_hosts"
ssh-keygen -R $DELETE_HOST
/usr/bin/ssh $*
fi
fi
rm $TMP_FILE
利用方法
/usr/bin/ssh
ではなく $HOME/bin/ssh
を実行するように設定されたので、
通常通り、 ssh example.com
のようにssh実行します。
実行時に $HOME/.ssh/known_hosts
の鍵情報が削除された場合はこのように出力されます。
$ ssh example.com
REMOTE HOST IDENTIFICATION HAS CHANGED! DELETE HOST KEY FROM ~/.ssh/known_hosts
# Host example.com found: line 312
# Host example.com found: line 313
/Users/user/.ssh/known_hosts updated.
Original contents retained as /Users/user/.ssh/known_hosts.old
The authenticity of host 'example.com (<no hostip for proxy command>)' 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])?
最後の
Are you sure you want to continue connecting (yes/no/[fingerprint])?
で yes
を入力することで、接続できます。
※この部分も自動的に yes
として勝手に接続されるようにすることも可能ですが、意図しない変更があることの可能性も考え、手動で yes
を入力する判断をするほうが好ましいと考えます。