您已经看到了要点:如果您的一台机器遭到破坏,则必须“撤销”这台机器上包含的私钥:您必须配置您连接的所有服务器以拒绝使用该密钥的进一步身份验证尝试(即您删除来自.ssh/authorized_keys
服务器的相应公钥)。有一种缓解技术,其中包括使用密码(或密码)保护私钥。这是有代价的,即您必须输入密码(ssh-agent
可以很方便);另一方面,这可能会暂时阻止攻击者获取私钥(这取决于妥协的类型,但如果是盗窃整台机器 - 移动设备的合理场景 - 那么密码将阻止立即访问私钥并给您一些时间重新配置服务器)。
有人可能会注意到“PKI”的意思是“公钥基础设施”,而 SSH 在这方面是初级的。在完整的 PKI 中,将使用证书、委托和集中撤销。有证书:
- 您将创建一个 CA 密钥对,安全地存储在某处;
- 对于每台客户端机器,您将获得一个新的密钥对,公钥由 CA签名;
- 服务器将被配置为自动接受CA 签名的任何公钥(它们会知道 CA 公钥,但不知道单个客户端机器密钥);
- CA 将维护并定期发布撤销信息,即即使这些密钥已由 CA 签名也必须不再接受的公钥列表(撤销信息必须推送到服务器,或按需提取)。
证书的好处在于您可以集中决策,实际上,这意味着如果您从客户端计算机连接到 20 个服务器,然后添加新的客户端计算机,您不必手动将新的公钥推送到所有 20 台服务器。
OpenSSH从 5.4 版(2010 年 3 月 8 日发布)开始,对证书有一些支持;请参阅手册页中的同名部分ssh-keygen
。OpenSSH 证书的格式比“通常的”X.509 证书(与 SSL 一起使用)要简单得多。简化也有代价:没有集中的撤销支持。相反,如果私钥被泄露,您仍然必须将所有服务器上相应的公钥列入黑名单,而在 OpenSSH 中,黑名单是一个白名单(AuthorizedPrincipalsFile
中的选项sshd_config
),通常受root
. 所以撤销不能很好地工作,每当您创建或释放密钥时,您仍然必须在每台服务器上手动配置内容,这正是 PKI 应该废除的不便之处。
你可以仍然制作有时间限制的密钥,因为 OpenSSH 证书可以嵌入有时间限制的密钥。在这种情况下,你会给每台客户端机器一个密钥,比如一个星期。使用一周后失效的密钥和服务器已知的 CA 公钥,您拥有主要的 CA 优点(当将新机器添加到客户端池时,无需在所有服务器上推送任何内容),如果私有密钥被泄露,损害是“有限的”,假设你有一个密钥密码,大概可以抵抗一周的破解(但如果妥协是对密钥记录器的恶意收购,这将不起作用)。有时间限制的密钥会随着时间的推移变得乏味,并且他们假设所有服务器都有一个正确设置的时钟,这并不总是给定的(不幸的是,由于服务器时钟非常关闭而被锁定在服务器之外,
SSH 的另一个问题是很容易在每台服务器上添加公钥。这意味着,如果攻击者泄露了私钥并获得了对服务器的访问权一次,他可以将自己的公钥添加到.ssh/authorized_keys
该服务器上,并且再多的撤销也无法解决这个问题。撤销本质上是一个异步过程。因此,它没有实施足够严格的损害控制。
鉴于 SSH 支持证书的缺点,没有合理的方案可以避免在某些情况下必须在所有服务器上进行一些配置。因此,当您添加新的客户端计算机时,您基本上有以下选择:
您从另一台客户端计算机复制私钥(这就是您现在正在做的事情)。这不需要在服务器上进行额外配置。
您为该机器创建一个新的密钥对。您必须将公钥推送到所有服务器。
在密钥泄露出现时,您必须连接到所有服务器以从所有.ssh/authorized_keys
. 这是不可避免的(为了避免它,你必须使用证书,而 SSH 不擅长证书,见上文)。然后,如果您使用了选项 1,那么您还必须创建一个新的密钥对并将其推送到所有使用受损私钥副本的客户端计算机。
因此,在正常情况下,选择 1 比选择 2 需要更少的配置工作,但如果发生密钥泄露,情况就会逆转。由于妥协通常是罕见的事件,这将有利于选择 1(这是你已经做的)。因此,我建议您使用强密码保护您的私钥,并将其复制到您的所有客户端系统。
注意:在上述所有内容中,我假设您想使用 SSH 连接到服务器列表,并且您想从任何客户端计算机访问任何服务器。您可能希望限制访问,例如仅从一台或两台特定客户端计算机访问给定服务器。这可以通过多个客户端密钥来完成,但配置复杂性呈二次方增加。