如果你多疑,或则你要管理多个服务器。服务器密钥有助于在与错误的计算机交换身份验证信息之前验证服务器的身份。
通过未加密、未经身份验证的协议进行的网络连接很容易被转移到错误的机器上。
控制公共可访问设备(如服务器)的入侵者可以使其伪造不同服务器的身份。每个登录到欺骗服务器的用户都会向入侵者提供自己用户名和密码。入侵者通常会将会话转发到实际的目标主机,这样用户就永远不会意识到他们已经被黑了。中间人攻击和欺骗是一种经典的网络攻击,至今仍普遍存在。
如果部署和使用得当,SSH可以彻底消除这些攻击。即使入侵者可以使一台机器与另一台机器相似,即使他复制了登录提示、网站和操作系统版本,除非他已经控制了服务器,否则入侵者也无法复制目标服务器的私钥。没有私钥,欺骗服务器无法解密通过服务器公钥传输的任何内容。
SSH服务器密钥向客户端验证服务器的身份。它们很重要,而不是你只需按回车即可接受的。
每个SSH服务器都有一个或多个唯一的公钥,如第1章所述。SSH客户端第一次连接到SSH服务器时,它会向用户显示服务器的公钥指纹。用户需要将显示的指纹与服务器的密钥指纹进行比较。如果它们匹配,则用户告诉其SSH客户端缓存密钥,然后继续连接。如果密钥不匹配,用户将终止连接。
在与服务器的所有后续连接中,客户端将其缓存的密钥与服务器提供的密钥进行比较。如果密钥匹配,连接将继续。如果密钥不匹配,客户端会认为出了问题,并请求用户干预。
为了使SSH服务器密钥有用,您必须验证客户端显示的密钥是否与目标服务器提供的密钥相同。然而,公钥的长度为几百个字符。系统管理员实际上无法要求用户将数百个字符与已知的良好密钥列表进行比较;大多数用户会自动将任务视为不可能。解释说这很有可能,但非常乏味和烦人,并不能改善讨论。
密钥指纹是公钥的几乎人类可读的摘要。任何用户都可以获得公钥指纹;如果你需要私钥指纹,你需要成为root。
使用ssh-keygen程序查看密钥的指纹,使用-l打印指纹,使用-f指定密钥文件。
以下示例查看了此主机的ED25519密钥的指纹:
xxxxxxxxxx
$ cd /etc/ssh
$ ssh-keygen -lf ssh_host_ed25519_key.pub
256 SHA256:JwmD+yFwH83rPdhorge/S6qxXAUy3/G0CvFqTrcIWkY root@www (ED25519)
我们看到这个密钥使用256位SHA-256。指纹本身是一个以JwmD开头、以cIWkY结尾的长字符串。之后,我们有生产指纹的用户和主机,以及括号中的密钥类型。
服务器和客户端协商使用哪个密钥进行连接。客户端可能会向用户提供任何支持的密钥,因此你需要服务器上的每个公钥的指纹。收集所有指纹的最简单方法是将他们复制到文件中:
xxxxxxxxxx
$ ssh-keygen -lf ssh_host_ed25519_key.pub > $HOME/fingerprints.txt
$ ssh-keygen -lf ssh_host_ecdsa_key.pub >> $HOME/fingerprints.txt
$ ssh-keygen -lf ssh_host_rsa_key.pub >> $HOME/fingerprints.txt
现在把这些指纹发给你的用户。
您可以使用ssh-keyscan(1)从SSH服务器检索密钥指纹,但必须根据服务器的公钥验证这些指纹。当你这样做的时候,你最好从服务器本身提取公钥指纹。然而,ssh-keyscan程序对于验证主机的公钥指纹是否没有更改非常有用。
首先连接到SSH服务器的用户应将其客户端中出现的主机密钥指纹与已知的良好主机密钥指纹进行比较。
不过,真正的用户只有在比较过程简单的情况下才会这么做。系统管理员需要使指纹比较简单又安全。最简单的方法可能是在组织内部可访问的加密网站上显示密钥指纹。当员工需要SSH访问服务器时,在你给他们登录凭据时,给他们一个指向指纹页面的链接。
不要再不安全的媒体上分发密钥指纹,如果电子邮件或未加密的网站。
第十一章提供了自动分发密钥和指纹的方法。部署这些方法消除了用户手动验证密钥的需要,同时提高了合规性并减少了每个人的工作量。
如果你在运行OpenSSH客户端,则可以使用密钥证书、SSHFP记录或两者来简化密钥验证。包括PuTTY在内的其他客户端很少支持这些协议。
当你第一次使用OpenSSH客户端ssh连接到SSH服务器时,你会收到一个提示,要求验证密钥:
xxxxxxxxxx
$ ssh gluttony
The authenticity of host 'gluttony (203.0.113.213)' can't be established.
ECDSA key fingerprint is SHA256:jovou1bQ0S1Ex6QBjo4T+0+FzwzyTXLqxF/aPudVTnk.
No matching host key fingerprint found in DNS.
这是你验证OpenSSH服务器实际上是你认为的主机的机会。OpenSSH为你提供了ECDSA密钥指纹。获取你的服务器密钥列表,并将列表中的ECDSA密钥指纹与客户端中显示的ECDSA密钥指纹进行比较。如果密钥指纹匹配,请键入yes以缓存已验证的密钥并继续连接。你将收到一条与以下内容非常相似的消息:
xxxxxxxxxx
Warning: Permanently added 'gluttony' (ECDSA) to the list of known hosts.
下次连接到此主机时,ssh会将缓存的主机密钥与服务器上的主机密钥进行比较,并静默安全地连接,或大声安全地断开连接。
如果密钥不匹配,ssh会立即断开连接,而不缓存密钥。立即通知你的系统管理员和/或安全团队密钥不匹配。
OpenSSH还支持一种更简单的比较密钥指纹的方法,成为randomart。randomart图像是对关键指纹的视觉解释。然而,这是一种非标准表示。随意尝试randomart,但不要假设它是普遍可用的。
当你第一次使用PuTTY连接到服务器时,会收到一条安全警告。
将客户端中显示的密钥指纹与列表中的密钥指纹进行比较。
请注意,PuTTY使用RSA密钥协商连接,这与OpenSSH与其OpenSSH服务器之间商定的ECDSA密钥不同。
如果主机密钥已更改,您将收到类似这样的消息:
xxxxxxxxxx
$ ssh gluttony
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:TSJ39GppnUdf8JX6J0oAf9+Cga2LzLNXX+tid54lfo4.
Please contact your system administrator.
Add correct host key in /home/mwlucas/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/mwlucas/.ssh/known_hosts:5
ECDSA host key for gluttony.mwl.io has changed and you have requested strict checking.
Host key verification failed.
服务器密钥发生改变,可能是以下六个原因之一,请与系统管理员确认。
如何确定你遇到的是哪种情况?问系统管理员。
在确定问题之前,不要连接服务器。
如果密钥更改是出于合法原因,核对新的密钥。如果密钥正确,用新的密钥替换掉旧的。
PuTTY可以为你替换密钥,但是OpenSSH需要你自己编辑密钥缓存文件,在第五章中会详细介绍。
错误消息给出了known_hosts文件中包含的废弃密钥的行。如果密钥让肉不正确,请再次与系统管理员联系。合法的SSH密钥更改可能会掩盖非法的入侵者;新安装的服务器在第一次合法登录之前可能就已经被攻破了。
当主机密钥更改时,你可以覆盖SSH客户端拒绝连接计算机的行为,或者不缓存新密钥,但要记住,SSH不只是验证服务器并保护传输中的数据。完整的连接还将你的身份验证信息传递给SSH服务器。如果你将用户名和密码交给被入侵的机器,就等于把入侵者手中的用户名和密码给了他。
如果你在多台机器上使用相同的密码,那么你将不再信任任何一台机器。
不匹配的密钥消息是SSH正常工作的标志。请使用它。