加密密钥和密钥保管库
概述
在本指南中,您可以了解以下 In-Use Encryption 组件的详细信息
数据加密密钥(DEK)
客户主密钥(CMK)
密钥保管库集合
密钥管理系统(KMS)
要查看逐步指南,说明如何使用上述组件设置可查询加密或客户端字段级加密启用的客户端,请参阅以下资源
数据加密密钥和客户主密钥
使用中的加密使用多层密钥层次结构来保护您的数据,通常称为“信封加密”或“包装密钥”。
客户主密钥(CMK),有时称为密钥管理系统(KMS)密钥,是在您的客户配置的密钥提供程序(如云KMS)中创建的最高级密钥。 CMK 加密数据加密密钥(DEK),这些密钥随后加密文档中的字段。没有访问到 CMK,您的客户端应用程序无法解密相关的 DEK。
MongoDB 将使用您的 CMK 加密的 DEK 存储在密钥库集合中,作为 BSON 文档。MongoDB 永远不能解密 DEK,因为密钥管理是在客户端且由客户控制的。
如果您删除一个 DEK,则使用该 DEK 加密的全部字段将永久不可读。如果您删除一个 CMK,则使用该 CMK 加密的全部字段将永久不可读。
警告
客户主密钥是可查询加密中最敏感的密钥。如果您的 CMK 受损,则所有加密数据都可以被解密。使用远程密钥管理系统来存储您的 CMK。
重要
使用远程密钥管理服务提供商
密钥轮换
您可以在配置好的密钥提供程序上手动或自动旋转您的 CMK。MongoDB 无法查看此过程。一旦您旋转了 CMK,MongoDB 就会使用它来包装所有新的 DEK。它不会重新包装现有的加密 DEK。这些仍然使用先前的 CMK 进行包装。
要旋转密钥库中的一些或所有加密 DEK,请使用 KeyVault.rewrapManyDataKey()
方法。它无缝地将密钥与新 CMK 重新包装,而不会中断您的应用程序。重新包装后,DEK 本身保持不变。
有关旋转密钥的详细信息,请参阅 旋转加密密钥。
密钥库集合
您的密钥库集合是您用于存储加密数据加密密钥 (DEK) 文档的 MongoDB 集合。DEK 文档是包含 DEK 的 BSON 文档,具有以下结构
{ "_id" : UUID(<string>), "status" : <int>, "masterKey" : {<object>}, "updateDate" : ISODate(<string>), "keyMaterial" : BinData(0,<string>), "creationDate" : ISODate(<string>), "keyAltNames" : <array> }
您创建密钥库集合的方式与创建标准 MongoDB 集合相同。您的密钥库集合必须在 keyAltNames
字段上具有 唯一索引。要检查唯一索引是否存在,请针对密钥库集合运行 listIndexes
命令
1 db.runCommand({ 2 listIndexes: "__keyVault", 3 });
1 { 2 cursor: { 3 id: Long("0"), 4 ns: 'encryption.__keyVault', 5 firstBatch: [ 6 { v: 2, key: { _id: 1 }, name: '_id_' } 7 ] 8 }, 9 ok: 1, 10 }
如果唯一索引不存在,则在执行 DEK 管理之前,应用程序必须先创建它。
要了解如何创建 MongoDB 集合,请参阅 数据库和集合。
要查看详细说明您的 DEK、CMK 和密钥保管库集合如何在所有支持的 KMS 提供器架构中交互的图表,请参阅KMS 提供器。
密钥保管库集合名称
您可以使用任何非管理员 命名空间 来存储您的密钥保管库集合。按照惯例,本文档中的示例使用 encryption.__keyVault
命名空间。
警告
不要使用 admin
数据库来存储与加密相关的集合。如果您使用 admin 数据库存储此集合,则由于权限不足,MongoDB 客户端可能无法访问或解密您的数据。
权限
具有对密钥保管库集合 read
访问权限的应用程序可以通过查询集合检索加密的数据加密密钥 (DEK)。然而,只有具有访问用于加密 DEK 的客户主密钥 (CMK) 的应用程序才能使用该 DEK 进行加密或解密。您必须授予您的应用程序访问密钥保管库集合和您的 CMK 的权限,以便使用 DEK 加密和解密文档。
要了解如何授予MongoDB集合的访问权限,请参阅MongoDB手册中的管理用户和角色。
要了解如何授予您的应用程序访问客户主密钥的权限,请参阅可查询加密自动加密教程或CSFLE自动加密教程。
密钥保管库集群
默认情况下,MongoDB将在连接的集群上存储密钥保管库集合。MongoDB还支持在连接集群之外的其他MongoDB部署上托管密钥保管库集合。应用程序必须能够访问托管您的密钥保管库集合的集群和连接集群,才能执行可查询加密操作。
要指定托管您的密钥保管库集合的集群,请使用客户端的MongoClient
对象的keyVaultClient
字段。要了解客户端MongoClient
对象中的特定配置选项,请参阅可查询加密的MongoClient选项或CSFLE的MongoClient选项。
更新密钥保管库集合
要将数据加密密钥(DEK)添加到您的密钥保管库集合中,请使用ClientEncryption
对象上的createKey
方法。
要删除或更新DEK,请使用以下机制之一
rewrapManyDataKey
方法标准CRUD操作
要了解更多关于rewrapManyDataKey
方法的信息,请参阅您的客户端或驱动程序的文档。
提示
mongosh特定功能
要查看创建数据加密密钥的教程,请参阅可查询加密快速入门或CSFLE快速入门。