文档菜单
文档首页
/
MongoDB 手册
/ / /

加密密钥和密钥保管库

本页内容

  • 概述
  • 数据加密密钥和客户主密钥
  • 密钥轮换
  • 密钥保管库集合
  • 密钥保管库集合名称
  • 权限
  • 密钥保管库集群
  • 更新密钥保管库集合

在本指南中,您可以了解以下 In-Use Encryption 组件的详细信息

  • 数据加密密钥(DEK

  • 客户主密钥(CMK

  • 密钥保管库集合

  • 密钥管理系统(KMS

要查看逐步指南,说明如何使用上述组件设置可查询加密或客户端字段级加密启用的客户端,请参阅以下资源

  • 可查询加密快速入门

  • 可查询加密自动加密教程

  • CSFLE 快速入门

  • CSFLE 自动加密教程

使用中的加密使用多层密钥层次结构来保护您的数据,通常称为“信封加密”或“包装密钥”。

客户主密钥(CMK),有时称为密钥管理系统(KMS)密钥,是在您的客户配置的密钥提供程序(如云KMS)中创建的最高级密钥。 CMK 加密数据加密密钥(DEK),这些密钥随后加密文档中的字段。没有访问到 CMK,您的客户端应用程序无法解密相关的 DEK

MongoDB 将使用您的 CMK 加密的 DEK 存储在密钥库集合中,作为 BSON 文档。MongoDB 永远不能解密 DEK,因为密钥管理是在客户端且由客户控制的。

如果您删除一个 DEK,则使用该 DEK 加密的全部字段将永久不可读。如果您删除一个 CMK,则使用该 CMK 加密的全部字段将永久不可读。

警告

客户主密钥是可查询加密中最敏感的密钥。如果您的 CMK 受损,则所有加密数据都可以被解密。使用远程密钥管理系统来存储您的 CMK

重要

使用远程密钥管理服务提供商

将您的客户主密钥存储在远程密钥管理系统(KMS)中。

要了解为什么您应该使用远程 KMS,请参阅使用远程密钥管理系统的原因。

要查看所有受支持的 KMS 提供商列表,请参阅KMS 提供商页面。

您可以在配置好的密钥提供程序上手动或自动旋转您的 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 命令

1db.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 集合,请参阅 数据库和集合。

提示

mongosh 功能

功能mongosh 方法 KeyVault.createKey()keyAltNames 字段不存在的情况下,会自动创建一个唯一索引。

要查看详细说明您的 DEKCMK 和密钥保管库集合如何在所有支持的 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方法的信息,请参阅您的客户端或驱动程序的文档。

要查看创建数据加密密钥的教程,请参阅可查询加密快速入门CSFLE快速入门。

返回

兼容性