SH 公鑰檢查是一個(gè)重要的安全機(jī)制,可以防范中間人劫持等黑客攻擊。但是在特定情況下,嚴(yán)格的 SSH 公鑰檢查會(huì)破壞一些依賴 SSH 協(xié)議的自動(dòng)化任務(wù),就需要一種手段能夠繞過(guò) SSH 的公鑰檢查。
首先看看什么是 SSH 公鑰檢查
SSH 連接遠(yuǎn)程主機(jī)時(shí),會(huì)檢查主機(jī)的公鑰。如果是第一次該主機(jī),會(huì)顯示該主機(jī)的公鑰摘要,提示用戶是否信任該主機(jī):
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f. Are you sure you want to continue connecting (yes/no)?
當(dāng)選擇接受,就會(huì)將該主機(jī)的公鑰追加到文件 ~/.ssh/known_hosts 中。當(dāng)再次連接該主機(jī)時(shí),就不會(huì)再提示該問(wèn)題了。 如果因?yàn)槟撤N原因(服務(wù)器系統(tǒng)重裝,服務(wù)器間IP地址交換,DHCP,虛擬機(jī)重建,中間人劫持),該IP地址的公鑰改變了,當(dāng)使用 SSH 連接的時(shí)候,會(huì)報(bào)錯(cuò):
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @nbsp;nbsp;nbsp; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!nbsp;nbsp;nbsp;nbsp; @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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 e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Please contact your system administrator. Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message. Offending key in /home/jiangxin/.ssh/known_hosts:81 RSA host key for 192.168.0.110 has changed and you have requested strict checking. Host key verification failed.
上面的警告信息說(shuō)的是:
服務(wù)器公鑰已經(jīng)改變,新的公鑰的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
該服務(wù)器原來(lái)的公鑰記錄在文件 ~/.ssh/known_hosts 中第 81 行。
如果確認(rèn)不是中間人劫持,需要連接到該服務(wù)器,怎么辦呢?最簡(jiǎn)單的就是用 vi 打開 ~/.ssh/known_hosts 文件,定位到 81 行,將該行刪除。之后就可以使用 ssh 連接了。
如何讓連接新主機(jī)時(shí),不進(jìn)行公鑰確認(rèn)?
在首次連接服務(wù)器時(shí),會(huì)彈出公鑰確認(rèn)的提示。這會(huì)導(dǎo)致某些自動(dòng)化任務(wù),由于初次連接服務(wù)器而導(dǎo)致自動(dòng)化任務(wù)中斷?;蛘哂捎?nbsp; ~/.ssh/known_hosts 文件內(nèi)容清空,導(dǎo)致自動(dòng)化任務(wù)中斷。 SSH 客戶端的 StrictHostKeyChecking 配置指令,可以實(shí)現(xiàn)當(dāng)?shù)谝淮芜B接服務(wù)器時(shí),自動(dòng)接受新的公鑰。只需要修改 /etc/ssh/ssh_config 文件,包含下列語(yǔ)句:
Host * StrictHostKeyChecking no
或者在 ssh 命令行中用 -o 參數(shù)
$ sshnbsp; -o StrictHostKeyChecking=nonbsp; 192.168.0.110
如何防止遠(yuǎn)程主機(jī)公鑰改變導(dǎo)致 SSH 連接失敗
當(dāng)確認(rèn)中間人劫持攻擊風(fēng)險(xiǎn)比較小的情況下,才可以使用下面的方法,禁用 SSH 遠(yuǎn)程主機(jī)的公鑰檢查。 SSH 客戶端提供一個(gè) UserKnownHostsFile 配置,允許指定不同的 known_hosts 文件。那么將 known_hosts 指向不同的文件,不就不會(huì)造成公鑰沖突導(dǎo)致的中斷了么?
$ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110 The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Are you sure you want to continue connecting (yes/no)?
看,提示信息由公鑰改變中斷警告,變成了首次連接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,則不再有任何警告出現(xiàn)了:
$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110 Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts. jiangxin@192.168.0.110's password:
如果設(shè)置了無(wú)口令 SSH 登錄(即通過(guò)客戶端公鑰認(rèn)證),就可以直接連接到遠(yuǎn)程主機(jī)。這是基于 SSH 協(xié)議的自動(dòng)化任務(wù)常用的手段。