AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

使用中の暗号化

Node.js ドライバーを使用すると、 使用中の暗号化と呼ばれる機能のセットを使用して、特定のドキュメント フィールドを暗号化できます。 使用中の暗号化により、アプリケーションは MongoDB に送信する前にデータを暗号化し、暗号化されたフィールドを持つドキュメントをクエリできます。

警告

MongoDB 8.2既知の問題点

mongocryptd のバージョン 8.2.0 はWindowsでは実行されない可能性があります。このバグは、mongocryptd の起動時に --logpath NUL 引数を指定すると、ドライバーによる使用中の暗号化に影響します。

この問題とその解決方法の詳細については、 MongoDB 8.2 の既知の問題 を参照してください。リリースノート。

使用中の暗号化は、MongoDB に送信されるとき、または暗号化されたデータベース内にあるときに権限のないユーザーがプレーンテキスト データを表示するのを防ぎます。 アプリケーションで使用中の暗号化を有効にし、そのアプリケーションがデータの復号化を許可するには、アプリケーションのみがアクセスできる暗号化キーを作成する必要があります。 暗号化のキーにアクセスできるアプリケーションのみが、復号されたプレーンテキスト データにアクセスできます。 攻撃者がデータベースへのアクセスを取得した場合、暗号化のキーにアクセスできないため、暗号化された暗号化された暗号化データのみが表示されます。

次のタイプの機密データを含む MongoDB ドキュメント内のフィールドを暗号化するには、使用中の暗号化を使用します。

  • クレジット カード番号

  • 住所

  • ヘルス情報

  • 金融情報

  • その他の機密情報または個人を特定できる情報(PII)

MongoDBは、使用中の暗号化を有効にするために次の機能を提供しています。

Queryable Encryption (QE) は、使用中の暗号化機能で、暗号化されたフィールド値に対して、等価、範囲、プレフィックス、サフィックス、および部分文字列のクエリを実行できます。範囲クエリのサポートにはMongoDB Server 8.0 以降が必要です。プレフィックス、サフィックス、および部分文字列クエリのサポートにはMongoDB Server 9.0 以降が必要です。

Queryable Encryptionの詳細については、 MongoDB Serverマニュアルの「 Queryable Encryption 」を参照してください。

クライアント側フィールド レベル暗号化( CSFLE )はMongoDB Serverバージョン 4.2 で導入され、暗号化されたフィールドの等価検索をサポートしています。 CSFLE は、フィールドを暗号化するために決定的またはランダムな暗号化アルゴリズムのいずれかを選択できる点で Queryable Encryption と異なります。 CSFLE を使用している場合は、決定的な暗号化アルゴリズムを使用する暗号化されたフィールドのみをクエリできます。 CSFLE のフィールドを暗号化するためにランダムな暗号化アルゴリズムを使用する場合、それらは復号化することはできますが、それらのフィールドに対して等価クエリを実行することはできません。 Queryable Encryption を使用する場合、暗号化アルゴリズムを指定することはできませんが、すべての暗号化されたフィールドをクエリできます。

値を確定的に暗号化すると、同じ入力値によって同じ出力値が生成されます。 決定的な暗号化を使用すると、暗号化されたフィールドに対してクエリを実行できますが、濃度の低い暗号化データは、頻度分析によるコードの影響を受けやすくなります。

Tip

これらの概念の詳細については、 Wikipedia の次のエントリを参照してください。

CSFLEの詳細については、サーバー マニュアルの「CSFLE」を参照してください。

MongoDB Server 8.1 以降では、 使用中の暗号化用に構成されたクライアントで $lookup集計ステージを使用できます。この機能には、mongodb-client-encryptionパッケージバージョン 6.3.0 以降が必要です。

$lookup ステージでは、アプリケーションコードでドキュメントを手動で取得して結合する必要なく、暗号化されたコレクション全体の関連データを結合できます。使用中の暗号化には、ソースコレクションと fromコレクションの両方を構成する必要があります。localField と foreignField で指定されるフィールドは暗号化されたフィールドであってはなりません。

次の例では、暗号化されたコレクションに対する $lookup操作を示しています。

const pipeline = [ { $lookup: { from: "encryptedCollection", localField: "userId", foreignField: "_id", as: "userDetails" } }]; const results = await collection.aggregate(pipeline).toArray();

重要

$rerank ステージは、クライアント側フィールドレベル暗号化または Queryable Encryption を使用した自動暗号化用に構成されたクライアントではサポートされていません。$rerank を含むパイプラインは、Unrecognized pipeline stage name: '$rerank' のようなエラーで失敗します。

この制限は、暗号化されたフィールドを持たないコレクションを含むすべてのコレクション、および$unionWithなどのサブパイプライン内での$rerankの使用に適用されます。

バージョン 7.6 以降の Node.js ドライバーでは、Node.js ドライバーが行うキー マネジメント システム (KMS) へのリクエストを HTTP proxy を介してルーティングできます。お使いの環境で、外向き KMS トラフィックを HTTP フォワード プロキシを介して通過する必要がある場合は、この機能を使用します。proxyOptions 設定は SOCKS5 プロトコルのみをサポートしており、このケースは対象外です。

ドライバーが KMS ホストに接続する方法を制御するには、ClientEncryptionOptions オブジェクトまたは AutoEncryptionOptions オブジェクトで kmsConnectCallback オプションを設定します。このオプションを設定すると、ドライバーは KMS ホストに直接接続する代わりに、コールバックを呼び出します。コールバックには次のプロパティが渡されます:

プロパティ
説明

host

ドライバーが接続する必要がある KMS ホストのホスト名。

port

ドライバーが接続する必要がある KMS ホストするポート。

timeoutMS

Node.jsドライバー 7.8 以降で非推奨となりました。このプロパティは効果がなく、将来のリリースで削除される予定です。以前のドライバーバージョンでは、操作のクライアント側操作タイムアウト予算の残り時間がミリ秒単位で含まれていました。

signal

操作が中止されたときに中止される AbortSignal。シグナルが発火したとき、コールバックは接続を停止し、拒否する必要があります。

次の例では、プロキシに HTTP CONNECT リクエストを送信することで KMS ホストへのトンネルを開き、その後コールバックを ClientEncryption インスタンスに渡すコールバックが定義されています。

import * as net from "net"; const kmsConnectCallback = ({ host, port, signal }) => new Promise((resolve, reject) => { // Opens a plain connection to the proxy, not to the KMS host. // Passing signal lets Node abort the connection attempt when the // driver aborts the operation. const socket = net.connect({ host: "proxy.example.com", port: 8080, signal }); // Guards against a proxy that accepts the connection but stops // responding. The driver applies no timeout to the KMS connection, // so use an application-chosen idle timeout. It stays active after // the CONNECT exchange, so it also covers the TLS handshake and // KMS request that the driver performs over this socket. socket.setTimeout(10000, () => { socket.destroy(new Error("KMS connection timed out")); }); socket.once("error", reject); socket.once("connect", () => { // Asks the proxy to tunnel to the KMS host socket.write( `CONNECT ${host}:${port} HTTP/1.1\r\n` + `Host: ${host}:${port}\r\n\r\n` ); socket.once("data", chunk => { if (chunk.toString("utf8").startsWith("HTTP/1.1 200")) { // Returns the socket so that the driver can perform the // TLS handshake resolve(socket); } else { socket.destroy(); reject(new Error("Proxy refused the CONNECT request")); } }); }); }); const clientEncryption = new ClientEncryption(keyVaultClient, { keyVaultNamespace, kmsProviders, kmsConnectCallback});

signal プロパティは、プロキシへの接続に適用されます。操作が中止されると、シグナルが発火し、ノードは接続試行を停止します。

setTimeout() 呼び出しは、接続を受け入れるものの応答を停止するプロキシに対する保護を提供します。ドライバーは、kmsConnectCallback またはその後の KMS リクエストにタイムアウトを適用しません。アイドルタイムアウトを選択しないと、操作がハングする可能性があります。ソケットに 10 秒間データが到着しない場合、タイムアウトが発生します。これは CONNECT 交換後もアクティブなままなので、TLS ハンドシェイクとドライバーがトンネル経由で送信する KMS リクエストもカバーします。タイムアウトが発生すると、例は socket.destroy() にエラーを渡し、保留中の操作を拒否します。ドライバーは、各 KMS リクエストの後にソケットを閉じます。

前の例は、呼び出しの順序を示すために短縮されています。本番コードでは、応答が複数のチャンクに分かれて到着する可能性があるため、プロキシからの応答をヘッダーブロックの終わりを受信するまでバッファリングします。

重要

kmsConnectCallback と proxyOptions のオプションは排他関係にあります。kmsConnectCallback を設定し、proxyOptions で proxyHost 値を指定すると、ドライバーは MongoCryptInvalidArgumentError を発生させます。