KeyVault.rewrapManyDataKey()
KeyVault.rewrapManyDataKey(filter, options)
解密多个数据加密密钥 (DEK),并使用新的客户主密钥(集合扫描) 重新加密。 使用此方法轮换加密 DEK 的集合扫描 。 要学习;了解有关 CMK 和 DEK 的更多信息,请参阅密钥。
您可以通过
masterKey
参数指定客户主密钥。如果您不包含masterKey
参数,该方法将使用 DEK 元数据中引用的 CMK 解密和加密每个 DEK。 要了解有关 DEK 元数据的更多信息,请参阅用于解密的元数据。KeyVault.rewrapManyDataKey
通过以下语法实现:let keyVault = db.getMongo().getKeyVault() keyVault.rewrapManyDataKey( <filter>, <options> ) Parameter类型说明filter
keyvault collection的查询筛选器options
文档该文档有两个字段:
provider
: KMS 提供商(Amazon Web Services KMS、Azure Key Vault、GCP KMS、本地提供商或 KMIP)masterKey
:用于加密新数据密钥的 KMS 特定密钥
返回: 一个BulkWriteResult对象,报告受影响的数据键数量。
警告
备份你的密钥保管库集合
在轮换数据加密密钥之前,请确保为密钥保管库集合创建备份。 如果您无法访问数据加密密钥,您将丢失所有加密数据。
要学习;了解如何创建集合的备份,请参阅使用MongoDB工具备份和恢复自托管部署。
行为
此操作不是原子操作,不应与其他密钥管理操作并行运行。
需要在数据库连接上配置客户端字段级加密
mongosh
客户端字段级加密方法需要启用客户端字段级加密的数据库连接。 如果当前数据库连接不是在启用客户端字段级加密的情况下启动的,则:
例子
这些示例可让您快速评估客户端字段级加密。 有关使用每个受支持的 KMS提供商的具体示例,请参阅加密密钥管理。
为本地管理的密钥配置客户端字段级加密:
生成不带换行符的 base64 编码的 96 字节字符串
使用
mongosh
加载密钥
export TEST_LOCAL_KEY=$(echo "$(head -c 96 /dev/urandom | base64 | tr -d '\n')") mongosh --nodb
使用生成的本地密钥字符串创建客户端字段级加密对象:
var autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__dataKeys", "kmsProviders" : { "local" : { "key" : BinData(0, process.env["TEST_LOCAL_KEY"]) } } }
使用配置了客户端字段级加密选项的Mongo()
构造函数来创建数据库连接。 将mongodb://myMongo.example.net
URI 替换为目标集群的连接字符串 URI 。
encryptedClient = Mongo( "mongodb://myMongo.example.net:27017/?replSetName=myMongo", autoEncryptionOpts )
检索KeyVault
对象并使用KeyVault.rewrapManyDataKey()
方法将现有密钥重新包装在新的masterKey
中。 如果没有给出新的masterKey
,则每个数据键保留其各自当前的masterKey
。
使用当前主密钥重新包装数据密钥
以下示例展示了如何使用各自的当前masterKey
重新包装每个数据键:
let keyVault = mongo.getKeyVault() keyVault.rewrapManyDataKey()
使用新的 masterKey 重新包装数据密钥
以下示例展示了如何使用新的masterKey
重新包装每个数据键:
let keyVault = mongo.getKeyVault() keyVault.rewrapManyDataKey({}, { provider: 'aws', masterKey: { region: 'us-east-2', key: 'arn:aws:kms:us-east-2:...' } })
重新包装最近未重新包装的数据密钥
以下示例展示了如何重新包装过去 30 天内未重新包装的数据密钥。
let keyVault = mongo.getKeyVault() const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); keyVault.rewrapManyDataKey({ updateDate: { $lt: thirtyDaysAgo } });
输出
KeyVault.rewrapManyDataKey()
返回一个BulkWriteResult
对象,详细说明有多少数据键受到影响:
{ bulkWriteResult: BulkWriteResult { result: { ok: 1, writeErrors: [], writeConcernErrors: [], insertedIds: [], nInserted: 0, nUpserted: 0, nMatched: 3, nModified: 3, nRemoved: 0, upserted: [], opTime: { ts: Timestamp({ t: 1655840760, i: 3 }), t: 23 } } } }