2015年2月1日 星期日

[Linux 常見問題] ssh中 "Host key verification failed." 的解決方案

Source From Here 
Question: 
我們使用 ssh 連接 linux 主機時,可能出現 “ Host key verification failed.“ 的提示,ssh 連接不成功。可能的提示信息如下: 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
@ 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
23:00:20:83:de:02:95:f1:e3 :34:be:57:3f:cf:2c:e7.
Please contact your system administrator.
Add correct host key in /home/xahria/.ssh/known_hosts to get rid of this message.
Offending key in /home/xahria/ .ssh/known_hosts:8
RSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.

How-To 
網上很多的解決方案是:vi ~/.ssh/known_hosts 刪除與想要連接的主機相關的行;或者直接刪除 known_hosts 這個文件。當然這個方案也是可行的,但並非解決問題的根本辦法,因為繼續使用,今後還會出現這樣的情況,還得再刪除。下面簡單講一下這個問題的原理和比較長久的解決方案。 

用 OpenSSH 的人都知 ssh 會把你每個你訪問過計算機的公鑰 (public key) 都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時,OpenSSH 會核對公鑰。如果公鑰不同,OpenSSH 會發出警告,避免你受到 DNS Hijack 之類的攻擊。 

SSH 對主機的 public_key 的檢查等級是根據 StrictHostKeyChecking 變量來配置的。默認情況下,StrictHostKeyChecking=ask。簡單所下它的三種配置值: 
* StrictHostKeyChecking=no 
最不安全的級別,當然也沒有那麼多煩人的提示了,相對安全的內網測試時建議使用。如果連接 server 的 key 在本地不存在,那麼就自動添加到文件中默認是known_hosts,並且給出一個警告

* StrictHostKeyChecking=ask 
默認的級別,就是出現剛才的提示了。如果連接和 key 不匹配,給出提示,並拒絕登錄。

* StrictHostKeyChecking=yes 
最安全的級別,如果連接與 key 不匹配,就拒絕連接,不會提示詳細信息

對於我來說,在內網的進行的一些測試,為了方便,選擇最低的安全級別。在 .ssh/config或者 /etc/ssh/ssh_config)中配置: 
  1. StrictHostKeyChecking no   
  2. UserKnownHostsFile /dev/null  

注:這里為了簡便,將 UserKnownHostsFile 設為 /dev/null,就不保存在known_hosts中了! 

Supplement 
參考資料:SSH Host Key Protection

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...