暗号化されたコレクションのマネジメント
フィールドレベルの暗号化のパフォーマンスとストレージのコストを理解することが重要です。 暗号化された各フィールド:
挿入操作とアップデート操作に書込み (write) を追加します。
MongoDB は暗号化されたフィールド インデックスを維持するため、追加のストレージが必要です。
このセクションでは、操作ごとの書込み (write) をリストアップし、暗号化されたコレクションのインデックスを圧縮して書込みとストレージのコストを最小限に抑える方法について説明します。
Overview
Queryable Encryption では、ランダム化された暗号化を使用してドキュメント内の機密フィールドを暗号化する機能が導入されていますが、暗号化されたフィールドには引き続きクエリを実行できます。
Queryable Encryption を使用すると、特定のプレーンテキスト値は常に別の暗号化に暗号化されますが、クエリ可能な状態のままになります。 この機能を有効にするために、Queryable Encryption は 3 つのデータ構造を使用します。
2 つのメタデータ コレクション
暗号化されたコレクション内のすべてのドキュメントのフィールド
__safeContent__
重要
これらのデータ構造を変更または削除しないことが重要です。クエリ結果が不正確になるためです。
メタデータコレクション
暗号化されたコレクションを作成すると、MongoDB は 2 つのメタデータコレクションを作成します。
enxcol_.<collectionName>.esc
と呼ばれるESC
enxcol_.<collectionName>.ecoc
と呼ばれるECOC
例
「可能性」というコレクションを作成すると、MongoDB により次のメタデータ コレクションが作成されます。
enxcol_.patients.esc
enxcol_.patients.ecoc
クエリ可能な暗号化されたフィールドを持つドキュメントを挿入すると、MongoDB はメタデータコレクションを更新して、クエリを有効なインデックスを維持します。 フィールドは「インデックス付きフィールド」になります。 これにより、ストレージとフィールドごとにストレージと書込み速度がコストされます。
暗号化されたコレクションの削除
暗号化されたコレクションを削除すると、そのコレクションの直後に関連するメタデータ コレクションのenxcol_.<collectionName>.esc
とenxcol_.<collectionName>.ecoc
を削除します。 それ以外の場合、同じ名前でコレクションを再作成すると、メタデータコレクションが競合状態になり、過剰なストレージ領域が消費され、CRUD パフォーマンスが低下します。
ストレージのコスト
ドキュメントあたりのインデックス付きフィールド数に応じて、ストレージと書込みのコストが増加します。
重要
メタデータコレクションを考慮するために、Queryable Encryption コレクションにはドキュメントの 2 ~ 3 倍のストレージ要件があると予想されます。 たとえば、1 GB のコレクションには 2 ~ 3 GB のストレージが必要です。
書込みコスト
挿入操作
ドキュメントを挿入する場合、インデックス付きフィールドごとにメタデータ コレクションへの追加の書込み (write) が必要です。
への 1 つの書き込み
ESC
への 1 つの書き込み
ECOC
例
2 つのインデックス付きフィールドを持つドキュメントを挿入するには、次のことが必要です。
暗号化されたコレクションへの 1 回の書込み。
メタデータ コレクションへの 4 回の書込み。
アップデート操作
ドキュメントを更新する場合、インデックス付きフィールドごとにメタデータ コレクションへの追加の書込み (write) が必要です。
への 1 つの書き込み
ESC
への 1 つの書き込み
ECOC
例
2 つのインデックス付きフィールドを持つドキュメントを更新するには、次の操作が必要です。
暗号化されたコレクションへの 1 回の書込み。
メタデータ コレクションへの 4 回の書込み。
削除操作
ドキュメントを削除する場合、インデックス フィールドでは追加の書込み (write) は必要ありません。
メタデータコレクションの圧縮
ドキュメントを挿入またはアップデートすると、メタデータコレクションが変更され、大きくなります。 メタデータコレクションを圧縮すると、メタデータコレクションが排除され、サイズが縮小されます。
重要
メタデータコレクションの圧縮を手動で実行する必要があります。 圧縮は、 Queryable Encryption 用に構成されたクライアントでのみ機能します。
ECOC
のサイズが 1 GB を超えるときに圧縮を実行します。
コレクションのサイズは、 mongosh
とdb.collection.totalSize()
コマンドを使用して確認できます。
例
この例では、暗号化されたコレクションの名前は「patients」です。
db.enxcol_.patients.ecoc.totalSize()
1407960328
メタデータコレクションの圧縮を実行するには、 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, ... }