关于此选项的讨论很多,大多数人认为“它提高了安全性”,“它可以保护您免受 MiTM 攻击/DNS 欺骗”等,但我看不出这是怎么回事。ssh_config(5)
说选项
允许 ssh 检测主机密钥是否由于 DNS 欺骗而发生变化
但它仍然显得模糊甚至具有误导性,因为
- 该选项不会检测“主机密钥是否已更改”,而只会检测主机的 IP 是否已更改,并且
- 它没有详细说明当检测到这种事情时它会做什么(例如,它是否会阻止连接发生?)。
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
出
- 具有主机密钥 X 的服务器具有动态 IP,并且
- 其 IP 地址已更改 Y 次。
显然这并不多,而且我怀疑攻击者是否真的可以利用这一点信息做些什么,但这是不会发生的信息泄露CheckHostIP=no
。
我已经使用两个具有动态 IP 的独立 SSH 服务器尝试了上述操作。(我使用免费的 DDNS 服务连接到它们)。
SSH 专家能否向我确认这就是提供的所有保护CheckHostIP=yes
(甚至不需要用户交互的警告),或者如果我在某些方面犯了严重错误,请纠正我?我是否应该始终保持与CheckHostIP=no
我知道会随时间更改其 IP 的服务器的连接?
答案1
概括
在我看来,CheckHostIP
只是向你保证,攻击者已经泄露了远程服务器的私钥没有还毒害了您的本地 DNS。
附注:泄漏说明
如果你因为远程服务器的主机密钥泄露而发现此帖子,请按照服务提供商的说明循环相关已知主机条目。您可能还想从中删除匹配的行已知主机已CheckHostIP
添加。
专家意见
一名“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!