known_hosts
以散列形式存储有什么好处?根据我的阅读,它应该保护我正在连接的服务器列表,大概是在我的帐户known_hosts
被盗(并且文件被盗)的情况下
如果我的帐户确实被盗用,known_hosts
那么经过哈希处理就不会是什么安慰了。攻击者可以从我那里看到bash history
我正在连接哪些服务器。并且还从我.ssh/config
列出了我所有服务器的位置。
我在这里的描述中是否缺少任何好处?
known_hosts
以散列形式存储有什么好处?根据我的阅读,它应该保护我正在连接的服务器列表,大概是在我的帐户known_hosts
被盗(并且文件被盗)的情况下
如果我的帐户确实被盗用,known_hosts
那么经过哈希处理就不会是什么安慰了。攻击者可以从我那里看到bash history
我正在连接哪些服务器。并且还从我.ssh/config
列出了我所有服务器的位置。
我在这里的描述中是否缺少任何好处?
我不认为你错过了太多。唯一的变化是,如果一台机器遭到入侵,我们的想法是尽量减少向攻击者提供的可用信息量。在known_hosts
文件中,不需要包含更多信息(计算几百个 HMAC 并不是一项繁重的工作),与~/.ssh/config
如果Address
您希望通过别名连接(散列不起作用)和在您的命令行历史记录中 - 如果您选择保留一个。
据推测,您可能有一个非常大的 known_hosts(例如,如果您在设置帐户时将其与另一台计算机同步),但要说不使用.ssh/config
也不保留命令行历史记录,或者从未连接到命令行历史记录中的大多数计算机。
在这些情况下,对您 known_hosts 中使用的 IP 地址进行散列处理可以减少泄露事件的风险。
此外,HashKnownHosts
是一个可配置的选项,默认是不散列(可能由于您指定的原因 - 它没有多大帮助)。见man ssh_config
:
哈希已知主机
表示 ssh(1) 在将主机名和地址添加到 ~/.ssh/known_hosts 时应该对其进行哈希处理。ssh(1) 和 sshd(8) 可以正常使用这些散列名称,但如果文件内容被泄露,它们不会泄露识别信息。默认值为“否”。请注意,已知主机文件中的现有名称和地址不会自动转换,但可以使用 ssh-keygen(1) 手动散列。使用此选项可能会破坏依赖于能够从 ~/.ssh/known_hosts 读取未散列主机名的功能,例如选项卡补全。
请注意以下条目的散列 known_hosts 行的格式(示例取自此处- 我当前的配置不是散列)192.168.1.61
:
|1|F1E1KeoE/eEWhi10WpGv4OdiO6Y=|3988QV0VE8wmZL7suNrYQLITLCg= ssh-rsa ...
其中第一部分F1E1KeoE/eEWhi10WpGv4OdiO6Y=
是随机盐 - 作为 HMAC-SHA1 散列 192.168.1.61 的密钥。
您可以使用(BSD / Mac OS X)在命令行中进行验证:
#### key=`echo F1E1KeoE/eEWhi10WpGv4OdiO6Y= | base64 -D | xxd -p`
#### echo -n "192.168.1.61" | openssl sha1 -mac HMAC -macopt hexkey:$key|awk '{print $2}' | xxd -r -p|base64
3988QV0VE8wmZL7suNrYQLITLCg=
或在 GNU/linux 上:
#### key=`echo F1E1KeoE/eEWhi10WpGv4OdiO6Y= | base64 -d | xxd -p`
#### echo -n "192.168.1.61" | openssl sha1 -mac HMAC -macopt hexkey:$key|awk '{print $2}' | xxd -r -p|base64
3988QV0VE8wmZL7suNrYQLITLCg=
我们刚刚解码了 salt 并将其用作 sha1 HMAC 中的密钥,然后在 base64 中重新编码散列。只是指定作为另一个答案,最初假定 HMAC 可能已经使用用户的私有 ssh 密钥来计算基于哈希的消息身份验证代码,但事实并非如此。
我相信,在known_hosts
文件中散列主机名没有任何好处。该哈希甚至提供了一种虚假的安全感。应尽快将其删除。原因是,它ssh
按名称和 IP 地址存储每个主机两次。只有 2³² = 4294967296 个不同的 IP 地址。但是,现代 GPU 可以以每秒 12 Gigahashes 的速度暴力破解 SHA-1:
换句话说:单个 GPU 在不到一秒的时间内解散一个 IP 地址。使用来自 的提示whois $IP
,host $IP
以及已经受到攻击的机器自己的主机名、配置的用户名、目录名、问候消息和类似数据作为一般密码破解/字典攻击算法的输入,目标的主机名通常会在下一秒内恢复。
known_hosts
如果每一行都包含远程主机的公钥的散列,并且使用具有不同盐的该公钥的散列来加密主机名和 IP 地址,这将是安全的。在这种情况下,ssh
如果外键已更改,则无法发出警告。如果有人尝试进行中间人攻击,它只会警告未知密钥。
有更安全的操作模式,ssh
不需要known_hosts
:可以使用机构范围的 CA 对所有主机(可能还有客户端)密钥进行签名,并允许客户端仅连接到提供此类签名密钥的主机.
对其他答案的简短补充。
您可以删除您的 shell 历史记录,但您不应该删除您的known_hosts
文件,因为它可以提供“首次使用时信任”的安全性。
因此,在尝试最小化系统上的敏感数据时,它是唯一不应该清理的文件。为了仍然能够保护它,您可以使用哈希。
如果您想稍微提高安全性,或者能够手动编辑 known_hosts 并搜索主机名和 IP,则取决于您。尤其known_hosts
是当您键入“ssh [tab]”时,bash 使用它来完成主机名。