September 4,2007

ssh 登入 load balancer 遇上 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

能不能不要每次都得刪除 known_hosts 的那行 Offending key ,然後再執行 ssh 呢?我所連的 load balancer ,後端對應的不只是一台機器啊!

==
(警語:我對 ssh 機制一知半解,歡迎大家批評指教)

工作的關係,在客戶這邊,我們的系統會連到別的廠商的系統,執行給定的指令去收集告警。

連線的方式很多種,當然也會有像是 telnet / rsh 這類的。

後來,有個廠商提供的連線方式,從 telnet 改成 ssh 。我們也就跟著修改相關的設定。

So far so good, right?

後來,問題來了。對方的機器其實有兩台,前面還擋了一台 load balancer 。也就是說,我們平常 ssh hostname -l username ,雖然 hostname 不變,真正連上的機器,是會變動的。

於是,我們就會碰上類似底下的錯誤訊息:

netx@inmsvsm2:API-1> ssh npapi -l inmsadm
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
aa:bb:cc:dd:ee:ff:aa:bb:cc:dd:ee:ff:aa:bb:cc:dd.
Please contact your system administrator.
Add correct host key in /export/home/netx/.ssh/known_hosts to get rid of this message.
Offending key in /export/home/netx/.ssh/known_hosts:6
RSA host key for npapi has changed and you have requested strict checking.
Host key verification failed.
netx@inmsvsm2:API-1>

詳細解說可以參考鳥哥的文件,在關於 Server Keys 的紀錄資料: ~/.ssh/known_hosts那一小節有說明。他是建議大家去砍掉那行 offending key 。

的確,只要確定 ssh 伺服器端沒有真的出事(被 crack),只是換硬體啦ssh套件昇版啦這類的問題,導致 host key 變動,妳當然可以刪掉那一行已經不正確的key(我的例子是第 6 行),再執行 ssh 登入一次。

偏偏,我們用的是 load balancer 的 hostname (npapi),只要後端連到不同的機器(npapi01p / npapi02p),ssh機制就會很盡責的吐出上面那一段錯誤訊息,不給連就是不給連 Orz......

找了半天,在OpenSSH at CERN FAQ的 1.6. New warning messages 找到線索。

我最後試出來的方法如下:


首先,把 known_hosts 備一份,然後把相關機器的key那幾行都砍掉。

接著,不透過load balancer,一台一台的直接用 ssh 連過去(我這邊就是 ssh npapi01p -l inmsadm; ssh npapi02p -l inmsadm),讓keys被紀錄到 known_hosts :

npapi01p,192.168.128.1 ssh-rsa (後略)
npapi02p,192.168.128.3 ssh-rsa (後略)


手動編輯,加入 load balancer 的 hostname (我這邊是 npapi)

npapi01p,npapi,192.168.128.1 ssh-rsa (後略)
npapi02p,npapi,192.168.128.3 ssh-rsa (後略)


hostname 跟 key 的對應關係改好了,還要更改連線的設定,讓 CheckHostIP 為 no 。這有兩個改法,要不就是 ssh hostname -l username -o CheckHostIP=no (-o option,後面可以接選項),要不就改自己的~/.ssh/config,或是用root權限去修改系統檔案 ssh_config ,設成 CheckHostIP no

當然,把 CheckHostIP 設成 no ,是假設 name resolving 不會出問題(用檔案的,/etc/hosts檔不會被偷改;查DNS的,不會遇到DNS spoofing)。

參考資料:
OpenSSH at CERN FAQ的 1.6. New warning messages 有提到 load balancing 的解法。其實它還提到,可以在 ssh 伺服器端,把每一台機器的key都一樣,就可以解決這個問題,不過在我的情境裡面,那是另一個廠商的機器,我不能動 XD
Working with Mizar & Alcor這個PDF檔案的第10,11,12頁, 2.2 Tuning «.ssh/known_hosts» on your workstation ,也有提到 IP Load Balancer 這個問題。
sshd man page 的 SSH_KNOWN_HOSTS FILE FORMAT 一節有說明 hostname 的格式
ssh_config man page有解釋 CheckHostIP 的意義。

Posted by ystuan at 樂多Roodo! │14:30 │回應(0)引用(0)自由軟體-網路管理
樂多分類:網路/3C 共同主題:自由軟體 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/4078555