暗号化されたコレクションのマネジメント
このガイドでは、暗号化されたコレクションと、Queryable Encryption のストレージと書込みのコストを管理する方法を学習できます。
Overview
Queryable Encryption では、ランダム化された暗号化を使用してドキュメント内の機密フィールドを暗号化する機能が導入されていますが、暗号化されたフィールドには引き続きクエリを実行できます。
Queryable Encryption を使用すると、特定のプレーンテキスト値は常に別の暗号化に暗号化されますが、クエリ可能な状態のままになります。 この機能を有効にするために、Queryable Encryption は 4 つのデータ構造を使用します。
3 つのメタデータ コレクション
暗号化されたコレクション内のすべてのドキュメントのフィールド
__safeContent__
重要
これらのデータ構造を変更または削除しないことが重要です。クエリ結果が不正確になるためです。
メタデータコレクション
Queryable Encryption を使用して暗号化されたコレクションを作成すると、MongoDB は 3 つのメタデータコレクションを作成します。
enxcol_.<collectionName>.esc
と呼ばれるESC
enxcol_.<collectionName>.ecc
と呼ばれるECC
enxcol_.<collectionName>.ecoc
と呼ばれるECOC
例
「可能性」というコレクションを作成すると、MongoDB により次のメタデータ コレクションが作成されます。
enxcol_.patients.esc
enxcol_.patients.ecc
enxcol_.patients.ecoc
クエリ対象の暗号化されたフィールドを持つドキュメントを挿入すると、MongoDB はメタデータコレクションを更新して、クエリを実行できるインデックスを維持します。 MongoDB では、これを「インデックス フィールド」と呼ばれます。 これにより、ストレージと書込み速度がコストされます。
ストレージのコスト
ドキュメントあたりのインデックス付きフィールド数に応じて、ストレージと書込みのコストが増加します。
重要
テクニカル プレビュー
テクニカル プレビュー中の MongoDB のガイダンスでは、Queryable Encryption コレクションと関連するメタデータ コレクションのストレージ要件が 2 倍から 3 倍になることが予想されています。 たとえば、1 GB のコレクションには、関連するメタデータ コレクション用に 2 ~ 3 GB のストレージ要件がある場合があります。
このガイダンスは、将来のリリースで調整される予定です。
書込みコスト
挿入操作
ドキュメントを挿入する場合、インデックス付きフィールドごとにメタデータ コレクションへの 2 回の書込みが必要です。
への 1 つの書き込み
ESC
への 1 つの書き込み
ECOC
例
2 つのインデックス付きフィールドを持つドキュメントを挿入するには、次のことが必要です。
暗号化されたコレクションへの 1 回の書込み。
メタデータ コレクションへの 4 回の書込み。
アップデート操作
ドキュメントを更新する場合、インデックス付きフィールドごとにメタデータ コレクションへの 4 回の書込みが必要です。
への 1 つの書き込み
ESC
への 1 つの書き込み
ECC
への書込み (write) 2
ECOC
例
2 つのインデックス付きフィールドを持つドキュメントを更新するには、次の操作が必要です。
暗号化されたコレクションへの 1 回の書込み。
メタデータ コレクションへの 8 回の書込み。
削除操作
ドキュメントを削除する場合、インデックス付きフィールドごとにメタデータ コレクションへの 2 回の書込みが必要です。
への 1 つの書き込み
ECC
への 1 つの書き込み
ECOC
例
2 つのインデックス付きフィールドを持つドキュメントを削除するには、次のことが必要です。
暗号化されたコレクションへの 1 回の書込み。
メタデータ コレクションへの 4 回の書込み。
インデックスの圧縮
重要
テクニカル プレビュー
テクニカル プレビュー中にインデックス圧縮を実行する必要があります。 MongoDB は、将来のリリースでインデックス圧縮を自動的に実行する予定です。
ドキュメントを挿入、更新、削除すると、メタデータコレクションが変更され、大きくなります。 インデックス圧縮は、メタデータコレクションを排除してサイズを縮小するプロセスです。
ECOC
のサイズが 1 GB を超える場合は、インデックス圧縮を実行する必要があります。
コレクションのサイズは、 mongosh
とdb.collection.totalSize()
コマンドを使用して確認できます。
例
この例では、暗号化されたコレクションの名前は「patients」です。
db.enxcol_.patients.ecoc.totalSize()
1407960328
重要
インデックス圧縮を実行するには、クライアントを Queryable Encryption 用に構成する必要があります。
インデックス圧縮を実行するには、 mongosh
を使用し、 db.collection.compactStructuredEncryptionData()
コマンドを実行してメタデータコレクションのサイズを縮小します。
例
const eDB = "encryption" const eKV = "__keyVault" const secretDB = "records" const secretCollection = "patients" const localKey = fs.readFileSync("master-key.txt") const localKeyProvider = { key: localKey } const queryableEncryptionOpts = { kmsProviders: { local: localKeyProvider }, keyVaultNamespace: `${eDB}.${eKV}`, } const encryptedClient = Mongo("localhost:27017", queryableEncryptionOpts) const encryptedDB = encryptedClient.getDB(secretDB) const encryptedCollection = encryptedDB.getCollection(secretCollection) encryptedCollection.compactStructuredEncryptionData()
{ "stats": { ... }, "ok": 1, ... }