LoginSignup
43
32

known_hosts の鍵が変わっていた場合に自動的に削除して接続するsshコマンド拡張

Last updated at Posted at 2024-01-11

はじめに

接続したことのあるホストの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/configStrictHostKeyChecking 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 を入力する判断をするほうが好ましいと考えます。

43
32
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
32