添加 Crypto/HSM MKEK 轮换和迁移支持(轻量级)

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/barbican/+spec/add-crypto-mkek-rotation-support-lightweight

目前 Barbican 没有将使用 crypto/HSM 风格插件加密的密钥迁移到新的主密钥加密密钥 (MKEK) 及其关联的包装项目 KEK 的方法。此蓝图提出添加一个新的 Barbican 工具,支持通过使用新的 MKEK 重新包装项目 KEK 来完成轮换过程。请注意,与 [1] 中同名的蓝图不同,此蓝图要求重新加密密钥,因此是该蓝图的“轻量级”替代方案。

比较这两种方法,这种轻量级方法只是轮换 MEK 并重新包装项目 KEK,而每个密钥的加密数据保持不变。另一种蓝图轮换 MKEK、项目 KEK 和加密的密钥信息。

因此,此蓝图具有不太彻底的密钥轮换过程,这可能会增加解密密钥加密数据的可能性。然而,预计这种攻击的可能性很小。毕竟,由于 MKEK 被猜测或泄露的可能性很低,因此 MKEK 的轮换频率很低。预计此蓝图的较不彻底的方法执行速度更快,并且在数据库中存储了大量密钥时,流程强度更低。

与另一个蓝图类似,此工具将在部署者完成以下操作后启动,以独立方式

  1. 使用绑定到新标签生成新的 MKEK 和 HMAC 签名密钥,然后

  2. 将这些密钥复制到可能在高可用性 (HA) 组中的其他 HSM,然后

  3. 更新 Barbican 的配置文件以引用这些新标签,最后

  4. 重新启动 Barbican 节点。

然后,建议的工具将使用新的 MKEK 重新包装项目 KEK,并使用新的包装项目 KEK 更新关联的项目 KEK 记录。请注意,此蓝图仅建议 HSM/crypto 风格插件轮换。

问题描述

当使用 crypto 风格插件在 Barbican 中存储密钥时,将检索该密钥项目的 KEKDatum 实体(来自 barbican.model.models)。如果未为该项目找到此类实体,则会发生以下步骤

  1. 为该项目和特定的 crypto 风格插件创建一个新的 KEKDatum 实体,状态为 ACTIVEACTIVE 状态表示从那时起应使用此实体进行密钥加密。

  2. 在 crypto 插件上调用 bind_kek_metadata() 方法。然后,插件创建项目级别的 KEK,该 KEK 将用于加密该项目的新的密钥。对于 PKCS11 HSM 插件,这是由 MKEK 包装/加密的项目 KEK。

  3. 然后,有关此项目级别 KEK 的信息将添加到新的 KEKDatum 实体 plugin_meta 属性中。

  4. 当最终存储密钥时,会为其创建一个 Secret 实体以保存元数据,并且还会创建一个关联的 EncryptedDatum 实体,该实体保存密钥的加密密文以及对项目级别 KEKDatum 记录的引用。

  5. 此后,需要加密的相同项目的新的密钥将使用此 KEKDatum 实体,而不会再尝试生成新的实体。

因此,KEKDatum 实体与项目级别 KEK 相关联,而项目级别 KEK 又与 HSM 中的单个 MKEK 相关联。由于轮换涉及创建一个新的 MKEK(但对于此轻量级版本不涉及项目 KEK),因此需要更新每个项目的 KEKDatum 实体以重新包装/加密其包含的项目 KEK。

与更严格的密钥轮换蓝图不同,不需要其他步骤。密钥、它们的 UUID 及其关联的加密数据无需更改,这应该可以加快整体迁移过程。

一个要求是此工具必须具有弹性,允许在中间失败时重新运行该工具。

此蓝图详细介绍了使用新的 MKEK 重新包装现有项目 KEK 的方法。

提议的变更

此蓝图建议采取以下步骤来完成 KEK 轮换和迁移工作

  1. 以独立于 Barbican 的方式(因此由部署者),在 HSM 中创建新的 MKEK 和 HMAC 密钥,并使用新的唯一标签。对于高可用性配置,这些密钥必须复制到集群中的所有 HSM。

  2. 对于网络中的每个 API 和 worker 节点,更新其 /etc/barbican/barbican-api.conf 文件中的 mkek_labelhmac_label 属性,并使用上面生成的新唯一标签。请注意,一旦 Barbican 重新启动,添加到新的项目 ID 的密钥将开始使用新的 MKEK 来包装它们的新项目 KEK。但是,现有密钥仍然使用旧的 MKEK,因此需要新的工具。

  3. 重新启动 API 和 worker 节点。此时 Barbican 应该正常运行,并且会发生以下基于工具的步骤,同时 Barbican 运行。

  4. 通过此蓝图提出的新工具,查询指定 crypto 风格插件类(例如 barbican.plugin.crypto.simple_crypto.SimpleCryptoPlugin)的所有 KEKDatum 实体。这些包装项目 KEK 需要使用新的 MKEK 重新包装。

  5. 对于每个 KEKDatum 实体,调用 crypto 风格插件合同(在 barbican.plugin.crypto.crypto.py 中定义)上的一个新方法,名为“rewrap_project_kek()”,该方法将实体作为输入并使用重新包装的项目 KEK 更新它。插件需要将包装项目 KEK 加载到 HSM 中,使用旧的 MKEK 解密它,使用新的 MKEK 加密它,然后返回新的包装项目 KEK(但仍然包含原始项目 KEK)。

  6. 然后,上面的 KEKDatum 实体将使用新的包装项目 KEK 信息更新。由于这是一次性更新,因此与 [1] 不同,与此实体关联的密钥无需更新。

  7. 记录迁移的 KEKDatum 实体 UUID 以生成迁移记录。

建议的工具将作为 Python barbican.cmd 脚本实现,并作为 setup.cfg 文件中的 pbr 入口点添加,因此在部署 Barbican 后可用作可调用的命令。

为了保持数据完整性,步骤 5 和 6 应该在数据库事务中执行。

备选方案

请参阅 [1] 中更严格的密钥轮换方法的替代方案。

数据模型影响

不需要针对建议的解决方案进行数据模型或存储库更改。数据迁移将如上述“建议的更改”部分中所述进行。

REST API 影响

无。

安全影响

建议的解决方案通过重新包装用于加密密钥的项目 KEK 来完成必要的密钥轮换过程。但是,建议的方法存在不太可能但可能的数据丢失风险,因为使用旧的 MKEK 加密的項目 KEK 被替换为使用新的 MKEK 加密的相同的项目 KEK。如果数据库更新事务失败并破坏此记录(对于符合 ACID 标准的数据库来说非常不可能,但有可能),则所有从失败的项目 KEK 派生的密钥的解密都将失败。但是,由于这些包装项目 KEK 不经常更改(按 MKEK 轮换计划),因此从数据库备份中恢复的可能性很高,从而减轻了这种风险。

此外,如果 MKEK 被泄露并且攻击者可以访问密钥备份,那么他们可以通过首先解包项目 KEK 来解密它们。部署者应注意这一点并安全地存储备份。

通知与审计影响

建议的工具将生成每个迁移的 KEKDatum 实体的日志,可用于向审计员证明已发生迁移/轮换。

其他最终用户影响

无。

性能影响

如果有很多项目 ID 需要迁移,建议的工具可能需要花费大量时间来处理,因此它会对 HSM 重新包装项目 KEK 造成负载,从而影响正常的 Barbican 操作。但是,此工具将不经常调用(也许每年 1 到 4 次)。由于项目 ID/KEK 比密钥少,因此此工具的性能优于 [1] 中提出的“所有密钥”迁移。

其他部署者影响

建议的工具将在部署 Barbican 后作为新的可执行命令执行。建议的更改不需要更新配置文件模式,但需要更新以提供新的 MKEK 和 HMAC 密钥标签,如上所述。

此外,如果 MKEK 被泄露并且攻击者可以访问密钥备份,那么他们可以通过首先解包项目 KEK 来解密它们。部署者应注意这一点并安全地存储备份。

开发人员影响

无。

实现

负责人

待定

工作项

建议的工作项目是

  1. 创建一个 Python 命令脚本来实现“建议的更改”部分中的步骤。

  2. 添加单元测试以涵盖新的代码行。

  3. 添加集成单元测试,该测试使用默认的 simple_crypto.py 插件和内存 SQLite 数据库,首先使用配置文件中的默认 MEK 创建几个已知的密钥,然后修改此 MEK,然后执行迁移脚本逻辑。应解密密钥并验证其准确性。 KEKDatum 实体的 updated_at 日期应更新。密钥应再次解密并验证其准确性,这证明所有密钥都已成功迁移到更新的 KEKDatum 记录。

  4. 记录整体密钥轮换和迁移过程,包括新迁移工具的使用。

依赖项

无。

测试

目前预计不需要 DevStack 功能测试。添加 HSM gate 作业后,将添加未来的蓝图以添加测试。

文档影响

最后的工作项目详细介绍了所需的文档。

参考资料

[1] https://blueprints.launchpad.net/barbican/+spec/add-crypto-mkek-rotation-support