【问题标题】:Storing RSA keys in a clustered authentication service在集群身份验证服务中存储 RSA 密钥
【发布时间】:2021-12-17 10:22:50
【问题描述】:

我想构建一个身份验证服务,该服务使用 JWT 和使用 RS256 生成的签名。在单服务器解决方案中,实现相当简单。但是,当涉及到使其成为多节点时,有两个相关的问题我没有找到明确的答案:

  1. 在集群解决方案中,每个服务器应该使用自己的密钥对还是多个节点可以使用共享密钥对?在那种情况下如何有效地构建一个不包含太多键的 JWK?

  2. 另一方面,如果可以在不引起重大安全问题的情况下共享私钥,那么共享密钥和管理其轮换的最佳方法是什么?

【问题讨论】:

    标签: authentication jwt rsa cluster-computing hmac


    【解决方案1】:

    如果可能 (IMO),您应该使用单个私钥来签署访问令牌。

    拥有多个只会增加复杂性(例如,后端资源服务器需要逻辑来计算出用于 JWT 验证的公钥,或者循环通过多个公钥来验证 JWT),我并没有真正看到任何安全利益。

    FWIW 可能有商业原因需要在后端支持多个,例如如果您的公司有多个具有不同身份验证租户/登录域的产品,您可能需要支持共享后端服务/功能中的多个密钥 - 对于这种类型的场景,您需要使用诸如令牌发行者之类的东西( iss) 声称确定用于 JWT 验证的公钥。

    WRT 旋转键;如果您使用的是像 Auth0 这样的 PaaS IDP,它可能已经为您处理好了。如果您使用像 Keycloak 这样的 COTS 产品(或者如果您已经推出了自己的 IDP),则需要在 JWKS 端点中定义多个公钥(尽管是临时的)。新密钥将被指定为“活动”,并将用于签署所有后续令牌,而旧密钥将被指定为“被动”,仅需要验证在轮换之前发布且尚未发布的访问令牌已到期。 注意:一旦使用旧密钥签名的所有访问令牌都过期,您可能可以停用/删除旧密钥。

    Here's a link 转至 Keycloak 文档,了解可能有用的旋转密钥。

    在您进行 JWT 验证的后端服务中,应缓存与 JWT 上的密钥 ID (kid) 声明相对应的公钥。如果使用新私钥对请求进行签名,则 JWT 应该具有不同的密钥 ID。如果后端服务遇到新的密钥 ID,它应该懒惰地返回 JWKS 端点以获取与新密钥 ID 关联的公钥(然后这也应该被缓存)。

    在最常见的编程语言中,有一些库可以为您处理大部分内容,例如我已经使用 Microsoft.AspNetCore.Authentication 包在 .NET Core 中完成了 JWT 验证,我需要做的就是配置一个 Open ID matadata 端点(它引用 JWKS 端点),并且诸如密钥轮换和缓存之类的事情都是透明地处理的。

    【讨论】:

    • 嗨瑞恩,感谢您的解释。我需要澄清一点我认为:我正在构建一个可能需要在多台机器上扩展的身份验证服务。然后应该对流量进行负载平衡。如果我需要使用我刚刚描述的架构扩展我的身份验证服务(负责签署令牌),我应该如何处理私钥(如果我不想依赖外部服务)?我应该在各个节点之间传递相同的私钥(显然使用加密通信)吗?或者我应该为每个节点使用独立的密钥。你能澄清这一点吗?
    • 从技术上讲,您可以为每个授权服务器节点设置不同的密钥对(私钥/公钥集)。如果你采用这种方法。每个公钥都需要在 JWKS 端点中定义一个相应的密钥 ID (kid),以便后端服务可以计算出正确的公钥以用于 JWT 验证。就我个人而言,我只会在所有节点上使用相同的密钥对。就像我说的那样,我并没有真正看到拥有多个密钥的任何安全好处(除了密钥轮换,这是暂时的) - 如果/当其中一个私钥被泄露时,它不会减少影响。
    • ...所以我查看了一些 Auth0 租户以及 Azure AD 的 JWKS 端点。我查看的 Auth0 租户都定义了 2 个密钥,而 AAD 定义了 7 个!...我实际上不确定为什么...我发现这个 SO - stackoverflow.com/questions/43978673/… - 它谈到 AWS Cognito 也有 2 个密钥(像Auth0)。建议 1 用于 ID 令牌,1 用于访问令牌...仍然没有解释为什么 AAD 有 7...
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多