MongoDB クライアントサイドフィールドレベル暗号化(CSFLE)
特定のドキュメントフィールドは、アプリケーションから出る前にドライバーによって暗号化されます — MongoDB 自身が保存し返すのは、常に不透明な暗号文だけです。
概要
MongoDB のクライアントサイドフィールドレベル暗号化(CSFLE)は、選択したドキュメントフィールドを、書き込みが MongoDB サーバーに到達する前にドライバー内で暗号化し、読み取り時に復号します。サーバーがそれらのフィールドの平文を見ることはありません。また、この方式で暗号化されたフィールドはクエリに対して不透明です。MongoDB は暗号文を保存して返すことはできますが、それに対してフィルタリング、ソート、インデックス付けを行うことはできません。
暗号化された各フィールドは、フィールドごとのデータ暗号化キー(DEK)によって保護され、DEK はキーボールトコレクションと呼ばれる MongoDB のコレクションに保存されます。それらの DEK 自体は、KMS プロバイダーから供給されるカスタマーマスターキー(CMK)によってラップされます。このアプリの役割は、その KMS プロバイダーになることです。DuoKey が CMK を預かり、DEK の作成とアンラップに必要な参照をドライバーに渡します。
暗号化されたフィールドの平文を目にするのはドライバーのプロセスだけであり、MongoDB 自身が保存して返すのは暗号文のみです。
| プロパティ | 値 |
|---|---|
| 暗号化モデル | クライアントサイドのフィールドレベル暗号化 — 不透明でクエリ不可能な暗号文 |
| キーのカストディ | DuoKey vault のキーが、MongoDB のキーボールトコレクションに保存された DEK をラップします |
| オンボーディング | ガイド付きのマルチステップウィザード |
| 実証ステータス | デプロイと設定の生成は実物。セルフテストは現時点ではシミュレーション — 下記参照 |
この統合のセルフテストとヘルスチェックのエンドポイントは、現時点では稼働中の MongoDB デプロイに対するライブのラウンドトリップを実行せず、シミュレーションされたハードコードの結果を返します。アプリのレコード、リンクされた vault キー、生成される設定は実物ですが、セルフテストの合否シグナルはまだライブの暗号化/復号呼び出しに裏付けられていません。
設定
| フィールド | 目的 |
|---|---|
mongodb_uri | MongoDB の接続 URI(`mongodb://` または `mongodb+srv://`) — Atlas とセルフホストの両方のデプロイに対応します。 |
database | 対象データベース。 |
key_vault_namespace | MongoDB が暗号化されたデータキーを保存するために使用する名前空間(`database.collection`)。デフォルトは `encryption.__keyVault` です。 |
kms_provider | ドライバーがマスターキーに到達するために使用する KMS プロバイダーの種類: `kmip`(DuoKey、推奨)、`aws`、`azure`、`gcp`、または `local`(開発用途のみ)。 |
encryption_schema | どのフィールドをどのように(決定的またはランダム)暗号化するかを宣言する JSON スキーマ。 |
linked_key_id | DEK をラップするマスターキーとして機能する DuoKey vault のキー。 |
ウィザードによるオンボーディング
MongoDB への接続
接続 URI と対象データベースを入力します。
KMS プロバイダー
KMS プロバイダーを選択します — DuoKey を利用するデプロイでは KMIP が推奨です。
暗号化スキーマ
どのフィールドを暗号化するか、およびそのアルゴリズムを定義します(決定的暗号化は暗号文に対する等価一致を可能にしますが、ランダム暗号化は不可能です)。
キーボールト
MongoDB が暗号化されたデータキーを保存するキーボールトの名前空間を設定します。
vault とキー
データキーをラップする DuoKey の vault とマスターキーを選択します。
レビューとデプロイ
サマリーを確認し、Node.js、Python、Java、Go 向けのドライバー設定スニペットを取得します。
決定的に暗号化されたフィールドは、同じ平文に対して常に同じ暗号文を生成するため、ドライバーはそのフィールドに対して完全一致のクエリを実行できます — ただし、どのドキュメントが同じ値を共有しているかが漏れるという代償があります。ランダムに暗号化されたフィールドは暗号文が繰り返されることがなく、まったくクエリできません。完全一致を超えるクエリ(たとえば範囲)が必要な場合、CSFLE では対応できません — MongoDB Queryable Encryption を参照してください。
CSFLE の書き込みの流れ
ステップ 2〜4 はすべてドライバーのプロセス内で行われ、MongoDB 自身に渡されるのは常に暗号文だけです。
ヘルスとセルフテスト
| チェック | 報告される内容 | 現時点でのライブプローブ |
|---|---|---|
| ヘルス | MongoDB への到達性、キーボールトへのアクセス可否 | なし — 固定の正常ステータスエンベロープを返します |
| セルフテスト | MongoDB への接続、キーボールトへのアクセス、フィールドの暗号化/復号のラウンドトリップ、KMS プロバイダーへの到達性 | なし — 4 つのチェックすべてがハードコードされた合格を返します |
セルフテストがライブの MongoDB セッションを実行するようになるまでは、(暗号化クライアントを介さずシェルから)生のドキュメントを確認し、対象フィールドが平文ではなく BSON バイナリの暗号文になっていることを検査して、フィールド暗号化が実際に有効であることを確認してください。