主密钥和数据加密密钥管理
4.2 版本中的新增功能。
支持的密钥管理服务
客户端字段级加密需要KMS ( KMS ) 来访问客户主密钥(集合扫描)。 MongoDB在创建数据加密密钥期间使用指定的集合扫描自动加密数据加密密钥。
删除集合扫描会导致使用该集合扫描加密的所有数据加密密钥永久不可读,进而导致使用这些数据加密密钥加密的所有值永久不可读。
客户端字段级加密支持以下 KMS 提供程序:
Amazon Web Services KMS
重要提示:要获得Amazon Amazon Web ServicesKMSmongosh
MongoDB4.2.2Web Servicesmongo
shell KMS支持,请使用 或MongoDB 或更高版本的旧版 Shell 。4 。 2。 0和 4 。 2。 1由于KMS响应对象发生意外更改,旧版 Shell不支持Amazonmongo
shell Amazon Web ServicesKMSWeb Services KMS服务。KMS有关更多信息,请参阅 SERVER-44721 。
MongoDB客户端加密支持使用Amazon Web ServicesKMS 用于加密和解密数据加密密钥。具体来说, MongoDB将数据加密密钥安全地传输到Amazon Web Services KMS ,以便使用指定的客户主密钥(集合扫描) 进行加密或解密。 集合扫描永远不会离开Amazon Web Services KMS 。
mongosh
支持两种配置Amazon Web Services KMS访问权限的方法:
配置访问权限Amazon Web Services KMS的访问至少需要Amazon Web Services访问密钥及其相应的密钥。 与访问密钥关联的 IAM 用户必须至少有一项包含以下操作的策略:
注意
实施 KMS 访问的最小特权原则
考虑配置 IAM 用户角色,使MongoDB仅能访问权限运行所需的操作和资源。
例如,以下策略 JSON 将所需操作的范围限定为单个 CMK:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt" ], "Resource": "arn:aws:kms:region:account:key/12a345b6-cd7e-8f9g-0h1i-jk23l45mn6o7" } ] }
有关使用Amazon Web Services KMS进行数据加密密钥管理的完整文档,请参阅管理数据加密密钥并选择“ Amazon Web Services KMS ”标签页。
Azure Key Vault
MongoDB客户端加密支持使用Azure Key Vault KMS 用于加密和解密数据加密密钥。具体来说,MongoDB 将数据加密密钥安全地传输到 Azure Key Vault,以便使用指定的客户主密钥 (CMK) 进行加密或解密。 CMK 永远不会离开 Azure Key Vault。
mongosh
支持使用 KMS配置选项 使用 构造函数将Azure Key Vault指定为KMSMongo()
。
配置对Azure Key Vault的访问权限至少需要Azure租户ID、客户端ID和客户端密钥。 租户ID必须能力执行以下操作:
注意
MongoDB不支持Azure 的客户端证书身份验证(也称为 TLS 相互身份验证)。
有关使用Azure Key Vault进行数据加密密钥管理的完整文档,请参阅管理数据加密密钥并选择“ Azure Key Vault”标签页。
Google Cloud Platform KMS
MongoDB客户端加密支持使用GCPKMS 用于加密和解密数据加密密钥。具体来说, MongoDB将数据加密密钥安全地传输到GCP KMS ,以便使用指定的客户主密钥 (CMK) 进行加密或解密。 CMK 永远不会离开GCP KMS 。
mongosh
支持使用Google Cloud PlatformKMS KMSMongo()
KMS配置选项 使用 构造函数将 指定为 。
配置访问权限Google Cloud Platform KMS的访问至少需要Google Cloud Platform电子邮件和关联的私钥。 Google Cloud Platform电子邮件帐户必须具有指定私钥的以下 IAM 权限:
cloudkms.cryptoKeyVersions.useToEncrypt
cloudkms.cryptoKeyVersions.useToDecrypt
这些 IAM 权限包含在某些Google Cloud Platform 预定义角色中 或可以包含在Google Cloud Platform 自定义角色。
有关使用Google Cloud Platform KMS进行数据加密密钥管理的完整文档,请参阅管理数据加密密钥并选择“ Google Cloud Platform KMS ”标签页。
本地管理的密钥
mongosh
支持使用Mongo()
构造函数将本地托管的密钥指定为KMS 。 本地密钥必须是 96 字节长的string 。
有关使用本地管理密钥进行数据加密密钥管理的完整文档,请参阅管理数据加密密钥并选择“本地密钥文件”标签页。
加密密钥保管库
密钥保管库是存储用于客户端字段级加密的数据加密密钥的集合。 数据加密密钥使用通过支持的密钥管理系统 ( KMS )托管的客户主密钥(集合扫描 ) 进行加密。
mongosh
为数据加密密钥管理提供辅助方法:
用例(Use Case) | 辅助方法 |
---|---|
检索数据加密密钥 | |
创建或修改数据加密密钥 | |
删除数据加密密钥 | 重要删除数据加密密钥会使使用该数据加密密钥加密的所有字段永久不可读。 |
对密钥保管库集合具有read
访问权限的应用程序可以通过查询该集合来检索数据加密密钥。 但是,只有有权访问权限用于加密数据加密密钥的集合扫描的应用程序才能使用该密钥进行加密或解密。
默认, MongoDB将密钥保管库集合存储在连接的集群上。 MongoDB还支持指定远程集群作为密钥保管库。 应用程序必须能够访问权限远程密钥保管库集群和连接集群,才能执行客户端字段级加密操作。
数据加密密钥具有以下结构:
{ "_id" : UUID("<string>"), "keyMaterial" : BinData(0,"<encrypted binary data string>"), "creationDate" : ISODate("2019-08-20T15:45:02.575Z"), "updateDate" : ISODate("2019-08-20T15:45:02.575Z"), "status" : <int>, "version" : NumberLong(0), "masterKey" : { "provider" : "<string>", "key" : "<string>", "region" : "<string>", "endpoint" : "<string>" }, "keyAltNames" : [ "<string>" ] }
客户端字段级加密取决于keyAltNames
值的唯一性。 如果不存在唯一索引,则mongosh
KeyVault.createKey()
方法会在keyAltNames
上创建唯一索引。 应用程序可以对密钥保管库集合使用listIndexes
命令来检查唯一索引是否存在。 如果唯一索引不存在,则应用程序必须在执行数据加密密钥管理之前创建该索引。
有关数据加密密钥管理的完整文档,请参阅管理数据加密密钥。