“文档” 菜单
文档首页
/
MongoDB Manual
/ / / / /

密钥和密钥保管库

在此页面上

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

本指南中,您可以详细了解客户端字段级加密 (CSFLE) 的以下组件:

  • 数据加密密钥 (DEK)

  • 客户主密钥 (CMK)

  • 密钥保管库集合

  • 密钥管理系统 (KMS)

如需查看演示如何使用前述组件设置启用 CSFLE 的客户端的分步指南,请参阅以下资源:

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

客户主密钥 (CMK),有时也称为密钥管理系统 (KMS) 密钥,是您在客户预配的密钥提供商(例如云 KMS)中创建的顶级密钥。CMK 对数据加密密钥 (DEK) 进行加密,而数据加密密钥 (DEK) 又会加密文档中的字段。如果无法访问 CMK,您的客户端应用程序将无法解密关联的 DEK。

MongoDB 将使用通过 CMK 加密的 DEK 作为 BSON 文档存储在 Key Vault 集合中。MongoDB 永远无法解密 DEK,因为密钥管理将由客户端和客户控制。

如果删除了 DEK,使用该 DEK 加密的所有字段将永久不可读。如果删除了 CMK,使用该 CMK DEK 加密的所有字段将永久不可读。

警告

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

重要

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

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

要详细了解为什么要使用远程 KMS,请参阅使用远程密钥管理系统的理由

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

您可以手动或自动在预配密钥提供商上轮换 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 命令:

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 提供程序架构中交互的图表,请参阅 CSFLE KMS 提供程序

您可以使用任何非管理员命名空间来存储密钥保管库集合。按照惯例,本文档中的示例均使用 encryption.__keyVault 命名空间

警告

请勿使用 admin 数据库存储与加密相关的集合。如果您在此集合中使用管理数据库,您的 MongoDB 客户端可能会因权限不足而无法访问或解密数据。

对 Key Vault 集合具有 read 访问权限的应用程序可以通过查询相应集合来检索加密的数据加密密钥 (DEK)。但是,只有有权访问用于加密 DEK 的客户主密钥 (CMK) 的应用程序才能使用该 DEK 进行加密或解密。您必须为应用程序同时授予对 Key Vault 集合和 CMK 的访问权限,才能使用 DEK 加密和解密文档。

要了解如何授予对 MongoDB 集合的访问权限,请参阅 MongoDB 手册中的管理用户和角色

要了解如何授予应用程序访问 CMK 的权限,请参阅教程的教程。

默认情况下,MongoDB 会在连接的集群上存储“密钥保管库集合”。MongoDB 还支持在与连接集群不同的 MongoDB 部署上托管“密钥保管库集合”。应用程序必须能够访问托管“密钥保管库集合”的集群和连接集群,才能执行“可查询加密”操作。

要指定托管密钥保管库集合的集群,请使用客户端的 MongoClient 对象的 keyVaultClient 字段。要了解有关客户端 MongoClient 对象中的 CSFLE 特定的配置选项的更多信息,请参阅 CSFLE 特定的 MongoClient 选项

要将 DEK 加入密钥保管集合,请使用 ClientEncryption 对象的 createKey 方法。

要删除或更新 DEK,请使用以下机制之一:

  • rewrapManyDataKey 方法

  • 标准 CRUD 操作

要了解有关 rewrapManyDataKey 方法的更多信息,请参阅您的客户端或驱动程序关于该方法的文档:

要查看演示如何创建 DEK 的教程,请参阅快速入门

← 加密模式