使用DNSSEC更安全的SSH连接


每个使用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。

在服务器上,执行以下命令:

#   SSHFP   SSH-
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


# DNS  ,  SSHFP 
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
.....
DNS lookup error: data does not exist

# DNS  ,   
#    DNSSEC
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


# DNS  ,    DNSSEC
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记录的其他域连接时才起作用。


All Articles