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

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

項目一覧

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

このガイドでは、暗号化されたコレクションと、Queryable Encryption のストレージと書込みのコストを管理する方法を学習できます。

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 を超える場合は、インデックス圧縮を実行する必要があります。

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

戻る

フィールドとクエリ