あまり深く考えずにSSHを使っていたら、結構ハマったのでメモ。
1. 前提
筆者の現場では、作業担当者向けに次のような2つのツールを展開しています。
1)Webから指定したサーバーやネットワーク機器の構成情報を取得してSVNに登録(実行ユーザー:apache)
2)月1回、サーバーやネットワーク機器全部の構成情報をバッチで取得してSVNに登録(実行ユーザー:root)
いずれもSSHを使って各機器に接続し、構成情報を取得⇒ローカルファイルに落としてSVN登録する仕組みで、同じシェルを使っています。
2. トラブル内容
ある日突然、バッチ処理で取得していた情報のうち、いくつかの機器で構成情報の取得エラーが出始めます。
それらに共通しているのは、いずれもLinuxやミドルウエアのバージョンアップをした直後の機器ということ。
一方で、Webから該当機器の構成情報を取得しても、特に問題なく取得できてしまいます・・・
調べたところ、バッチ処理ではSSHの接続時にエラーになっているようです。
それにしても、すんごい怒られようですな
> ssh -F (SSHの共通設定ファイル) -o StrictHostKeyChecking=no (user)@(hostid)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eabesdropping 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:・・・・・・・・
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:18
・・・
実のところ、筆者はコテコテのDB屋なのでこの辺あまり明るくなくて。
「設定ファイルを指定して実行してるのに、何でrootのファイルが云々言うてんねん(?_?)」
と頭を抱えておりました・・・
3. 原因
SSHをちょっとでも深く使われたことのある方であれば既にお気づきの通り、エラーの対象が
「Linuxやミドルウエアのバージョンアップをした直後の機器」
というところがポイント。
接続先機器の公開鍵情報が変わってるのに、以前の鍵情報で接続しに行ってたのが原因でした。
で、その公開鍵情報を記録しているファイル(known_hostsファイル)が別途あって、
##### rootのとき #####
/root/.ssh/known_hosts
##### 以外のユーザーの時 #####
/home/(user)/.ssh/known_hosts
と実行ユーザーによって違うので、結果Webとバッチとで挙動が異なっていたのでした。
4.対応
かくして、Webとバッチとで鍵情報を共有するための共通ファイルを使用するようにしました。
上記のような鍵の新旧云々のエラーが発生したときには、都度このファイルから該当鍵の情報を消去してリランする(⇒新しい鍵情報が追加される)運用としました。
> ssh -F (SSHの共通設定ファイル) -o StrictHostKeyChecking=no -O UserKnownHostsFile=(共通のknown_hostsファイル) (user)@(hostid)