Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / / /

暗号化されたコレクションのマネジメント

項目一覧

  • Overview
  • メタデータコレクション
  • 暗号化されたコレクションの削除
  • ストレージのコスト
  • 書込みコスト
  • 挿入操作
  • アップデート操作
  • 削除操作
  • メタデータコレクションの圧縮

フィールドレベルの暗号化のパフォーマンスとストレージのコストを理解することが重要です。 暗号化された各フィールド:

  • 挿入操作とアップデート操作に書込み (write) を追加します。

  • MongoDB は暗号化されたフィールド インデックスを維持するため、追加のストレージが必要です。

このセクションでは、操作ごとの書込み (write) をリストアップし、暗号化されたコレクションのインデックスを圧縮して書込みとストレージのコストを最小限に抑える方法について説明します。

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>.escenxcol_.<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 を超えるときに圧縮を実行します。

コレクションのサイズは、 mongoshdb.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,
...
}

戻る

フィールドとクエリ