用OpenSSH的人都知ssh會把你每個你訪問過電腦的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同電腦時,OpenSSH會核對公鑰。如果公鑰不同,OpenSSH會發出警告,避免你受到DNS Hijack之類的攻擊。
不過known_hosts的內容一些只是以純文本方式存放。如果你的帳號被人成功入侵,他可以由known_hosts直接得知你到訪過的電腦列表。為減低出現類似情況的機會。OpenSSH在4.0p1引入了
Hash Known Hosts功能,在known_hosts中把訪問過的電腦名稱或IP地址以hash方式存放,令入侵都不能直接知道你到訪過那些電腦。這項新項功能預設是關閉的,要你手動地在ssh_config加上"HashKnownHosts yes"才會被開啟。不過Debian Testing就預設開啟了個功能。
然而,偶然一些電腦的ssh公鑰是合理地被更動。雖然遇到這些情況OpenSSH會發出驚告並禁止你進入該電腦。以往當我們確定該次ssh公鑰被更動沒有可疑時,我們用文字編輯器開啟known_hosts,把相關的公鑰記錄刪掉就可以了。但現在因為所有電腦名稱或IP地址都被hash了,我們很難知道那行是相關電腦的公鑰。當然我們可以把整個known_hosts刪除,但我們會同時失去其他正常電腦的ssh公鑰。
事實上OpenSSH在工具ssh-keygen加了三個選項,協助你管理hash了的known_hosts。你可以用"ssh-keygen -F 電腦名稱"找出相關的公鑰:
ssh-keygen -F www.example.net
如果你想更新某電腦的公鑰,可以先打"ssh-keygen -R 電腦名稱"刪除該電腦的公鑰,然後再"ssh 電腦名稱"再進入該電腦,ssh自然會重新下載新的公鑰。
如果你的known_hosts 檔案仍未被hash,你可以打"ssh-keygen -H"
回應
从安全上来说似乎是不错
但给我带来的一个实际问题是,我不能再用bash_completion来自动完成ssh命令行了,还真是添了点麻烦呢。--xyb