JWS 密钥轮换¶
JWS 令牌提供程序使用非对称签名颁发令牌。本文档试图描述如何在需要相互验证令牌的 keystone 节点部署中管理密钥对。
使用非对称密钥的固有优势在于,每个 keystone 服务器都会生成自己的密钥对。私钥用于签名令牌。任何拥有公钥权限的人都可以验证令牌签名。这是在 keystone 节点集群中验证令牌的关键步骤。
操作员需要在所有 keystone 节点之间同步公钥。每个 keystone 服务器都需要每个节点的相应公钥。这仅适用于公钥。私钥绝不能离开生成它们的服务器。
初始设置¶
在 keystone 服务器部署可以颁发 JWT 令牌之前,每个服务器必须设置 keystone.conf [token] provider = jws。此外,每个 API 服务器都必须拥有自己的非对称密钥对,这些密钥对可以手动生成,也可以使用 keystone-manage create_jws_keypair 生成。如果您手动生成密钥对,它们必须可用于 ES256 JSON Web 算法 (JWA)。值得注意的是,keystone-manage create_jws_keypair 命令行实用程序将创建一个合适的密钥对,但它不会自动将其部署到 keystone.conf [jwt_tokens] 中定义的密钥库位置。操作员需要相应地移动这些文件并解决可能的文件名冲突。
生成密钥对后,每个 API 服务器的公钥必须与部署中的每个其他 API 服务器共享。确保用于签名 JWS 令牌的私钥可被运行 keystone 的进程读取,并且位于 keystone.conf [jwt_tokens] jws_private_key_repository 位置。Keystone 将自动使用名为 private.pem 的密钥来签名令牌,并忽略存储库中的所有其他密钥。为了验证令牌,keystone 将迭代 keystone.conf [jwt_tokens] jws_public_key_repository 中所有可用的公钥。至少,此存储库需要拥有与 keystone.conf [jwt_tokens] jws_private_key_repository 中找到的 private.pem 密钥对应的公钥。
持续操作¶
根据部署的安全要求,您可能需要轮换现有的密钥对。为了在过早使令牌失效的情况下执行此操作,请遵循以下步骤
为给定的 keystone API 服务器生成新的非对称密钥对(有关更多详细信息,请参阅
keystone-manage create_jws_keypair)将新生成的公钥复制或同步到所有其他 keystone API 服务器的公钥存储库,公钥应放置在
keystone.conf [jwt_tokens] jws_public_key_repository中将新的私钥复制到您正在执行轮换的 API 服务器上的私钥存储库,并确保其命名为
private.pem。此时,服务器将开始使用新的私钥签名令牌,并且所有其他 keystone API 服务器都能够验证这些令牌,因为它们已经拥有来自步骤 #2 的公钥副本此时,您必须等待使用旧私钥签名的最后一个令牌到期,然后才能从每个 keystone API 服务器中删除旧的相应公钥。请注意,这至少应为
keystone.conf [token] expiration一旦您确信所有使用旧私钥签名的令牌都已过期,就可以安全地从部署中的每个 API 服务器中删除旧的相应公钥,这很重要,以防原始私钥被泄露,并防止攻击者使用它来创建自己的令牌