发布公共 PGP 身份验证子密钥是否安全?

信息安全 公钥基础设施 SSH pgp gnupg 优比键
2021-09-07 12:38:30

假设我有一个 PGP 密钥设置如下:

我有一个离线主公钥/私钥对,它设置为只有 Certify,也就是创建子密钥并签署其他人的密钥。

然后我创建了三个放在 Yubikey 上的子键(带有离线备份):

  • 签名密钥
  • 加密密钥
  • 认证密钥

签名密钥将用于签署消息和 git 提交。

加密密钥将用于人们向我发送加密消息。

身份验证密钥将用作sshgpg-agent --enable-ssh-support身份验证以登录服务器。

我的问题是:

将身份验证子密钥(或所有三个公共子密钥)发布到密钥服务器是否有任何负面(或正面?)安全隐患?

我的逻辑是我只需要发布签名公共子密钥,这样人们就可以确认我的签名和我的加密公共子密钥,这样人们就可以向我发送加密消息。

“公众”中的任何人都不需要知道我什至有一个身份验证密钥,因为它只会在authorized_keys我的服务器文件中使用,以允许我无需密码即可登录。

如果有人要闯入服务器并查询authorized_keys文件中的公钥,他们可以在密钥服务器中查找并发现我正在使用该服务器。这是有问题还是我想多了?

4个回答

通过向潜在攻击者提供不必要的密钥,您违反了最小权限原则(为什么其他人应该有权查看您的公钥?)。如果他们不必知道,那么帮助他们推断出更多信息是没有意义的,例如您的 SSH 密钥的密钥类型(RSA、ECDSA、...)和大小(例如 2048 位)以查找攻击向量。从中,他们可以对您通常如何保护系统、切换到新技术的速度以及您的偏执程度做出更明智的猜测(嗯,仍在使用 1024 位 RSA?哦,512 位 ECDSA,有趣...)。

想象一下,在生成密钥的那一刻,您不知道现在可以在普通笔记本电脑上破解 512 位 RSA 密钥。主动在线搜索此类密钥的攻击者会立即将您标记为容易攻击的目标。或者想象你忘记更换那个密钥和/或忘记你的服务器(或者你根本不再活着进行更改)。X 年后,您的 2048 位 RSA 密钥的私有部分可以在更先进的计算系统上计算,您在服务器上的数据将面临风险。它可能不再影响您,但也许您存储了仍然关心保密的其他人的数据。

当然,这些情况不太可能发生(除了使用弱密钥,这种情况经常发生在人们身上;如果熵池的状态很差,即使是 4096 位 RSA 密钥也毫无价值,看看世界在生成好的密钥方面是多么缺乏),并且可能 SSH 中的一个错误将允许在您的密钥被破解之前利用您的服务器,但它们的概率不为零,您至少应该在发布比您需要的更多数据之前考虑它们。如果您考虑过这些场景,应该没问题,但我们都知道没有人可以预测所有的攻击场景或影响,因此完全不必考虑它们会更容易。

如果您需要上传 SSH 身份验证密钥以进行查找,例如配置新服务器的 authorized_keys 文件,最好将其托管在难以猜测的 URL 上,例如 www.mydomain.com/download/myAwesomePublicSSHkey.pub

是的,你的逻辑是合理的。您只需要发布您的公钥以允许人们向您发送加密消息并检查您的签名。但是,没有理由为 SSH 发布您的公钥,这并不是说您无论如何都做不到。无论哪种方式,它都不会影响您的安全。如果确实有人碰巧获得了您的公钥,那么他们唯一可以做的就是从您那里识别 SSH 会话的开始,这真的不应该打扰您,除非在某种我无法理解的极端情况下现在。

安全性取决于您的用例:

  • 有人可以使用您的公共身份验证密钥攻击服务器吗?
    • 不。
  • 如果有人闯入您的服务器,他是否能够知道您的电子邮件地址?
    • 是的。但也许该人在没有您的公共身份验证密钥的情况下也找到了您的电子邮件地址。
  • 如果有人从密钥服务器获取您的公共身份验证密钥,该人是否能够找出它在哪个服务器上使用?
    • 我不知道,但您可以通过查看身份验证密钥的详细信息来检查它。
  • 有人能够从您的公钥中获取您的私人身份验证吗?
    • 不,只要密钥足够强(例如 >= 2048 位 RSA)
  • 你需要公开问自己所有这些问题吗?
    • 这取决于您的用例;)

我认为发布身份验证密钥可以简化网络钓鱼和 MITM 攻击。有人恶意将您的密钥插入authorized_keys并为您提供此服务器而不是您自己的服务器(例如使用 DNS 欺骗)。是的,此服务器不会在您的列表中列出,known_hosts您可以推断出伪造,但仍然如此。

不发布身份验证密钥还有另一个论点——大小。请注意,PGP 和 GnuPG 都不喜欢大照片。任何额外发布的数据都意味着密钥服务器和其他机器检查您的签名或加密发送给您的数据需要更多的工作。

请注意,您还必须发布您的证书公钥,用于签署密钥,包括(但不限于)您自己的。但是当前的 PGP 实现只允许验证主密钥的使用,并且您不能在没有主密钥的情况下导出公共子密钥,因此无论如何您的验证公共密钥都会被发布。

UPD:如果有人为公共或企业服务器发明了 GPG 身份验证,例如使用 X.509 证书,但使用在密钥服务器中找到的 GPG 密钥,那么您可以重新考虑。 一些 尝试,但看起来他们现在都死了 但即使发生这种情况,我也会为此类系统创建单独的身份验证子密钥并仅上传此子密钥。