重构 PKCS11 插件

https://blueprints.launchpad.net/barbican/+spec/restructure-pkcs11-plugin

当前的 PKCS11 插件假定它有足够的存储空间来为每个项目/租户创建一个 KEK(密钥加密密钥)。对于许多 HSM(硬件安全模块)来说,这个假设是不成立的,因此我们建议引入一个存储在 HSM 中的主 KEK,用于封装每个项目的 KEK,以解决这个问题。

问题描述

PKCS11 插件为每个项目/租户创建一个密钥加密密钥 (KEK)。当连接到存储空间有限的 HSM 时,此系统可能会耗尽 HSM 上的可用空间,并无法为新的项目/租户创建 KEK。

提议的变更

使用主 KEK 封装项目 KEK 将通过在实际 HSM 中保留最少数量的密钥,同时仍然为每个项目/租户使用不同的加密密钥来解决存储问题。层次结构如下所示

+--------------+
|  Master KEK  |
+-----+--------+
      |
      |
      |
+-----+-----+       +-----------+
|Wrapped KEK+-------+Encrypted  |
+-----------+       |Secret     |
                    +-----------

解密过程的序列图如下所示

::

barbican DB HSM + 获取主 KEK 句柄 + + | <—————————————————–> | | 获取封装的项目 KEK | | | <—————————-> | | | 在 HSM 中解包项目 KEK(保持|在 HSM 中) | +——————————————————-> | | 项目 KEK 句柄 | | | <——————————————————-+ | 获取加密的密钥 | | | <—————————-> | | | 使用项目 KEK 句柄解密密钥 | | <—————————————————–> |

备选方案

无。

数据模型影响

数据模型可能需要扩展以支持存储每个项目的 KEK。我们建议通过创建一个新表来完成此操作,该表存储封装的 KEK 字节,并具有指向项目/租户的外键。

REST API 影响

安全影响

PKCS11 插件的风险大致相同。虽然 KEK 不再完全存储在 HSM 中,但 KEK 在 HSM 外部时始终是加密的。

通知与审计影响

其他最终用户影响

性能影响

往返 HSM 的解密轮次增加了一个。以前解密密钥需要找到项目 KEK,然后将加密字节发送到 HSM 进行解密。使用新系统,我们必须找到主 KEK,解密封装的项目 KEK,然后使用解包的 KEK 解密用户密钥。

其他部署者影响

开发人员影响

实现

负责人

Paul Kehrer (reaperhulk)

工作项

  1. 为 barbican 添加新模型

  2. 更新 PKCS11 插件以执行封装/解包并使用新模型。

依赖项

测试

PKCS11 插件的单元测试将更改以反映对 HSM 所做的新的调用以及存储在模型中的数据。

文档影响

更新文档以描述插件的操作方式。

参考资料