メインコンテンツまでスキップ
適用対象:
DuoKey Cockpit v2MongoDB Queryable Encryption(QE)クエリ可能な、クライアントサイドのフィールドレベル暗号化

概要​

MongoDB の Queryable Encryption(QE) は、CSFLE と同じようにフィールドをクライアントサイドで暗号化したまま保ちますが、1 つの重要な違いがあります。特定のフィールドは依然としてクエリできるという点です — 等価、または数値/日付の範囲について、サーバーが平文を見ることも、決定的な CSFLE フィールドのように値を相関させることもないままクエリできます。クエリ可能な各フィールドは、それぞれ独自のデータ暗号化キー(DEK)を持ち、それらの DEK はカスタマーマスターキー(CMK) — DuoKey vault のキー — によってラップされます。

このアプリの役割は CSFLE と同様です。CMK をプロビジョニングして管理し、MongoDB ドライバーが必要とする 2 つの成果物 — どのフィールドが QE で暗号化され、どのクエリタイプを使うかを示す encryptedFieldsMap と、DEK 作成時にドライバーが masterKey として渡す CMK 参照(KMS プロバイダーとキー ID) — を出力します。

MongoDB Queryable Encryption — 暗号化が行われる場所
アプリケーションドキュメントの書き込み、暗号化フィールドへのクエリ
平文フィールド / クエリ述語
MongoDB ドライバー自動暗号化レイヤー
暗号文 + 暗号化されたクエリトークン
MongoDB サーバーencryptedFieldsMap で宣言されたコレクション + キーボールトコレクション
MongoDB ドライバー
アンラップ要求(CMK)
DuoKey vaultフィールドごとのすべての DEK をラップする CMK を保持

サーバーが平文を見ることは依然としてありません — ただし宣言されたフィールドについては、復号することなく暗号化された構造を突き合わせられます。

プロパティ値
暗号化モデルクライアントサイドのフィールドレベル暗号化 — フィールドごとにクエリ可能(等価/範囲)またはクエリ不可能
キーのカストディDuoKey vault のキーが、フィールドごとの DEK をラップする CMK として機能します
オンボーディングアプリ詳細ページ — ウィザードのエントリなし
実証ステータス出力される `encryptedFieldsMap` と CMK 参照は実物であり、そのまま利用可能。セルフテストは現時点ではシミュレーション — 下記参照

CSFLE と Queryable Encryption の比較​

CSFLEQueryable Encryption
サーバーが見るもの不透明な暗号文であり、クエリは一切不可暗号文だが、等価/範囲のクエリが機能するように構造化されている
クエリのサポート暗号化フィールドに対しては不可(決定的暗号化の場合のみ、相関のトレードオフを伴う完全一致に限り可能)決定的な暗号文の繰り返しなしに、宣言されたフィールドに対する等価および範囲の述語が可能
フィールドごとの設定フィールドごとに 1 つの暗号化スキーマ(決定的またはランダム)各フィールドが query_type を宣言します: equality、range(任意で最小/最大の境界を指定)、または none
キーのカストディモデルCMK がフィールドごとの DEK をラップ同じ — CMK がフィールドごとの DEK をラップ
どちらを選ぶか

フィールドをまったくクエリする必要がない場合、または完全一致の参照だけで済み、決定的暗号化の相関のトレードオフを受け入れられる場合は CSFLE を使用します。そのトレードオフなしに、暗号化フィールドに対する等価または範囲のクエリが必要な場合は Queryable Encryption を使用します — たとえば、暗号化された生年月日の範囲で患者記録をフィルタリングするようなケースです。よりシンプルなモデルについては MongoDB CSFLE を参照してください。

等価クエリや範囲クエリがサーバーサイドで完結する仕組み​

これは CSFLE のモデルでは実現できないステップです。CSFLE のフィールドはエンドツーエンドで不透明な暗号文であり、サーバーはそれを保存して返すことはできても、比較することはできません。Queryable Encryption のフィールドは、構造化された検索可能な暗号化方式を使用します。ドライバーはクエリ述語を暗号化されたトークンに変換し、MongoDB はそのトークンをそのフィールドの暗号化されたインデックス構造と突き合わせます — 復号することなく一致を判定します。

暗号化フィールドを復号せずにクエリする
1. アプリケーションがクエリを発行encryptedFieldsMap で宣言されたフィールドへの述語 — 等価または範囲
自動暗号化がクエリをインターセプト
2. ドライバーが述語を暗号化そのフィールドの DEK を使い、クエリ値を構造化された検索可能な暗号化トークンに変換
暗号化されたクエリトークン
3. MongoDB がサーバーサイドで一致を判定そのフィールドの暗号化されたインデックス構造とトークンを比較 — 復号なし
一致した暗号文ドキュメント
4. ドライバーが結果を復号CMK 経由で各 DEK をアンラップし、クライアントサイドで復号
5. アプリケーションが平文を受け取るこれらのフィールドが平文として存在する唯一の地点

ステップ 3 が CSFLE には不可能な部分です。サーバーは、不透明な暗号文を保存するだけでなく、宣言されたフィールドについて暗号化された構造を突き合わせます。

等価か範囲か、両方は不可

フィールドは一度に 1 つのクエリタイプ — equality または range — として宣言され、フィールド宣言の query_type(下記参照)と対応します。これは MongoDB 自身の制約を反映したものです。クエリ可能な暗号化フィールドは、設定されたクエリタイプをサポートし、任意の述語をサポートするわけではありません。

設定​

フィールド目的
mongodb_uridatabasecollection接続 URI と、フィールドが QE で暗号化される対象コレクション。
key_vault_namespaceMongoDB が暗号化されたデータキーを保存するために使用する名前空間(`database.collection`)。デフォルトは `encryption.__keyVault` です。
kms_providerDEK をラップする 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` です。
minmax`range` フィールドに対する、任意の境界値(両端を含む)。

出力される内容​

アプリをデプロイすると、CMK 参照と encryptedFieldsMap が返され、MongoDB ドライバーの AutoEncryptionOpts や db.createCollection(..., { encryptedFields }) にそのまま渡せます。

CMK 参照(DEK 作成時の masterKey)JSON
{
"provider": "kmip",
"key_id": "<cmk-vault-key-id>",
"key_vault_namespace": "encryption.__keyVault",
"endpoint_guid": "<app-endpoint-guid>"
}
encryptedFieldsMap — 等価フィールドと範囲フィールドJSON
{
"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 は意図的なものです

keyId が null の場合、MongoDB ドライバーは初回使用時に、上記の CMK でラップされたフィールドごとの DEK を自動作成します。上の notes フィールドには queries 配列がありません — 暗号化はされますが意図的にクエリ不可であり、query_type が none の場合に対応します。

ヘルスとセルフテスト​

チェック報告される内容現時点でのライブプローブ
ヘルスMongoDB への到達性、キーボールトへのアクセス、CMK への到達性なし — 固定の正常ステータスエンベロープを返します
セルフテストMongoDB への接続、キーボールトへのアクセス、CMK のラップ/アンラップ、等価/範囲クエリのラウンドトリップなし — 4 つのチェックすべてがハードコードされた合格を返します
実物とシミュレーションの正確な切り分け

有効化/無効化/ヘルス/セルフテストのハンドラーの挙動はシミュレーションであり、ライブの MongoDB ラウンドトリップはまだありません。しかし、上に示した encryptedFieldsMap と CMK 参照はプレースホルダーではありません。これらは実際のフィールド宣言と vault キーから生成されており、ドライバーの AutoEncryptionOpts でそのまま使用できます。

暗号化フィールドには createCollection が必要で、後からの ALTER では設定できません

Queryable Encryption の encryptedFields はコレクションの作成時に指定する必要があります — 既存のコレクションの既存ドキュメントに対して、後から有効にすることはできません。