不要为 SSH 添加主机密钥到 known_hosts

Alb*_*ert 136 ssh hosts

我想通过 SSH 连接到主机,但我不希望将主机名添加到我的~/.ssh/known_hosts.

我怎样才能做到这一点?

小智 121

如果您希望这种行为是因为您正在使用云服务器(AWS EC2、Rackspace CloudServers 等)或者您不断在 Vagrant 中配置新图像,您可能需要更新您的 SSH 配置,而不是添加 bash 别名或更多选项命令行。

考虑添加如下内容:

Host *.mydomain.com 
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  User foo
  LogLevel QUIET
Run Code Online (Sandbox Code Playgroud)
  • 对主机使用尽可能严格的正则表达式以确保安全。
  • 将 LogLevel 设置为 QUIET 将阻止 Guillaume 提到的警告出现

  • 您确实应该尝试不完全禁用 StrictHostKeyChecking,因此 cclark 的答案对于使用云服务器来说是一个很好的妥协。 (3认同)

Alb*_*ert 117

-o "UserKnownHostsFile /dev/null"
Run Code Online (Sandbox Code Playgroud)

应该管用。

  • 添加 -o "LogLevel ERROR",它不会再抱怨警告了 (4认同)
  • 按预期工作,但它始终会报告:“警告:已将 'hostname,ip' (RSA) 永久添加到已知主机列表中。” 我让它消失了: 2>&1 | `grep -v "^警告:永久添加"` (3认同)
  • 注意:请求抑制该消息“警告:将‘主机名,ip’(RSA)永久添加到已知主机列表中。” 已报告给维护者 https://bugzilla.mindrot.org/show_bug.cgi?id=2413 (2认同)
  • 管道到`grep` 将合并stdout 和stderr;退出状态也可以改变。如果使用`bash`,最好使用进程替换来摆脱消息:`ssh 2> >( egrep >&2 -v '^Warning: Permanently added') -o "UserKnownHostsFile /dev/null" [ ...]`。它将避免管道,从而避免退出状态处理的相应变化。 (2认同)
  • @John 最好在这些注释中使用其他方法之一,否则由于可能隐藏其他不相关的警告,您将引入安全缺陷 (2认同)

Qua*_*ong 18

对于单个 ssh 会话,请使用此

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host
Run Code Online (Sandbox Code Playgroud)


Kyl*_*ose 11

我想将主机密钥添加到您的 known_hosts(根据我的经验,运行这些服务的人至少足够聪明,可以在提供相同主机名的机器之间保持他们的主机密钥一致),然后打开 StrictHostKeyChecking,关闭 CheckHostIP,然后使用 LogLevel ERROR 进行日志记录将在不牺牲安全性的情况下为您提供最佳体验。(好吧,如果没有 CheckHostIP,您确实需要信任 DNS,这是一个巨大的漏洞,没有广泛的 DNSSEC 或类似的东西;但我们暂时将其扫除。)

我使用只读的 known_hosts 文件,所以我必须做一些事情,否则我会收到关于无法向 known_hosts 添加条目的无休止的警告。

我使用的是:

Host github.com *.github.com
StrictHostKeyChecking yes
CheckHostIP no
LogLevel ERROR
Run Code Online (Sandbox Code Playgroud)

我希望这些服务通过 HTTPS 在他们的网站上发布他们的 SSH 主机密钥,这样我就可以明确地复制它们,而不必先连接并可能使自己暴露在 MITM 攻击中。


小智 7

我建议

LogLevel ERROR
Run Code Online (Sandbox Code Playgroud)

超过

LogLevel QUIET
Run Code Online (Sandbox Code Playgroud)

所以您仍然会收到“无法解析主机名”和其他此类错误

  • 真的要看情况。我们的开发环境每周都会被拆除并重建,它们的 A 记录保持不变,但每次构建时都会生成它们的主机密钥。我们无法保留主机密钥,因为 A 记录只是基于环境名称在数据库中定义的,并且可以随时废弃或创建新的环境名称,因此上述解决方法确实很有用。 (4认同)