SSH 选项 CheckHostIP=yes 对我有何帮助?

And*_*idX 11 domain-name-system ssh man-in-the-middle

关于此选项有很多讨论,大多数人认为“它提高了安全性”、“它可以保护您免受 MiTM 攻击/DNS 欺骗”等,但我不明白这是怎么回事。ssh_config(5)说这个选项

允许 ssh 检测主机密钥是否因 DNS 欺骗而更改

但它仍然显得模糊甚至误导,因为

  1. 该选项不会检测“主机密钥是否已更改”,而仅检测主机的 IP 是否已更改,并且
  2. 它没有详细说明当它检测到这样的事情时它会做什么(例如,它是否会阻止连接发生?)。

由于文档含糊不清,其他人甚至似乎认为CheckHostIP=yes不会您连接到已更改 IP 的主机(即它的 IP 与已记录的 IP 不同known_hosts),这是完全不真实的,位于至少据我自己的测试可以理解。

  • CheckHostIP=yes当我(默认)连接到主机密钥已存储在 中known_hosts但已更改其 IP 的远程服务器时,连接正常进行,但我收到警告:

    永久添加 IP 地址的 ECDSA 主机密钥 [......]

    另外,还会在 中添加一个新行known_hosts,其中包含服务器的主机密钥(未更改)和新的 IP 地址(不同)。如果主机稍后再次更改其 IP,则下次我使用 来连接它时CheckHostIP=yes,将附加一个新行,known_hosts依此类推。

  • 如果我连接CheckHostIP=no到已更改其 IP 地址的服务器,连接将继续(这也是 发生的情况CheckHostIP=yes),但这次没有警告或在 中附加新行known_hosts

yes因此,和之间的唯一区别no似乎是连接时的简单一行警告,以及known_hosts每次主机更改其 IP 时记录新地址(有效地保留服务器不同 IP 的历史记录)。

如果是这样的话,我什至不确定这CheckHostIP=yes比 更好CheckHostIP=no,因为如果客户端计算机受到损害,攻击者将能够从中推断known_hosts

  1. 具有主机密钥 X 的服务器具有动态 IP,并且
  2. 它已更改其 IP 地址 Y 次。

显然这并不多,我怀疑攻击者实际上可以用这些信息做一些事情,但这是不会发生的信息泄漏CheckHostIP=no

我已经使用两个具有动态 IP 的独立 SSH 服务器尝试了上述操作。(我使用免费的 DDNS 服务连接到它们)。

SSH 专家能否向我确认这就是提供的所有保护CheckHostIP=yes(甚至不要求用户交互的警告),或者如果我在某些方面犯了严重错误,可以纠正我吗?我是否应该始终保持CheckHostIP=no与我知道 IP 会随时间变化的服务器的连接?

Mic*_*ael 10

概括

\n

在我看来,这只是让您放心,已经破坏了远程服务器私钥的CheckHostIP攻击者并没有同时毒害您的本地 DNS。

\n

旁注:泄漏说明

\n

如果您因远程服务器的主机密钥泄露而发现这篇文章,请1按照服务提供商的说明循环相关的known_hosts条目。您可能还想从已添加的known_hosts中删除匹配的行CheckHostIP

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
披露日期供应商指示
2023-03-24GitHub博客文章
2023-05-15位桶博客文章
\n

专家意见

\n

一位“SSH 大师”,特别是 OpenSSH 维护者,已经肯定了您的立场

\n
\n

我认为我们更有可能在短期内关闭(垃圾邮件地址到known_hosts的CheckHostIP东西),因为没有人令人满意地解释它为我解决了什么问题。

\n

@DamienMiller(推特,2020-12-11)

\n
\n

三个月后,Damien在 2021 年 3 月 3 日发布了OpenSSH v8.5CheckHostIP ,该版本已被关闭,并显示以下更改日志消息:

\n
\n
    \n
  • ssh(1)CheckHostIP默认禁用。它提供的好处微不足道,但使密钥轮换变得更加困难,特别是对于基于 IP 的负载平衡器后面的主机而言。
  • \n
\n
\n

带回来CheckHostIP

\n

如果你确实想保留CheckHostIP,你可以重新打开它并仅对具有动态IP的主机禁用它,以跳过警告和known_hosts污染。不过,不要这样做。这没那么有帮助。

\n

这似乎不太可能CheckHostIP是对付既可以\xe2\x80\xa6 的威胁行为者的有意义的措施

\n
    \n
  • 窃取远程SSH服务器的私钥,并且
  • \n
  • 操纵客户端的 DNS 解析。
  • \n
\n

面对这样的敌人,在连接到主机时,尤其是每次都显示警告2时,您会以某种方式被“警告:永久添加主机密钥”消息拯救,这似乎很可笑。

\n

known_hosts技巧​

\n

有些人主动将服务的所有已知 IP 转储到known_hosts行中,可能只是为了避免出现警告消息。这会将所有无意义的内容预先加载到您将逐渐积累的known_hosts中,但我认为它没有抓住要点:known_hosts的重要部分不是IP \ xe2 \ x80 \ x94,而是主机密钥。

\n

为了减少超长的known_hosts条目,其他人用通配符模拟IP范围,这可能看起来很聪明,但实际上很挑剔3并且仅在CheckHostIP检查IP并忽略主机名时才有效。

\n

1由于某种原因,这篇文章在真实主机密钥泄漏的搜索结果中排名相当靠前。
\n 2也就是说:“当它喊“狼来了!”时”
\n 3例如,如果您尝试允许127.0.0.*动态 IP SSH 服务器,那么从技术上讲,您也会匹配,127.0.0.evilsite.example因为 IP 和主机名是不区分的。您可以使用 限制通配符为单个字符?,但要小心:127.0.0.??将匹配127.0.0.cz。也许这似乎不太可能.cz允许0作为二级域名,但我们谈论的是一个正在毒害您的 DNS 的对手!

\n

  • 感谢您引用可靠来源。known_hosts 中的垃圾邮件变得非常烦人 (2认同)