SSH 选项 CheckHostIP=yes 到底对我有什么帮助?

SSH 选项 CheckHostIP=yes 到底对我有什么帮助?

关于此选项的讨论很多,大多数人认为“它提高了安全性”,“它可以保护您免受 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 的服务器的连接?

答案1

概括

在我看来,CheckHostIP只是向你保证,攻击者已经泄露了远程服务器的私钥没有毒害了您的本地 DNS。

附注:泄漏说明

如果你因为远程服务器的主机密钥泄露而发现此帖子,按照服务提供商的说明循环相关已知主机条目。您可能还想从中删除匹配的行已知主机CheckHostIP添加。

披露日期 提供者 指示
2023-03-24 GitHub 博客文章
2023-05-15 Bitbucket 博客文章

专家意见

一名“SSH 专家”,特别是 OpenSSH 维护者,已经确认了你的立场

我认为我们更有可能关闭CheckHostIP(垃圾邮件地址变成已知主机),因为没有人能够令人满意地向我解释它解决了什么问题。

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

三个月后,达米恩又发布了OpenSSH v8.52021-03-03,已CheckHostIP关闭,更新日志信息如下:

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

带回CheckHostIP

如果你真的想保留CheckHostIP,你可以重新打开它并禁用它只为具有动态IP的主机跳过警告和已知主机污染。但是不要这么做。这没什么帮助。

这似乎不太可能CheckHostIP成为对付威胁行为者的有效措施,因为威胁行为者可能同时……

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

面对这样的敌人,当你连接到主机时,你会被“警告:永久添加的主机密钥”消息拯救,尤其是当它每次都显示警告2时,这似乎很荒谬。

已知主机诡计

有些人主动倾销将某个服务的所有已知 IP 合并到已知主机行,可能只是为了避免警告信息。这会将所有无意义的内容预先加载到已知主机否则你会逐渐积累,但我认为这没有抓住重点:重要部分已知主机不是 IP — — 它是主机密钥。

为了减少超长已知主机条目,其他人使用通配符模拟 IP 范围, 这可能出现聪明,但实际上它很挑剔3并且只因为CheckHostIP检查 IP 并忽略主机名才有效。

1出于某种原因,这篇文章在真实的主机密钥泄露。
2也就是说:“当它喊‘狼来了!’”
3例如,如果您尝试允许127.0.0.*动态 IP SSH 服务器,从技术上讲,您也匹配,127.0.0.evilsite.example因为 IP 和主机名没有区别。您可以使用 限制通配符为单个字符?,但要小心:127.0.0.??将匹配127.0.0.cz。也许它似乎不太可能.cz将允许0作为二级域名,但我们谈论的是对手谁在毒害您的 DNS!

相关内容