Docs Menu

KeyVault.rewrapManyDataKey()

KeyVault.rewrapManyDataKey(filter, options)

Decrypts multiple Data Encryption Keys (DEK) and re-encrypts them with a new Customer Master Key (CMK). Use this method to rotate the CMK that encrypts your DEKs. To learn more about CMKs and DEKs, see 暗号化のキーとキー ボールト.

You specify a CMK through the masterKey parameter. If you do not include a masterKey argument, the method decrypts and encrypts each DEK with the CMK referenced in that DEK's metadata. To learn more about the metadata of DEKs, see 復号に使用されるメタデータ.

次の値を返します。A BulkWriteResult object that reports how many data keys were affected.

警告

Back-Up Your Key Vault collection

Before you rotate your Data Encryption Keys, ensure you create a backup of your Key Vault collection. If you lose access to your Data Encryption Keys, you will lose all your encrypted data.

To learn how to create a backup of a collection, see MongoDB ツールを使用した自己管理型配置のバックアップと復元.

このコマンドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

KeyVault.rewrapManyDataKeyの構文は次のとおりです。

let keyVault = db.getMongo().getKeyVault()
keyVault.rewrapManyDataKey(
<filter>,
<options>
)
Parameter
タイプ
説明

filter

The query filter for the keyvault collection

options

ドキュメント

This document has two fields:

  • provider: A KMS provider (AWS KMS, Azure Key Vault, GCP KMS, the local provider, or KMIP)

  • masterKey: A KMS-specific key used to encrypt the new data key

重要

キー ローテーション サポート

To view your driver's dependencies for the key rotation API, see 互換性.

This operation is not atomic and should not be run in parallel with other key management operations.

mongosh クライアント側のフィールド レベル暗号化メソッドでは、クライアント側のフィールド レベル暗号化が有効になっているデータベース接続が必要です。現在のデータベース接続がクライアント側のフィールド レベル暗号化を有効にして開始されなかった場合、次のいずれかが発生します。

These examples allow you to rapidly evaluate client-side field level encryption. For specific examples using each supported KMS provider, see 暗号化キー管理.

1

mongoshクライアントを起動します。

mongosh --nodb
2

ローカルで管理されているキーのクライアント側フィールドレベル暗号化を構成するには、改行を含まない base64 でエンコードされた 96 バイトのstringを生成します。

const TEST_LOCAL_KEY = require("crypto").randomBytes(96).toString("base64")
3

生成されたローカルキーstringを使用して、クライアント側のフィールドレベル暗号化オプションを作成します。

var autoEncryptionOpts = {
"keyVaultNamespace" : "encryption.__dataKeys",
"kmsProviders" : {
"local" : {
"key" : BinData(0, TEST_LOCAL_KEY)
}
}
}
4

データベース接続を作成するには、クライアント側のフィールドレベル暗号化オプションが構成されたMongo()コンストラクターを使用します。 mongodb://myMongo.example.net URI を、ターゲットクラスターの接続string URIに置き換えます。

encryptedClient = Mongo(
"mongodb://myMongo.example.net:27017/?replSetName=myMongo",
autoEncryptionOpts
)

Retrieve the KeyVault object and use the KeyVault.rewrapManyDataKey() method to rewrap the existing keys in a new masterKey. If no new masterKey is given, each data key retains its respective current masterKey.

The following example shows how you can rewrap each data key with its respective current masterKey:

let keyVault = mongo.getKeyVault()
keyVault.rewrapManyDataKey()

The following example shows how you can rewrap each data key with a new masterKey:

let keyVault = mongo.getKeyVault()
keyVault.rewrapManyDataKey({}, {
provider: 'aws',
masterKey: {
region: 'us-east-2',
key: 'arn:aws:kms:us-east-2:...'
}
})

The following example shows how to rewrap data keys that have not been rewrapped in the previous thirty days.

let keyVault = mongo.getKeyVault()
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
keyVault.rewrapManyDataKey({ updateDate: { $lt: thirtyDaysAgo } });

KeyVault.rewrapManyDataKey() returns a BulkWriteResult object detailing how many data keys were affected:

{
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 }
}
}
}