SSH:使用散列 known_hosts 的好处

信息安全 SSH
2021-09-01 15:17:28

known_hosts以散列形式存储什么好处根据我的阅读,它应该保护我正在连接的服务器列表,大概是在我的帐户known_hosts被盗(并且文件被盗)的情况下

如果我的帐户确实被盗用,known_hosts那么经过哈希处理就不会是什么安慰了。攻击者可以从我那里看到bash history我正在连接哪些服务器。并且还从我.ssh/config列出了我所有服务器的位置。

我在这里的描述中是否缺少任何好处?

3个回答

我不认为你错过了太多。唯一的变化是,如果一台机器遭到入侵,我们的想法是尽量减少向攻击者提供的可用信息量。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:

https://github.com/siseci/hashcat-benchmark-comparison/commit/c1bce983d8bfa4b547c6afaff0210163b4d95af2

换句话说:单个 GPU 在不到一秒的时间内解散一个 IP 地址。使用来自 的提示whois $IPhost $IP以及已经受到攻击的机器自己的主机名、配置的用户名、目录名、问候消息和类似数据作为一般密码破解/字典攻击算法的输入,目标的主机名通常会在下一秒内恢复。

known_hosts如果每一行都包含远程主机的公钥的散列,并且使用具有不同盐的该公钥的散列来加密主机名和 IP 地址,这将是安全的。在这种情况下,ssh如果外键已更改,则无法发出警告。如果有人尝试进行中间人攻击,它只会警告未知密钥。

有更安全的操作模式,ssh不需要known_hosts:可以使用机构范围的 CA 对所有主机(可能还有客户端)密钥进行签名,并允许客户端仅连接到提供此类签名密钥的主机.

对其他答案的简短补充。

您可以删除您的 shell 历史记录,但您不应该删除您的known_hosts文件,因为它可以提供“首次使用时信任”的安全性。
因此,在尝试最小化系统上的敏感数据时,它是唯一不应该清理的文件。为了仍然能够保护它,您可以使用哈希。

如果您想稍微提高安全性,或者能够手动编辑 known_hosts 并搜索主机名和 IP,则取决于您。尤其known_hosts是当您键入“ssh [tab]”时,bash 使用它来完成主机名。