MongoDB Queryable Encryption
特定のフィールドは、エンドツーエンドでクライアントサイドの暗号化を維持したまま、等価または範囲でクエリ可能なままです。
概要
MongoDB の Queryable Encryption(QE) は、CSFLE と同じようにフィールドをクライアントサイドで暗号化したまま保ちますが、1 つの重要な違いがあります。特定のフィールドは依然としてクエリできるという点です — 等価、または数値/日付の範囲について、サーバーが平文を見ることも、決定的な CSFLE フィールドのように値を相関させることもないままクエリできます。クエリ可能な各フィールドは、それぞれ独自のデータ暗号化キー(DEK)を持ち、それらの DEK はカスタマーマスターキー(CMK) — DuoKey vault のキー — によってラップされます。
このアプリの役割は CSFLE と同様です。CMK をプロビジョニングして管理し、MongoDB ドライバーが必要とする 2 つの成果物 — どのフィールドが QE で暗号化され、どのクエリタイプを使うかを示す encryptedFieldsMap と、DEK 作成時にドライバーが masterKey として渡す CMK 参照(KMS プロバイダーとキー ID) — を出力します。
サーバーが平文を見ることは依然としてありません — ただし宣言されたフィールドについては、復号することなく暗号化された構造を突き合わせられます。
| プロパティ | 値 |
|---|---|
| 暗号化モデル | クライアントサイドのフィールドレベル暗号化 — フィールドごとにクエリ可能(等価/範囲)またはクエリ不可能 |
| キーのカストディ | DuoKey vault のキーが、フィールドごとの DEK をラップする CMK として機能します |
| オンボーディング | アプリ詳細ページ — ウィザードのエントリなし |
| 実証ステータス | 出力される `encryptedFieldsMap` と CMK 参照は実物であり、そのまま利用可能。セルフテストは現時点ではシミュレーション — 下記参照 |
CSFLE と Queryable Encryption の比較
| CSFLE | Queryable Encryption | |
|---|---|---|
| サーバーが見るもの | 不透明な暗号文であり、クエリは一切不可 | 暗号文だが、等価/範囲のクエリが機能するように構造化されている |
| クエリのサポート | 暗号化フィールドに対しては不可(決定的暗号化の場合のみ、相関のトレードオフを伴う完全一致に限り可能) | 決定的な暗号文の繰り返しなしに、宣言されたフィールドに対する等価および範囲の述語が可能 |
| フィールドごとの設定 | フィールドごとに 1 つの暗号化スキーマ(決定的またはランダム) | 各フィールドが query_type を宣言します: equality、range(任意で最小/最大の境界を指定)、または none |
| キーのカストディモデル | CMK がフィールドごとの DEK をラップ | 同じ — CMK がフィールドごとの DEK をラップ |
フィールドをまったくクエリする必要がない場合、または完全一致の参照だけで済み、決定的暗号化の相関のトレードオフを受け入れられる場合は CSFLE を使用します。そのトレードオフなしに、暗号化フィールドに対する等価または範囲のクエリが必要な場合は Queryable Encryption を使用します — たとえば、暗号化された生年月日の範囲で患者記録をフィルタリングするようなケースです。よりシンプルなモデルについては MongoDB CSFLE を参照してください。
等価クエリや範囲クエリがサーバーサイドで完結する仕組み
これは CSFLE のモデルでは実現できないステップです。CSFLE のフィールドはエンドツーエンドで不透明な暗号文であり、サーバーはそれを保存して返すことはできても、比較することはできません。Queryable Encryption のフィールドは、構造化された検索可能な暗号化方式を使用します。ドライバーはクエリ述語を暗号化されたトークンに変換し、MongoDB はそのトークンをそのフィールドの暗号化されたインデックス構造と突き合わせます — 復号することなく一致を判定します。
ステップ 3 が CSFLE には不可能な部分です。サーバーは、不透明な暗号文を保存するだけでなく、宣言されたフィールドについて暗号化された構造を突き合わせます。
フィールドは一度に 1 つのクエリタイプ — equality または range — として宣言され、フィールド宣言の query_type(下記参照)と対応します。これは MongoDB 自身の制約を反映したものです。クエリ可能な暗号化フィールドは、設定されたクエリタイプをサポートし、任意の述語をサポートするわけではありません。
設定
| フィールド | 目的 | ||
|---|---|---|---|
mongodb_uri | database | collection | 接続 URI と、フィールドが QE で暗号化される対象コレクション。 |
key_vault_namespace | MongoDB が暗号化されたデータキーを保存するために使用する名前空間(`database.collection`)。デフォルトは `encryption.__keyVault` です。 | ||
kms_provider | DEK をラップする KMS プロバイダーの種類 — `kmip`(DuoKey)、`aws`、`azure`、`gcp`、または `local`。 | ||
cmk_key_id | カスタマーマスターキーとして機能する DuoKey vault のキー。 | ||
fields | 宣言されたクエリ可能な暗号化フィールド(下記参照)。 |
フィールド宣言
fields の各エントリは、Queryable Encryption の対象とするドキュメントフィールドを 1 つ宣言します。
| プロパティ | 目的 | |
|---|---|---|
path | ドキュメント内のドット区切りのフィールドパス。例: `ssn` や `patient.dob`。 | |
bson_type | フィールドの BSON 型(`string`、`int`、`long`、`date`、`decimal` など)。デフォルトは `string` です。 | |
query_type | `equality`、`range`、または `none`(暗号化するがクエリ不可)。デフォルトは `equality` です。 | |
min | max | `range` フィールドに対する、任意の境界値(両端を含む)。 |
出力される内容
アプリをデプロイすると、CMK 参照と encryptedFieldsMap が返され、MongoDB ドライバーの AutoEncryptionOpts や db.createCollection(..., { encryptedFields }) にそのまま渡せます。
{
"provider": "kmip",
"key_id": "<cmk-vault-key-id>",
"key_vault_namespace": "encryption.__keyVault",
"endpoint_guid": "<app-endpoint-guid>"
}{
"medical.patients": {
"fields": [
{
"path": "ssn",
"bsonType": "string",
"keyId": null,
"queries": [{ "queryType": "equality" }]
},
{
"path": "age",
"bsonType": "int",
"keyId": null,
"queries": [{ "queryType": "range", "min": 0, "max": 150 }]
},
{
"path": "notes",
"bsonType": "string",
"keyId": null
}
]
}
}keyId が null の場合、MongoDB ドライバーは初回使用時に、上記の CMK でラップされたフィールドごとの DEK を自動作成します。上の notes フィールドには queries 配列がありません — 暗号化はされますが意図的にクエリ不可であり、query_type が none の場合に対応します。
ヘルスとセルフテスト
| チェック | 報告される内容 | 現時点でのライブプローブ |
|---|---|---|
| ヘルス | MongoDB への到達性、キーボールトへのアクセス、CMK への到達性 | なし — 固定の正常ステータスエンベロープを返します |
| セルフテスト | MongoDB への接続、キーボールトへのアクセス、CMK のラップ/アンラップ、等価/範囲クエリのラウンドトリップ | なし — 4 つのチェックすべてがハードコードされた合格を返します |
有効化/無効化/ヘルス/セルフテストのハンドラーの挙動はシミュレーションであり、ライブの MongoDB ラウンドトリップはまだありません。しかし、上に示した encryptedFieldsMap と CMK 参照はプレースホルダーではありません。これらは実際のフィールド宣言と vault キーから生成されており、ドライバーの AutoEncryptionOpts でそのまま使用できます。
Queryable Encryption の encryptedFields はコレクションの作成時に指定する必要があります — 既存のコレクションの既存ドキュメントに対して、後から有効にすることはできません。