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

CSFLE 明示的な暗号化

明示的な暗号化により、セキュリティをきめ細やかに制御できますが、コレクションの構成や MongoDB ドライバー のコード記述の複雑さは増します。 明示的な暗号化では、データベースで実行する各操作に対してドキュメント内のフィールドを暗号化する方法を指定し、このロジックをアプリケーション全体に含めます。

次の MongoDB 製品で明示的な暗号化が利用できます。

  • MongoDB Community Server

  • MongoDB Enterprise Advanced

  • MongoDB Atlas

明示的な暗号化を使用するには、CSFLE 対応のアプリケーションで次のアクションを実行する必要があります。

明示的な暗号化を使用するには、ClientEncryption インスタンスを作成する必要があります。ClientEncryption はドライバー全体と mongosh で使用される抽象化であり、キーヴォールトコレクションと明示的な暗号化に関係する KMS 操作をカプセル化します。

ClientEncryptionインスタンスを作成するには、次の情報を指定する必要があります。

  • キーヴォールト コレクションへのアクセス権を持つMongoClientインスタンス

  • キーヴォールト コレクションの名前空間

  • カスタマー マスター キーをホストするKMSプロバイダーへのアクセス用に構成されたkmsProvidersオブジェクト

その他のClientEncryptionオプションについては、「 CSFLE 用の MongoClient オプション 」を参照してください。

ClientEncryptionインスタンスの作成方法を示すコード スニペットは、このガイドの例セクションを参照してください。

読み取りおよび書込み操作を実行する前に、アプリケーション全体で読み取りおよび書込み操作を更新し、アプリケーションがフィールドを暗号化する必要があります。

フィールドを暗号化するには、 ClientEncryptionインスタンスのencryptメソッドを使用します。

encryptメソッドの使用方法を示すコード スニペットは、このガイドの例セクションを参照してください。

明示的な暗号化を使用する場合、暗号化されたフィールドを手動または自動で復号化できます。

フィールドを手動で復号化するには、 ClientEncryptionインスタンスのdecryptメソッドを使用します。

decryptメソッドの使用方法を示すコード スニペットは、このガイドの例セクションを参照してください。

フィールドを自動的に復号化するには、 MongoClientインスタンスを次のように構成します。

  • キーヴォールトコレクションを指定する

  • kmsProvidersオブジェクトを指定する

  • MongoDB Community Server を使用する場合は、 bypassAutoEncryptionオプションをTrueに設定します

注意

MongoDB Community Server で自動復号化が利用可能

自動暗号化には MongoDB Enterprise または MongoDB Atlas が必要ですが、自動復号化には次の MongoDB 製品で利用できます。

  • MongoDB Community Server

  • MongoDB Enterprise Advanced

  • MongoDB Atlas

自動復号化を有効にする方法を示すコード スニペットは、ご希望の言語に対応するタブを選択します。

言語

次の構造を持つドキュメントを MongoDB インスタンスに挿入するとします。

{
"name": "<name of person>",
"age": <age of person>,
"favorite-foods": ["<array of foods>"]
}
1

この例では、同じMongoClientインスタンスを使用して Key Vault コレクションにアクセスし、暗号化されたデータの読み取りと書込みを行います。

次のコード スニペットは、 MongoClientインスタンスを作成する方法を示しています。

const autoEncryptionOpts = {
keyVaultNamespace: keyVaultNamespace,
kmsProviders: kmsProviders,
};
const encryptedClient = Mongo(connectionString, autoEncryptionOpts);
2

次のコード スニペットは、 ClientEncryptionインスタンスを作成する方法を示しています。

const clientEncryption = encryptedClient.getClientEncryption();
3

次のアルゴリズムを使用して、ドキュメントのフィールドを暗号化します。

フィールド名
暗号化アルゴリズム
BSON フィールド型

name

決定的な

文字列

age

暗号化なし

Int

favorite-foods

ランダム

配列

次のコード スニペットは、ドキュメント内のフィールドを手動で暗号化し、ドキュメントを MongoDB に挿入する方法を示しています。

注意

次の例の dataKeyId 変数は、データ暗号化キー(DEK)を参照しています。ローカル キー プロバイダーを使用して DEK を生成する方法については、クイック スタート を参照してください。特定のキー管理システムを使用して DEK を作成する方法については、CSFLE チュートリアル を参照してください。

const encName = clientEncryption.encrypt(
dataKeyId,
"Greg",
"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
);
const encFoods = clientEncryption.encrypt(
dataKeyId,
["Cheese", "Grapes"],
"AEAD_AES_256_CBC_HMAC_SHA_512-Random"
);
db.getSiblingDB(database).getCollection(collection).insertOne({
name: encName,
foods: encFoods,
});
4

次のコード スニペットは、挿入されたドキュメントを取得し、暗号化されたフィールドを手動で復号化する方法を示しています。

const encNameQuery = clientEncryption.encrypt(
dataKeyId,
"Greg",
"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
);
let doc = db.getSiblingDB(database).getCollection(collection).findOne({
name: encNameQuery,
});
console.log(doc);
doc.name = clientEncryption.decrypt(doc.name);
doc.foods = clientEncryption.decrypt(doc.foods);
console.log(doc);

MongoDB は、コレクション内の特定のフィールドの暗号化を強制するために、スキーマ検証を使用することをサポートしています。

特定のフィールドの暗号化を強制するように構成された MongoDB インスタンスで、明示的な暗号化メカニズムを使用してクライアント側のフィールドレベル暗号化を実行するクライアントは、MongoDB インスタンスに指定されたフィールドを暗号化する必要があります。

サーバー側で CSFLE を設定する方法については、「 CSFLE サーバー側でのスキーマ強制 」を参照してください。

キーヴォールト コレクション、データ暗号化キー、カスタマー マスター キーの詳細については、「暗号化キーとキーヴォールト 」を参照してください。

KMSプロバイダーと kmsProviders オブジェクトについて詳しく学ぶには、KMS プロバイダーを参照してください。

上記で説明されているトピックの実行可能な完全なコード例を表示してダウンロードするには、プログラミング言語を選択します。