OpenSSH 中 known_hosts 的维护[zt]

OpenSSH 中 known_hosts 的维护
http://www.linuxeden.com/forum/thread-163691-1-1.html

用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"

贴一个用于清理内网主机的密钥缓存的脚本

[Copy to clipboard] [ - ]CODE:purge()
{
usage()
{
       echo "*** cleanup the specified host key cache in .ssh/known_hosts ***"
       echo "Usage: purge 16.18"
       #return # cannot return in a built-in function
}

[ $# -lt 1 ] || [ $# -gt 2 ] || [ ! `echo $1 | sed -n '/\./p'` ] && usage && return

unset BADHOST && BADHOST="192.168.$1"
[ "${1%%.*}" == "15" ] || [ "${1%%.*}" == "88" ] &&   BADHOST="172.16.$1"
[ "${1%%.*}" == "10" ] || [ "${1%%.*}" == "8" ] &&   BADHOST="10.10.$1"
#四个特殊内网网段的例外:
#    10.10.10.0/24 10.10.8.0/24 172.16.15.0/24   172.16.88.0/24

[ "x$BADHOST" != "x192.168." ] && {
       echo -n "Remove $BADHOST from $HOME/.ssh/known_hosts "
       sed   -e "/^$BADHOST\ /d" $HOME/.ssh/known_hosts > $HOME/.ssh/known_hosts.purged
       install -m 600 $HOME/.ssh/known_hosts.purged $HOME/.ssh/known_hosts
       echo successfully!
}
}
使用方法: 把代码贴到 ~/.bashrc 后, 重新登陆即可.

不支持 hash 后的 IP地址清理

你可能感兴趣的:(#网络相关)