ssh StrictHostKeyChecking

1.什么是ssh公钥检查?

SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。

SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机。

1
2
3
4
# 公钥检查提示
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f.
Are you sure you want to continue connecting (yes/no)?

当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。

2.-o StrictHostKeyChecking=no

在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。

或者由于 ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。

SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。

方法1:修改 /etc/ssh/ssh_config

1
2
Host *
StrictHostKeyChecking no

方法2:ssh 命令行中用 -o 参数(推荐)

1
$ ssh -p22 -o StrictHostKeyChecking=no root@192.168.99.207 "ifconfig"

3.UserKnownHostsFile=/dev/null

如何防止远程主机公钥改变导致 SSH 连接失败

  • 当确认中间人劫持攻击风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。
  • SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。
  • -o StrictHostKeyChecking no 配置配合使用,则不再有任何警告出现了
  • 如果设置了无口令 SSH 登录(即通过客户端公钥认证),就可以直接连接到远程主机。这是基于 SSH 协议的自动化任务常用的手段。

4. 组合使用

ssh免公钥检查免提示组合命令

1
$ ssh -p22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@192.168.99.207 "ifconfig"
  1. -o StrictHostKeyChecking=no 不进行公钥检查
  2. UserKnownHostsFile=/dev/null 允许指定不同的 known_hosts 文件