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


13

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。我已经尝试从OS X 10.8.2与OpenSSH_5.9p1以及Arch Linux 3.6.10-1-ARCH与OpenSSH_6.1p1连接。

更新资料

为了进一步解决此问题,我站了一个新的OpenBSD 5.2 VM,该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`

首先,有点令人不安的是,两种情况下的错误消息都是相同的。我可以添加一些记录来修复第一种情况,其中不返回任何记录,但是最大的问题是第二种情况。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

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

更新3

我现在只能选择最后一个选择。除非有人在周末之前为我指明正确的方向,否则我将花费星期六在使用完全基于OpenBSD的VM创建重复环境的过程中使用。由于OpenBSD拥有OpenSSH,因此这对于通过DNS的SSHFP来说必须是理想的条件。如果具有绑定功能的OpenBSD OpenSSH服务器无法为OpenBSD OpenSSH客户端提供服务,则SSHFP已被破坏,因此我会将其移至OpenBSD论坛,并可能提交错误报告。我仍然希望我遗漏了一些明显的内容,并且有用的回复将节省我的周末时间。


您是否尝试连接以显式连接www.test.us
Ulrich Dangel 2013年

是。抱歉,我应该提到我尝试了所有变体:ssh www; ssh www.test.us; ssh www.test.us .; 所有这些都导致相同的响应。
Michael Yasumoto

从Wireshark / tcpdump中查看DNS服务器正在查询什么以及发送了什么响应,可能会很有趣。了解确切的查询和响应应该有助于发现问题。
2013年

格特,我在上面的更新中回复了,因为我无法将回复放入此评论框中。
Michael Yasumoto

尝试直接通过IP地址进行连接-对我来说,sshDNS记录与您尝试访问的主机名不匹配,这使我感到困惑。
彼得

Answers:


5

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

问题#1 SSHFP不支持使用搜索路径。因此,如果将“ domain example.com”添加到/etc/resolv.conf中,则您将期望ssh myhost与SSHFP一起使用,因为常规ssh会将名称正确解析为myhost.example.com。显然,自2年前发布补丁以来,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攻击,因为它们没有 t与服务器返回的指纹匹配。解决方案似乎是您必须同时运行OpenSSH客户端和服务器的当前版本,SSHFP才能正常工作。使用客户端或服务器的旧版本会引起麻烦。

最终想法 将SSHFP与DNS一起使用显然是太前沿了,无法在混合OS环境中使用,并且一切都“正常”,因为非OpenBSD OS必须移植OpenSSH Portable,因为移植时它已经过时了。也许在3-5年内,SSHFP将会足够稳定,以至于即使移植到其他OS的旧版本也将保持稳定并与最新版本兼容。


2
尽管OS X(10.9)现在包括OpenSSH的6.X版本,但是SSHFP仍然无法正常工作,因为GitHub报告了OS X实施的失败。当前,用另一个OpenSSH客户端(例如MacPorts的客户端)替换是唯一的解决方案。
Michael Yasumoto 2014年

0

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

Host www
    Hostname www.test.us

尝试ssh www.test.us


1
抱歉,看来您还没有阅读我上面的完整文章。我使用完全合格域名(FQDN)进行了测试,这不是问题。
Michael Yasumoto 2014年

0

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

ssh-keygen -r vm1.test.us -f /etc/ssh/ssh_host_rsa_key.pub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.