KeyVault.rawManyDataKey()
KeyVault.rewrapManyDataKey(filter, options)
複数のデータ暗号化キー(DEK)を復号化し、新しい CMK(Customer Master Key)で再暗号化します。 この方法を使用して、DEK を暗号化する CMK をローテーションします。 CMK と DEK の詳細については、「 キー 」を参照してください。
masterKey
パラメータを使用して CMK を指定します。masterKey
引数を含めない場合、 メソッドは各 DEK のメタデータで参照される CMK を使用して各 DEK を復号化および暗号化します。 DEK のメタデータの詳細については、「復号に使用されるメタデータ 」を参照してください。KeyVault.rewrapManyDataKey
の構文は次のとおりです。let keyVault = db.getMongo().getKeyVault() keyVault.rewrapManyDataKey( <filter>, <options> ) Parameterタイプ説明filter
キーヴォールト コレクションの クエリフィルターoptions
ドキュメントこのドキュメントには 2 つのフィールドがあります。
provider
: KMSプロバイダー( Amazon Web Services KMS 、 Azure Key Vault 、 GCP KMS 、ローカルプロバイダー、または KMIP)masterKey
:新しいデータキーの暗号化に使用される KMS 固有のキー
次の値を返します。 影響を受けたデータ キーの数を報告するBulkWriteResultオブジェクト。
警告
キーヴォールトコレクションのバックアップ
データ暗号化キーをローテーションする前に、キーヴォールト コレクションのバックアップを作成していることを確認してください。 If you lose access to your Data Encryption Keys, you will lose all your encrypted data.
コレクションのバックアップを作成する方法については、「 MongoDB ツールを使用した自己管理型配置のバックアップと復元 」を参照してください。
動作
この操作はアトミックではないため、他のキー管理操作と並行して実行しないでください。
データベース接続にクライアント側のフィールドレベル暗号化を構成する必要があります
mongosh
クライアント側のフィールドレベル暗号化メソッドでは、クライアント側のフィールドレベル暗号化が有効になっているデータベース接続が必要です。 現在のデータベース接続がクライアント側のフィールド レベル暗号化を有効にして開始されなかった場合、次のいずれかが発生します。
Mongo()
必要なクライアント側のフィールドレベル暗号化オプションとの接続を確立するには、mongosh
から コンストラクターを使用します。Mongo()
メソッドは、CMK(Customer Master Key)管理のために次のKMS ( KMS )プロバイダーをサポートしています。or
必要なオプションとの接続を確立するには、
mongosh
コマンドライン オプションを使用します。 コマンドライン オプションは、CMK 管理用のAmazon Web Services KMSプロバイダーのみをサポートしています。
例
これらの例により、クライアント側のフィールド レベルの暗号化を迅速に評価できます。 サポートされている各 KMSプロバイダーの使用例については、「暗号化キー管理 」を参照してください。
ローカルで管理されているキーに対してクライアント側のフィールドレベル暗号化を構成するには、次の手順に従います。
基本的な64でエンコードされた96バイトの string を生成し、改行を含まない
キーを読み込むには、
mongosh
を使用します。
export TEST_LOCAL_KEY=$(echo "$(head -c 96 /dev/urandom | base64 | tr -d '\n')") mongosh --nodb
生成されたローカルキーstringを使用して、クライアント側のフィールドレベル暗号化オブジェクトを作成します。
var autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__dataKeys", "kmsProviders" : { "local" : { "key" : BinData(0, process.env["TEST_LOCAL_KEY"]) } } }
データベース接続を作成するには、クライアント側のフィールドレベル暗号化オプションが構成されたMongo()
コンストラクターを使用します。 mongodb://myMongo.example.net
URI を、ターゲットクラスターの接続string 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
で再ラップする方法を示しています。
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 } } } }