每个使用SSH的人都知道,他们第一次连接到服务器时,会出现一条消息,确认密钥的指纹。此外,密钥存储在客户端,并且直到更改了已保存的密钥后,才会再次显示此消息。但是此程序的实际含义是什么?在现实生活中,几乎没有人在未真正考虑MiTM攻击可能性的情况下检查服务器SSH密钥的指纹。随着SSHFP DNS记录的出现,服务器密钥指纹可以存储在DNS中并使用DNSSEC进行身份验证。在这种情况下,您甚至不需要在第一次连接时确认密钥。本文将向您展示如何为SSH服务器配置SSHFP记录。测试服务器
首先,我们需要一台服务器,在RuVDS面板中,SSH访问的详细信息直接位于服务器卡上。我们保存用于连接的IP地址和密码。
您也可以直接从控制面板配置防火墙,以仅允许您的IP进行SSH访问。要配置SSHFP,必须将域定向到服务器的IP地址;我们将为此域配置DNS记录。密钥如何在SSH中工作
在示例中,我们将仅考虑OpenSSH软件包,因为这是最受欢迎的选项。安装新服务器时,会生成随机的SSH密钥,通常会在安装OpenSSH软件包时立即发生,或者在使用了现成的系统映像的首次引导过程中立即发生。密钥文件位于此处:$ ls -la /etc/ssh/ssh_host_*_key*
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
在此列表中,一次有几种不同类型的密钥:dsa,rsa,ecdsa和ed25519。这样做是为了与不同的SSH客户端兼容。在连接阶段,客户端和服务器同意使用哪种密钥算法。如果不支持建议的算法,客户端可能会要求服务器使用其他算法。服务器将其密钥的公共部分发送给客户端,并提示用户手动检查其指纹。
服务器在连接时将公钥的指纹发送给客户端,如果这是第一个连接,则会向客户端显示一条消息,请求手动验证指纹:The authenticity of host 'example.com (123.45.67.89)' can't be established.
ECDSA key fingerprint is SHA256:7Q4nIqjuo/lSXWFkt9RaJYVHrT6LUAc6KWrdQ4/DDeA.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
在此阶段,我们通常都会毫不犹豫地单击“是”,并将密钥的指纹保存到文件中~/.ssh/known_hosts
。现在,如果服务器上的密钥发生更改,将向客户端显示有关可能的MiTM攻击的消息。假设客户端第一次自行执行密钥检查并确保其真实性。这种方法具有很大的风险,因为如果攻击者设法抓住了第一次连接的时机,他将能够滑动密钥并拦截连接。对于c HTTPS,我们有第三方用证书确认服务器密钥。如果在网络上使用与SSH相同的方法,则密钥验证消息将使我们不断受苦,并且MiTM攻击将无处不在,因为没有人会检查密钥,而只会始终同意。我们将密钥打印存储在DNS中。什么是SSHFP条目
如何确定服务器提出的SSH密钥是真实的,而不是MiTM攻击?实际上,为了进入服务器并验证密钥,您必须首先输入密码。但是随后,攻击者将能够立即对服务器进行黑客攻击并替换其上的所有数据,以至于我们不会注意到该问题。因此,我们需要一种在真实连接之前验证密钥真实性的方法。长期以来,在连接前检查服务器SSH密钥的唯一方法是使用其他通道,例如,请服务器管理员提供服务器密钥指纹。这很不方便,因此更容易忽略问题并始终毫不犹豫地达成协议。
SSHFP允许服务器密钥认证,然后再通过SSHFP DNS连接-用于存储SSH密钥的DNS记录的类型。SSH密钥的指纹像TXT记录一样放置在DNS服务器中,并用DNSSEC密钥签名。也就是说,第一次使用主机名连接到服务器时,客户端将能够预先通过DNS知道服务器密钥的指纹,如果它与建议的服务器匹配,则无需警告即可连接。配置DNSSEC
要使用SSHFP,您需要一个配置了DNSSEC的域名。有许多公共DNS服务可立即提供具有DNSSEC功能的DNS控制面板。最受欢迎的此类服务是CloudFlare。使用他的示例考虑配置。对于以下步骤,必须将域委派给Cloudflare NS服务器。▍步骤1-产生金钥
转到DNS面板->启用DNSSEC。此时,将生成密钥来对您的域区域进行签名。您将看到公共密钥。它们将需要添加到域名注册机构的一侧。▍第2步-向注册商添加公钥
接下来,您需要创建包含来自域注册商的公钥的DS记录。根据您的注册商,DNSSEC密钥添加界面可能看起来有所不同。请勿混淆这些值,因为它们的名称可以不同,也可以与CloudFlare中显示的名称不同。下面的示例显示了CloudFlare面板中显示的值与Uniregistry注册商的域控制面板中的值之间的关系。
▍步骤3-检查已添加的DS记录
在注册商的侧面添加DS记录后,您可以检查设置是否正确。在CloudFlare方面,仅当通过了在注册服务商方面添加DS记录的正确性验证时,才会激活DNS记录的签名。
等待添加DS记录几分钟或几小时后,如果正确添加了记录,您将看到这样的消息。这意味着现在使用DNSSEC对DNS响应进行签名。
▍步骤4-验证DNSSEC操作
现在,您可以使用dnssec-analyzer.verisignlabs.com等在线服务在我们的域上测试DNSSEC的运行情况。所有复选标记应为绿色。
DNSSEC验证结果添加SSHFP条目
我们将在服务器上生成SSHFP记录。在我们的示例中,我们正在管理地址为myserver.com的服务器。对于此域名,我们先前已配置DNSSEC。在服务器上,执行以下命令:
sudo ssh-keygen -r myserver.com
myserver.com IN SSHFP 1 1 057ecce168ace29d5a0099e3b63df2850e4c8e20
myserver.com IN SSHFP 1 2 52cd6099a304b9b8f57f2cd914e96a1b7477eb2f88c98c602
myserver.com IN SSHFP 2 1 42d677482e4450ee515d3aac94d96302a99bd4ec
myserver.com IN SSHFP 2 2 edda5fa445dc0da570c772a6df0d4012037e1a102840d29c4
...
将为/ etc / ssh /文件夹中的所有键生成指纹。您可以通过指定文件路径来有选择地为特定密钥生成指纹。现在,所有这些记录都需要添加到DNS面板中(在我们的案例中为Cloudflare)。
将SSHFP记录添加到Cloudflare面板因此,您需要添加在上一步中获得的所有密钥。现在,您可以验证是否添加了密钥:dig SSHFP myserver.com
在答案中,您应该看到所有添加的键。签署新条目可能需要一些时间,因此响应中的键可能不会立即显示。这通常不会超过10-15分钟。连接到服务器
为了使SSH客户端能够通过DNS验证密钥的有效性,您需要在设置中添加启用此功能。客户端配置位于用户的主文件夹中。在此添加一行。
vi ~/.ssh/config
VerifyHostKeyDNS yes
现在您可以连接到服务器了。为了实验的纯洁,您可以从〜/ .ssh / known_hosts中删除带有指纹的行。为了清楚起见,您可以添加-v选项
ssh -v root@myserver.com
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
.....
DNS lookup error: data does not exist
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
....
debug1: found 8 insecure fingerprints in DNS
debug1: matching host key fingerprint found in DNS
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
....
debug1: found 8 secure fingerprints in DNS
debug1: matching host key fingerprint found in DNS
debug1: ssh_rsa_verify: signature correct
如果一切配置正确,那么在您首次连接到服务器时,将不会要求您手动验证密钥的指纹。这也需要系统DNS解析器支持DNSSEC验证。重要的是要记住,SSHFP仅在通过域名连接到服务器时才起作用,而在通过IP或没有SSHFP记录的其他域连接时才起作用。