第四章:验证服务器密钥

如果你多疑,或者你做系统管理员的时间超过一周,你需要确保你登录的服务器是你认为自己登录的服务器。服务器密钥有助于在与错误的计算机交换身份验证信息之前验证服务器的身份。

通过未加密、未经身份验证的协议进行的网络连接很容易被转移到错误的机器上。控制公共可访问设备(如服务器)的入侵者可以使其伪造不同服务器的身份。每个登录到欺骗服务器的用户都会向入侵者提供自己的用户名和密码。入侵者通常会将会话转发到实际的目标主机,这样用户就永远不会意识到他们已经被抓住了。这是一种经典的网络攻击,至今仍普遍存在;协议改变了,应用程序也改变了,但中间人攻击和欺骗永远存在。

如果部署和使用得当,SSH可以彻底消除这些攻击。即使入侵者可以使一台机器与另一台机器相似,即使他复制了登录提示、网站和操作系统版本,除非他已经控制了服务器,否则入侵者也无法复制目标服务器的私钥。没有私钥,欺骗服务器无法解密通过服务器公钥传输的任何内容。

SSH服务器密钥向客户端验证服务器的身份。它们很重要,而不是你只需按 ENTER 键即可接受的东西。

每个SSH服务器都有一个或多个唯一的公钥,如第1章所述。SSH客户端第一次连接到SSH服务器时,它会向用户显示服务器的公钥指纹。用户需要将显示的指纹与服务器的密钥指纹进行比较。如果它们匹配,则用户告诉其SSH客户端缓存密钥,然后继续连接。如果密钥不匹配,用户将终止连接。

在与服务器的所有后续连接中,客户端将其缓存的密钥与服务器提供的密钥进行比较。如果密钥匹配,连接将继续。如果密钥不匹配,客户端会认为出了问题,并请求用户干预。

为了使SSH服务器密钥有用,您必须验证客户端显示的密钥是否与目标服务器提供的密钥相同。然而,公钥的长度为几百个字符。系统管理员实际上无法要求用户将数百个字符与已知的良好密钥列表进行比较;大多数用户会自动将任务视为不可能。解释说这很有可能,但非常乏味和烦人,并不能改善讨论。

SSH用密钥指纹总结公钥。

第四章:验证服务器密钥密钥指纹使主机密钥指纹可用主机密钥和OpenSSH 客户端主机密钥和 PuTTY 客户端当密钥不匹配时

密钥指纹

密钥指纹是公钥的几乎人类可读的摘要。任何用户都可以获得公钥指纹;如果你需要私钥指纹,你需要成为root。使用 ssh-keygen(1) 程序查看密钥的指纹,使用 -l 打印指纹,使用 -f 指定密钥文件。以下示例查看了此主机的ED25519密钥的指纹:

我们看到这个密钥使用256位SHA-256。指纹本身是一个以JwmD开头、以cIWkY结尾的长字符串。之后,我们有生产指纹的用户和主机,以及括号中的密钥类型。

服务器和客户端协商使用哪个密钥进行连接。客户端可能会向用户提供任何支持的密钥,因此你需要服务器上的每个公钥的指纹。收集所有指纹的最简单方法是将他们复制到文件中:

现在把这些指纹发给你的用户。

您可以使用 ssh-keyscan(1) 从SSH服务器检索密钥指纹,但必须根据服务器的公钥验证这些指纹。当你这样做的时候,你最好从服务器本身提取公钥指纹。然而,ssh-keyscan 程序对于验证主机的公钥指纹是否没有更改非常有用。

使主机密钥指纹可用

首先连接到SSH服务器的用户应将其客户端中出现的主机密钥指纹与已知的良好主机密钥指纹进行比较。不过,真正的用户只有在比较过程简单的情况下才会这么做。系统管理员需要使指纹比较简单又安全。最简单的方法可能是在组织内部可访问的加密网站上显示密钥指纹。当员工需要SSH访问服务器时,在你给他们登录凭据时,给他们一个指向指纹页面的链接。不要在不安全的媒体上分发密钥指纹,如果电子邮件或未加密的网站。

第十一章提供了自动分发密钥和指纹的方法。部署这些方法消除了用户手动验证密钥的需要,同时提高了合规性并减少了每个人的工作量。

如果你在运行OpenSSH客户端,则可以使用密钥证书(第14章)、SSHFP记录(第11章)或两者来简化密钥验证。包括PuTTY在内的其他客户端很少支持这些协议。

主机密钥和OpenSSH 客户端

当你第一次使用OpenSSH客户端 ssh(1) 连接到SSH服务器时,你会收到一个提示,要求验证密钥:

这是你验证OpenSSH服务器实际上是你认为的主机的机会。OpenSSH为你提供了ECDSA密钥指纹。获取你的服务器密钥列表,并将列表中的ECDSA密钥指纹与客户端中显示的ECDSA密钥指纹进行比较。如果密钥指纹匹配,请键入 yes 以缓存已验证的密钥并继续连接。你将收到一条与以下内容非常相似的消息:

下次连接到此主机时,ssh(1) 会将缓存的主机密钥与服务器上的主机密钥进行比较,并静默安全地连接,或大声安全地断开连接。

如果密钥不匹配,ssh(1) 会立即断开连接,而不缓存密钥。立即通知你的系统管理员和/或安全团队密钥不匹配。

OpenSSH还支持一种更简单的比较密钥指纹的方法,称为 randomart 。randomart图像是对关键指纹的视觉解释。然而,这是一种非标准表示。随意尝试randomart,但不要假设它是普遍可用的。

主机密钥和 PuTTY 客户端

当你第一次使用PuTTY连接到服务器时,会收到一条安全警告。

4-1

将客户端中显示的密钥指纹与列表中的密钥指纹进行比较。

请注意,PuTTY使用RSA密钥协商连接,这与OpenSSH与其OpenSSH服务器之间商定的ECDSA密钥不同。

当密钥不匹配时

如果主机密钥已更改,您将收到类似这样的消息:

看起来很吓人的东西?应该是的。发生了可怕的事情。你的SSH客户端正在尖叫,说有些事情非常错误。如果你的笔记本电脑是救护车,灯光会旋转,警报器会鸣响。用于识别该系统的超级秘密主机密钥对已经改变。这可能是由于以下六个原因之一。确定哪些需要与系统管理员交谈。

如何确定你遇到的是哪种情况?问系统管理员。在确定问题之前,不要连接服务器。 所有这些都是需要调查的严重错误。

如果密钥更改是出于合法原因,核对新的密钥。如果密钥正确,用新的密钥替换掉旧的。PuTTY可以为你替换密钥,但是OpenSSH需要你自己编辑密钥缓存文件,在第5章中会详细介绍。错误消息给出了 known_hosts 文件中包含的废弃密钥的行。如果密钥让肉不正确,请再次与系统管理员联系。合法的SSH密钥更改可能会掩盖非法的入侵者;新安装的服务器在第一次合法登录之前可能就已经被攻破了。

当主机密钥更改时,您可以覆盖SSH客户端拒绝连接到机器的情况,或者不缓存新密钥,但请记住,SSH不仅仅是验证服务器和保护传输中的数据。完成的连接还会将您的身份验证信息传递给SSH服务器。如果你把你的用户名和密码给了一台被入侵的机器,你就把你的密码和用户名给了入侵者。如果您在多台机器上使用相同的密码,则无法再信任其中任何一台。现在取消你的周末计划,也可能取消下周末的计划。您将忙于从备份中恢复和管理愤怒的客户。

不匹配的密钥消息是SSH工作的标志。使用它。