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

使用中の暗号化

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コレクションの両方を構成する必要があります。localFieldforeignField で指定されるフィールドは暗号化されたフィールドであってはなりません。

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

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

Starting in Node.js driver version 7.6, you can route the requests that the Node.js driver makes to your key management system (KMS) through an HTTP proxy. Use this feature when your environment requires outbound KMS traffic to pass through an HTTP forward proxy. The proxyOptions setting supports only the SOCKS5 protocol and doesn't cover this case.

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

プロパティ
説明

host

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

port

ドライバーが到達する必要がある KMS ホストのポート。

timeoutMS

操作のクライアント側操作タイムアウト(CST)バケットに残っている時間(ミリ秒単位)。このプロパティは、操作に COT が構成されていない場合、undefined です。

signal

接続試行がタイムアウト 予算を超えると中止される AbortSignal。シグナルが起動すると、コールバックは接続を停止して拒否する必要があります。

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

import * as net from "net";
const kmsConnectCallback = ({ host, port, timeoutMS, 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's timeout budget expires.
const socket = net.connect({
host: "proxy.example.com",
port: 8080,
signal
});
// Applies the remaining CSOT budget to the proxy handshake, so that
// a proxy that accepts the connection but never answers CONNECT
// can't stall the operation.
if (timeoutMS !== undefined) {
socket.setTimeout(timeoutMS, () => {
socket.destroy();
reject(new Error("Timed out waiting for the proxy"));
});
}
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")) {
// Clears the handshake timeout and returns the socket so that
// the driver can perform the TLS handshake
socket.setTimeout(0);
resolve(socket);
} else {
socket.destroy();
reject(new Error("Proxy refused the CONNECT request"));
}
});
});
});
const clientEncryption = new ClientEncryption(keyVaultClient, {
keyVaultNamespace,
kmsProviders,
kmsConnectCallback
});

signalプロパティはプロキシへの接続に適用され、timeoutMSプロパティはCONNECT 交換に適用されます。 CONNECT の交換が終了した後もソケット タイムアウトはアクティブのままになるため、Promise を解決する前にタイムアウトをクリアしてください。そうしないと、ドライバーが TLS ハンドシェイクを実行しているときにタイムアウトによってソケットが破棄される可能性があります。

上記の例は、呼び出しのシーケンスを示すために圧縮されています。実稼働コードでは、応答が複数のチャンクにまたがって到達する可能性があるため、 ヘッダー ブロックの末尾を受信するまでプロキシの応答をバッファします。

重要

kmsConnectCallback オプションと proxyOptions オプションは相互に排他的です。 kmsConnectCallback を設定し、proxyOptionsproxyHost の値を指定すると、ドライバーは MongoCryptInvalidArgumentError を発生させます。