加密密钥和密钥保管库
Overview
在本指南中,您可以学习;了解有关“正在使用的加密”的以下组件的详细信息:
数据加密密钥 (DEK)
客户主密钥 (CMK)
密钥保管库集合
密钥管理系统 (KMS)
要查看演示如何使用上述组件设立启用了Queryable Encryption或 Client-Side 字段级加密的客户端端的分步指南,请参阅以下资源:
数据加密密钥与客户主密钥
正在使用的加密会使用多级密钥层次结构来保护数据,常称为“信封加密”或“包装密钥”。
客户主密钥 (CMK),有时也称为密钥管理系统 (KMS) 密钥,是您在客户预配的密钥提供商(例如云 KMS)中创建的顶级密钥。CMK 对数据加密密钥 (DEK) 进行加密,而数据加密密钥 (DEK) 又会加密文档中的字段。如果无法访问 CMK,您的客户端应用程序将无法解密关联的 DEK。
MongoDB 将使用通过 CMK 加密的 DEK 作为 BSON 文档存储在 Key Vault 集合中。MongoDB 永远无法解密 DEK,因为密钥管理将由客户端和客户控制。
如果删除了 DEK,使用该 DEK 加密的所有字段将永久不可读。如果删除了 CMK,使用该 CMK 的 DEK 加密的所有字段将永久不可读。
警告
客户主密钥是可查询加密中最敏感的密钥。如果您的 CMK 遭到泄露,则可以解密所有加密数据。使用远程密钥管理系统存储 CMK。
重要
使用远程密钥管理服务提供商
密钥轮换
您可以手动或自动在预配密钥提供商上轮换 CMK。 MongoDB 对此进程一无所知。 轮换 CMK 后,MongoDB 就会使用它来封装所有新的 DEK。 它不会重新包装现有的加密 DEK。它们仍使用先前的 CMK 进行包装。
要轮换密钥保管库中的部分或全部加密 DEK,请使用 KeyVault.rewrapManyDataKey()
方法。该方法会使用指定的新 CMK 无缝重新包装密钥,不会中断应用程序。使用新的 CMK 重新包装 DEK 后,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和 Key Vault 集合如何在所有支持的KMS提供程序架构中进行交互的图表,请参阅KMS 提供程序。
keyVaultCollectionName
您可以使用任何非管理员命名空间来存储密钥保管库集合。按照惯例,本文档中的示例均使用 encryption.__keyVault
命名空间。
警告
请勿使用 admin
数据库存储与加密相关的集合。如果您在此集合中使用管理数据库,您的 MongoDB 客户端可能会因权限不足而无法访问或解密数据。
权限
对 Key Vault 集合具有 read
访问权限的应用程序可以通过查询相应集合来检索加密的数据加密密钥 (DEK)。但是,只有有权访问用于加密 DEK 的客户主密钥 (CMK) 的应用程序才能使用该 DEK 进行加密或解密。您必须为应用程序同时授予对 Key Vault 集合和 CMK 的访问权限,才能使用 DEK 加密和解密文档。
要了解如何授予对 MongoDB 集合的访问权限,请参阅 MongoDB 手册中的管理用户和角色。
要了解如何授予应用程序访问客户主密钥的权限,请参阅Queryable Encryption 自动加密教程或CSFLE 自动加密教程。
密钥保管库集群
默认情况下,MongoDB 会在连接的集群上存储“密钥保管库集合”。MongoDB 还支持在与连接集群不同的 MongoDB 部署上托管“密钥保管库集合”。应用程序必须能够访问托管“密钥保管库集合”的集群和连接集群,才能执行“可查询加密”操作。
要指定托管密钥保管库集合的集群,请使用客户端的MongoClient
对象的keyVaultClient
字段。 要学习;了解有关客户端MongoClient
对象中特定配置选项的更多信息,请参阅适用于Queryable Encryption的MongoClient 选项或适用于 CSFLE 的 MongoClient 选项。
更新密钥保管库集合
要将 DEK 加入密钥保管集合,请使用 ClientEncryption
对象的 createKey
方法。
要删除或更新 DEK,请使用以下机制之一:
rewrapManyDataKey
方法标准 CRUD 操作
要了解有关 rewrapManyDataKey
方法的更多信息,请参阅您的客户端或驱动程序关于该方法的文档:
提示
mongosh 具体功能
要查看演示如何创建数据加密密钥的教程,请参阅Queryable Encryption快速入门或CSFLE 快速入门。