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

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

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

$ ssh-keygen -r www.test.us.
www.test.us. IN SSHFP 1 1 ad04dfaf343a93beeb939eed1612168f7eadbed7
www.test.us. IN SSHFP 2 1 432209c72c4f0e99546d601dd96c04ce804191f9

可以通过 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

但是客户端上的 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)?

关于为什么失败的任何想法?我知道需要 DNSSEC 来确保其安全,并且我应该收到警告,因为当前未启用 DNSSEC。我希望先在没有 DNSSEC 的情况下完成此工作,然后再开始解决这个问题。

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

更新

为了进一步尝试解决此问题,我建立了一个新的 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

我将它们添加到 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

这些记录显然是通过 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)? 

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

更新2

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

No matching host key fingerprint found in DNS.

数据包捕获显示 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

与 ssh www.test.us 比较;这也失败并显示消息

No matching host key fingerprint found in DNS.

然而数据包捕获显示 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`

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

DNS record format:      ad04dfaf343a93beeb939eed1612168f7eadbed7
ssh client mesg format: 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c

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

更新3

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

答案1

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

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

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

最后的想法 使用 SSHFP 和 DNS 显然过于前沿,无法在混合操作系统环境中使用,并且所有功能都“正常工作”,因为非 OpenBSD 操作系统必须移植 OpenSSH 便携式版本,而该版本在移植时已经过时了。也许在 3-5 年后,SSHFP 将足够稳定,即使移植到其他操作系统的旧版本也将稳定并与最新版本兼容。

答案2

SSH 连接到的服务器的主机名必须与 SSHFP 记录中的主机名完全匹配。也就是说,仅将两个主机名解析为相同的 IP 地址是不够的。因此,ssh www不适用于 www.test.us 的 SSHFP,除非 www 在您的 SSH 配置中如下所示:

Host www
    Hostname www.test.us

尝试ssh www.test.us

答案3

您需要提供要为其创建 DNS 记录的服务的公钥的文件名。否则,它将使用 .ssh/*.pub 中的您的个人公钥文件作为默认后备。

ssh-keygen -r vm1.test.us -f /etc/ssh/ssh_host_rsa_key.pub

相关内容