【问题标题】:SSH on Linux: Disabling host key checking for hosts on local subnet (known_hosts)Linux 上的 SSH:禁用本地子网上主机的主机密钥检查 (known_hosts)
【发布时间】:2010-12-11 23:11:04
【问题描述】:

我在一个 IP 地址上的系统会经常更改的网络上工作。它们在工作台上上下移动,DHCP 确定它们获得的 IP。

如何禁用主机密钥缓存/检查似乎并不简单,这样我就不必在每次需要连接到系统时编辑 ~/.ssh/known_hosts。

我不关心主机的真实性,它们都在 10.x.x.x 网段上,而且我比较确定没有人在对我进行 MITM。

有没有“正确”的方法来做到这一点?我不在乎它是否会警告我,但是每次都停止并导致我为该 IP 刷新我的 known_hosts 条目很烦人,在这种情况下它并没有真正提供任何安全性,因为我很少连接到系统超过一次或两次然后将IP分配给另一个系统。

我查看了 ssh_config 文件,发现我可以设置组,这样就可以保护连接到外部机器的安全性,我可以忽略检查本地地址。这将是最佳选择。

从搜索中我发现了一些非常强烈的意见,从“不要乱来,这是为了安全,处理它”到“这是我曾经处理过的最愚蠢的事情,我只是想把它关掉”......我在中间的某个地方。我只是希望能够完成我的工作,而不必每隔几分钟从文件中清除地址。

谢谢。

【问题讨论】:

    标签: linux caching ssh ssh-keys


    【解决方案1】:

    这是我用于不断变化的 EC2 主机的配置:

    maxim@maxim-desktop:~$ cat ~/.ssh/config 
    Host *amazonaws.com
            IdentityFile ~/.ssh/keypair1-openssh
            IdentityFile ~/.ssh/keypair2-openssh
            User ubuntu
            StrictHostKeyChecking no
            UserKnownHostsFile /dev/null
    

    这会禁用主机确认 StrictHostKeyChecking no 并且还使用了一个不错的 hack 来防止 ssh 将主机标识保存到持久文件中 UserKnownHostsFile /dev/null 请注意,作为附加值,我添加了用于连接到主机和尝试几种不同识别私钥的选项。

    【讨论】:

    • 哇,/dev/null hack 太棒了。我总是忘记在 linux 上简单的事情是多么明显。谢谢。
    • 如果该解决方案适用于您,请接受有效回复作为此问题的答案,请记住其他人将访问此问题页面。如果仍然无法解决问题,请在 cmets 中发布另一个问题。
    • 如果我将 UserKnownHostsFile 设置为 /dev/null,我每次都会收到此警告“警告:将 '10.9.8.7' (RSA) 永久添加到已知主机列表中。”有什么办法可以关闭它?
    • 仅供参考,您可以使用 * 作为主机名或 IP 地址中任意数量字符的通配符。 ?表示单个字符。所以 192.168.* 匹配 192.168.0.0 到 192.168.255.255 和 192.168.0.?匹配 192.168.0.0 到 192.168.0.9。参考:linux.die.net/man/5/ssh_config
    【解决方案2】:

    假设你使用的是OpenSSH,相信你可以设置

    CheckHostIP no
    

    防止在 known_hosts 中检查主机 IP 的选项。从手册页:

    检查主机IP

    如果此标志设置为“是”,则 ssh(1) 将额外检查主机 IP known_hosts 文件中的地址。这 允许 ssh 检测是否有主机密钥 由于 DNS 欺骗而更改。如果 选项设置为“否”,检查将 不被执行。默认是 '是的'。

    【讨论】:

    • 我在主机 10.0.0.* 的配置文件底部添加了一个部分,在它下面我放了 CheckHostIP no 你知道我是否需要将所有其他设置放在那里还是如果这是除了上面的 * 主机?我必须等到我登录到一个已发出“已使用”IP 地址的系统,以确保此更改有效。如果可行,我会接受你的回答。谢谢。
    • 这似乎不是 100% 的伎俩......不知道为什么,我将不得不多玩一点,看看我能不能让它做我想做的事。
    • “100%”是什么意思?它有时有效,但有时无效?
    • 抱歉,由于某种原因,我从未看到您的回复。因为 IP 地址变化如此频繁,我不知道自上次连接以来我缓存了哪些文件或刷新了哪些文件,所以它被命中或错过。最终失误多于命中。我刚刚收到另一个建议,将我的 UserKnownHostsFile 指向 /dev/null。我要试试这个技巧。
    • 正如 man 摘录所解释的,选项 CheckHostIP 只是另外检查主机 IP 地址(而不是只是检查 FQDN)。与-oCheckHostIP=no 的简单成功 SSH 连接也证明了这一点,它将主机添加到已知文件。使用UserKnownHostsFile /dev/null 获得所需的结果。
    【解决方案3】:

    这花了我一段时间才找到。我见过的最常见的用例是当你有 SSH 隧道到远程网络时。这里的所有解决方案都产生了破坏我的 Nagios 脚本的警告。

    我需要的选项是:

    NoHostAuthenticationForLocalhost yes
    

    顾名思义,它也只适用于本地主机。

    【讨论】:

      【解决方案4】:
      1. 编辑你的 ~/.ssh/config

      nano ~/.ssh/config(如果还没有,别担心,nano 会创建一个新文件)

      1. 添加以下配置:
      Host 192.168.*
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
      

      【讨论】:

        【解决方案5】:

        如果您想暂时禁用此功能或无需更改您的 SSH 配置文件,您可以使用:

        ssh -o UserKnownHostsFile=/dev/null username@hostname
        

        【讨论】:

          【解决方案6】:

          由于每个其他答案都说明了如何禁用密钥检查,因此这里有两个保留密钥检查但避免问题的想法:

          1. 使用主机名。如果您控制 DHCP 服务器并且可以分配正确的名称,这很容易。之后,您可以使用已知的主机名,更改 ips 无关紧要。

          2. 使用主机名。即使你不控制 DHCP 服务器,你也可以使用像avahi 这样的服务,它会在我们的本地网络中广播服务器的名称。它负责解决碰撞和其他问题。

          3. 使用主机密钥签名。构建机器后,使用本地 CA 对其进行签名(您不需要全球受信任的 CA)。之后,您无需单独信任计算机上的每个主机。信任 known_hosts 文件中的签名 CA 就足够了。更多信息请参见 ssh-keygen 手册页或许多博文 (https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-01-20
            • 2019-06-26
            • 2018-12-09
            • 1970-01-01
            • 2020-03-03
            • 1970-01-01
            • 2011-11-12
            相关资源
            最近更新 更多