在 dns 上配置 ssh 指纹以替换 known_hosts 失败

Mic*_*oto 13 ssh dns bind

SSHFP 记录在 ssh 服务器上生成如下,然后添加到绑定中的区域:

$ ssh-keygen -r www.test.us.
www.test.us. IN SSHFP 1 1 ad04dfaf343a93beeb939eed1612168f7eadbed7
www.test.us. IN SSHFP 2 1 432209c72c4f0e99546d601dd96c04ce804191f9
Run Code Online (Sandbox Code Playgroud)

可以通过 DNS 从 ssh 客户端获取所需的记录,如下所示:

$ dig www.test.us any
;; QUESTION SECTION:
;www.test.us.           IN  ANY

;; ANSWER SECTION:
www.test.us.        120 IN  SSHFP   1 1 AD04DFAF343A93BEEB939EED1612168F7EADBED7
www.test.us.        120 IN  SSHFP   2 1 432209C72C4F0E99546D601DD96C04CE804191F9
www.test.us.        120 IN  A   192.168.1.50
Run Code Online (Sandbox Code Playgroud)

但是,客户端上的 ssh 在连接时无法找到它们:

$ rm .ssh/known_hosts
$ ssh -vo VerifyHostKeyDNS=yes www
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /Users/test/.ssh/config
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 53: Applying options for *
debug1: Connecting to www [192.168.1.50] port 22.
debug1: Connection established.
debug1: identity file /Users/test/.ssh/id_rsa type 1
debug1: identity file /Users/test/.ssh/id_rsa-cert type -1
debug1: identity file /Users/test/.ssh/id_dsa type -1
debug1: identity file /Users/test/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.8p2_hpn13v11
debug1: match: OpenSSH_5.8p2_hpn13v11 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c
DNS lookup error: name does not exist
The authenticity of host 'www (192.168.1.50)' can't be established.
RSA key fingerprint is 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)

关于为什么会失败的任何想法?我知道需要 DNSSEC 才能使其安全,并且我应该收到警告,因为当前未启用 DNSSEC。我希望在我开始将其作为一个附加问题解决之前,先在没有 DNSSEC 的情况下使其工作。

ssh 服务器是带有 OpenSSH_5.8p2_hpn13v11 的 FreeBSD 9.1,并且还使用 BIND 9.8.3-P4 托管 DNS。我尝试从 OS X 10.8.2 与 OpenSSH_5.9p1 以及 Arch Linux 3.6.10-1-ARCH 与 OpenSSH_6.1p1 进行连接。

更新

为了进一步尝试解决这个问题,我建立了一个新的 OpenBSD 5.2 VM,它内置了 OpenSSH_6.1 作为 ssh 服务器。由于 OpenSSH 服务器的所有其他实现都只是 OpenBSD 的端口,所以这肯定可以工作。在服务器上我生成 SSHFP 记录:

# ssh-keygen -r vm1.test.us.  
vm1.test.us. IN SSHFP 1 1 419c5338920e11183380d81f002fc998389b944f
vm1.test.us. IN SSHFP 1 2 cb5bbbf5aef231f57a1a4dcf1e790f1be032b124d0d591023f33cfd5f91ec556
vm1.test.us. IN SSHFP 2 1 0fdf92ce946b5cfee5f96a3e1ef710edc50280ff
vm1.test.us. IN SSHFP 2 2 f2ee7334ee9f9a426f51f20af8f4bc7155d567c9d38a6bffaa6c643af405711e
vm1.test.us. IN SSHFP 3 1 b5e94320f0bc0b46cc6627ca7221679a65c79962
vm1.test.us. IN SSHFP 3 2 60704213a0bbd8dae813d113bfe4ae190a780b89836e6e1c567b7cfde89805f8
Run Code Online (Sandbox Code Playgroud)

我将它们添加到 FreeBSD 绑定服务器并重新加载命名。然后测试我是否可以访问记录:

$ host -t any vm1
vm1.test.us has SSHFP record 1 1 419C5338920E11183380D81F002FC998389B944F
vm1.test.us has SSHFP record 1 2 CB5BBBF5AEF231F57A1A4DCF1E790F1BE032B124D0D591023F33CFD5 F91EC556
vm1.test.us has SSHFP record 2 1 0FDF92CE946B5CFEE5F96A3E1EF710EDC50280FF
vm1.test.us has SSHFP record 2 2 F2EE7334EE9F9A426F51F20AF8F4BC7155D567C9D38A6BFFAA6C643A F405711E
vm1.test.us has SSHFP record 3 1 B5E94320F0BC0B46CC6627CA7221679A65C79962
vm1.test.us has SSHFP record 3 2 60704213A0BBD8DAE813D113BFE4AE190A780B89836E6E1C567B7CFD E89805F8
vm1.test.us has address 192.168.1.60


$ dig -t any vm1.test.us
;; QUESTION SECTION:
;vm1.test.us.           IN  ANY

;; ANSWER SECTION:
vm1.test.us.        120 IN  SSHFP   1 2 CB5BBBF5AEF231F57A1A4DCF1E790F1BE032B124D0D591023F33CFD5 F91EC556
vm1.test.us.        120 IN  SSHFP   2 1 0FDF92CE946B5CFEE5F96A3E1EF710EDC50280FF
vm1.test.us.        120 IN  SSHFP   2 2 F2EE7334EE9F9A426F51F20AF8F4BC7155D567C9D38A6BFFAA6C643A F405711E
vm1.test.us.        120 IN  SSHFP   3 1 B5E94320F0BC0B46CC6627CA7221679A65C79962
vm1.test.us.        120 IN  SSHFP   3 2 60704213A0BBD8DAE813D113BFE4AE190A780B89836E6E1C567B7CFD E89805F8
vm1.test.us.        120 IN  SSHFP   1 1 419C5338920E11183380D81F002FC998389B944F
vm1.test.us.        120 IN  A   192.168.1.60
Run Code Online (Sandbox Code Playgroud)

记录显然是通过 DNS 提供的,所以我尝试使用 ssh:

$ rm .ssh/known_hosts
$ ssh -vo VerifyHostKeyDNS=yes root@vm1
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to vm1 [192.168.1.60] port 22.
debug1: Connection established.
debug1: identity file /Users/test/.ssh/id_rsa type 1
debug1: identity file /Users/test/.ssh/id_rsa-cert type -1
debug1: identity file /Users/test/.ssh/id_dsa type -1
debug1: identity file /Users/test/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.1
debug1: match: OpenSSH_6.1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA d8:01:b5:b2:3e:c7:55:ce:19:c1:6d:77:39:92:7d:0f
DNS lookup error: name does not exist
The authenticity of host 'vm1 (192.168.1.60)' can't be established.
RSA key fingerprint is d8:01:b5:b2:3e:c7:55:ce:19:c1:6d:77:39:92:7d:0f.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我认为消除 ssh 客户端和服务器作为故障点是安全的。相反,我将关注 DNS 服务器。除非有人建议去哪里寻找,否则我想我一直坚持捕获数据包并挖掘它们以寻找线索。

更新2

好的,这是我的数据包捕获的结果。ssh www; 不符合标准

No matching host key fingerprint found in DNS.
Run Code Online (Sandbox Code Playgroud)

并且数据包捕获显示 DNS 未能返回查找记录。

mbp13.test.us   www.test.us DNS Standard query 0x1c5e  SSHFP www
www.test.us   mbp13.test.us DNS Standard query response 0x1c5e No such name
Run Code Online (Sandbox Code Playgroud)

与 ssh www.test.us 比较;这也失败了消息

No matching host key fingerprint found in DNS.
Run Code Online (Sandbox Code Playgroud)

但是数据包捕获显示 DNS 实际上返回了记录。

mbp13.test.us   www.test.us DNS Standard query 0x0ebd  SSHFP www.test.us
www.test.us   mbp13.test.us DNS Standard query response 0x0ebd  SSHFP SSHFP`
Run Code Online (Sandbox Code Playgroud)

首先,这两种情况的错误消息是相同的,这有点令人不安。我可以添加一些记录来修复没有返回记录的情况 1,但最大的问题是情况 2。DNS 工作正常,并且 SSHFP 记录正在返回到 ssh 客户端。DNS查询响应后没有数据包发送,ssh客户端立即显示无匹配指纹消息。这意味着我正在测试的所有 ssh 客户端都已损坏,或者存储在 DNS 中的指纹错误且不匹配。我怀疑是客户端,为什么 DNS 中的指纹是错误的?指纹是从内置的 ssh 工具 ssh-keygen 生成的,如本文开头所述。此外,指纹根据上下文以不同格式显示这一事实也无济于事。

DNS record format:      ad04dfaf343a93beeb939eed1612168f7eadbed7
ssh client mesg format: 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c
Run Code Online (Sandbox Code Playgroud)

有没有人对为什么 ssh-keygen -r 输出的指纹与同一 ssh 服务器返回的公钥不匹配有任何建议?

更新3

我只能做最后的选择。除非有人在周末之前为我指出正确的方向,否则我将在周六使用完全基于 OpenBSD 的 VM 创建一个重复的环境。由于 OpenBSD 拥有 OpenSSH,这必须是 SSHFP over DNS 工作的理想条件。如果带有绑定服务于 OpenBSD OpenSSH 客户端的 OpenBSD OpenSSH 服务器不起作用,那么 SSHFP 在实现时就会被破坏,我会将内容移至 OpenBSD 论坛并可能提交错误报告。我仍然希望我遗漏了一些明显的东西,一个有用的回复可以挽救我的周末。

Mic*_*oto 5

显然我的问题是由两个不同的问题引起的。

问题 #1 SSHFP 不支持使用搜索路径。因此,如果您将“域 example.com”添加到 /etc/resolv.conf,那么您会期望 ssh myhost 与 SSHFP 一起使用,因为常规 ssh 会将名称正确解析为 myhost.example.com。显然,自从 2 年前发布补丁以来,OpenBSD 开发人员就意识到了这个问题,但从未应用过。相反,建议使用 ssh_config hack,但这似乎也不起作用。所以第一个问题的解决方案是 FQDN 必须始终与 SSHFP 一起使用。

问题#2 使用 FQDN 解决上一个问题,如果我使用 OpenSSH_6.1 的当前版本的 OpenSSH 客户端,则一切正常。我的 FreeBSD 系统上的 OpenSSH_5.8p2 客户端能够找到新的 OpenSSH_6.1 服务器的 SSHFP 记录,但是它无法将它从 DNS 接收到的指纹与它从服务器接收到的指纹进行匹配。我的 OS X 10.8.2 机器上的 OpenSSH_5.9p1 客户端甚至无法检索新 OpenSSH_6.1 服务器的 SSHFP 记录,尽管它从来不是 FreeBSD 机器的客户端版本。显然,它无法将不存在的 SSHFP 记录与 OpenSSH 服务器返回的指纹进行匹配。最后,根据抱怨 MITM 攻击的 OpenSSH_6.1 客户端,FreeBSD 机器上的 ssh-keygen 会产生错误的 SSHFP 记录,因为他们没有 t 匹配服务器返回的指纹。解决方案似乎是您必须同时运行 OpenSSH 客户端和服务器的当前版本才能使 SSHFP 正常工作。使用旧版本的客户端或服务器会带来麻烦。

最后的想法 将 SSHFP 与 DNS 一起使用显然太前沿了,不能在混合操作系统环境中使用,并且所有东西都“正常工作”,因为非 OpenBSD 操作系统必须移植 OpenSSH 可移植的,这在移植时已经过时了。或许在 3-5 年之后,SSHFP 将足够稳定,即使是移植到其他操作系统的旧版本也将稳定并与最新版本兼容。

  • 尽管 OS X (10.9) 现在包含 OpenSSH 的 6.X 版本,但由于 GitHub 报告的 OS X 实现损坏,SSHFP 仍然无法工作。替换为不同的 OpenSSH 客户端(例如来自 MacPorts 的客户端)是目前唯一的解决方案。 (2认同)