Overview
C++ドライバーでは、 使用中の暗号化と呼ばれる機能のセットを使用して、特定のドキュメントフィールドを暗号化できます。 使用中の暗号化により、アプリケーションはMongoDBに送信する前にデータを暗号化し、暗号化されたフィールドを持つドキュメントをクエリできます。
警告
MongoDB 8.2既知の問題点
mongocryptd のバージョン 8.2.0 はWindowsでは実行されない可能性があります。このバグは、mongocryptd の起動時に --logpath NUL 引数を指定すると、ドライバーによる使用中の暗号化に影響します。
この問題とその解決方法の詳細については、 MongoDB 8.2 の既知の問題 を参照してください。リリースノート。
使用中の暗号化は、 MongoDBに送信されるとき、または 暗号化されたデータベース内にあるときに権限のないユーザーがプレーンテキスト データを表示するのを防ぎます。 アプリケーションで使用中の暗号化を有効にし、そのアプリケーションがデータの復号化を許可するには、アプリケーションのみがアクセスできる暗号化キーを作成する必要があります。 暗号化のキーにアクセスできるアプリケーションのみが、復号されたプレーンテキスト データにアクセスできます。 攻撃者がデータベースへのアクセスを取得した場合、暗号化のキーにアクセスできないため、暗号化された暗号化された暗号化データのみが表示されます。
使用中の暗号化を使用して、次のタイプの機密データを含むMongoDBドキュメント内のフィールドを暗号化できます。
クレジット カード番号
住所
ヘルス情報
金融情報
その他の機密情報または個人を特定できる情報(PII)
MongoDBは、使用中の暗号化を有効にするために次の機能を提供しています。
重要
$rerank ステージは、クライアント側フィールドレベル暗号化または Queryable Encryption を使用した自動暗号化用に構成されたクライアントではサポートされていません。$rerank を含むパイプラインは、Unrecognized pipeline stage name: '$rerank' のようなエラーで失敗します。
この制限は、暗号化されたフィールドを持たないコレクションを含むすべてのコレクション、および$unionWithなどのサブパイプライン内での$rerankの使用に適用されます。
Queryable Encryption
Queryable Encryption (QE) は、暗号化されたフィールド値に対して、等価、範囲、プレフィックス、サフィックス、部分文字列のクエリを実行できる使用中の暗号化機能です。範囲クエリのサポートには、MongoDB Server 8.0 以降が必要です。プレフィックス、サフィックス、および部分文字列クエリのサポートには、MongoDB Server 9.0 以降が必要です。
Queryable Encryptionの詳細については、 MongoDB Serverマニュアルの「 Queryable Encryption 」を参照してください。
クライアントサイドのフィールド レベル暗号化
クライアント側フィールド レベル暗号化(CSFLE)は、暗号化されたフィールドの等価性検索をサポートしています。CSFLE は、フィールドを暗号化するために決定的またはランダムな暗号化アルゴリズムのいずれかを選択できる点でQueryable Encryptionと異なります。CSFLE を使用している場合は、決定的な暗号化アルゴリズムを使用する暗号化されたフィールドのみをクエリできます。CSFLE のフィールドを暗号化するためにランダムな暗号化アルゴリズムを使用する場合、それらは復号化することはできますが、それらのフィールドに対して等価クエリを実行することはできません。Queryable Encryptionを使用する場合、暗号化アルゴリズムを指定することはできませんが、すべての暗号化されたフィールドをクエリできます。
値を確定的に暗号化すると、同じ入力値によって同じ出力値が生成されます。 決定的な暗号化を使用すると、暗号化されたフィールドに対してクエリを実行できますが、濃度の低い暗号化データは、頻度分析によるコードの影響を受けやすくなります。
このセクションでは、次のメカニズムを使用して CSFLE を構成する方法を示します。
自動暗号化の設定
自動暗号化により、フィールドを暗号化する方法を指定せずに、暗号化された読み取りおよび書込み操作を実行できます。自動暗号化を有効にするには、次のいずれかを使用します。
crypt_shared(推奨) :暗号化スキーマを読み取って、どのフィールドを暗号化および復号化するかを決定する動的ライブラリ。このライブラリを使用する場合、自動暗号化 を実行するために別の プロセスを生成する必要はありません。mongocryptd: MongoDB Enterprise Serverで事前にパッケージ化されたバイナリで、指定された自動暗号化ルールを使用して暗号化のフィールドをマークします。mongocryptdは CSFLE 対応のクライアントを作成すると自動的に生成されますが、options::auto_encryptionインスタンスでバイナリを明示的に起動することもできます。
重要
mongocryptd にはMongoDB Enterprise Server v4.2 以降が必要です。
自動暗号化 の構成の詳細については、 MongoDB Serverマニュアルの「 CSFLE ライブラリのインストールと構成 」を参照してください。
暗号化スキーマの設定
自動暗号化スキーマを指定するには、 schema_map オプションを使用します。暗号化スキーマには、どのフィールドを暗号化する必要があるか、またそれらのフィールドを暗号化する方法を識別するユーザー指定のルールが含まれています。
schema_mapJSON schema ドラフト 標準構文に準拠するJSONドキュメントに オプションを設定します。4このドキュメントには、暗号化するフィールド名と、使用する暗号化オプションを設定する各フィールド名の下にネストされた encryptオブジェクトを含める必要があります。
Tip
暗号化スキーマの詳細については、 MongoDB Serverマニュアルの「 CSFLE 暗号化スキーマ 」を参照してください。
次のコードは、 JSON スキーマドキュメントを指定するための構文を示しています。
auto data_key_id = client_encryption.create_data_key("local");auto json_schema = document{} << "properties" << open_document << "encryptedFieldName" << open_document << "encrypt" << open_document << "keyId" << open_array << data_key_id << close_array << "bsonType" << "string" << "algorithm" << "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" << close_document << close_document << close_document << "bsonType" << "object" << finalize;前述の json_schemaドキュメントを使用して自動暗号化スキーマを構成する完全な例については、 ドライバーソースコードの 自動 CSFLE の例を参照してください。
Tip
また、 サーバー側のフィールドレベル暗号化の自動暗号化スキーマを指定することもできます。完全な例を表示するには、サーバー側フィールド レベル暗号ソースコード強制の例を参照してください。
明示的な暗号化の構成
明示的な暗号化では、ドライバーの暗号化ライブラリを使用して暗号化された操作を実行できます。明示的な暗号化を使用するには、アプリケーション全体で暗号化ロジックを指定する必要があります。
次の例では、 挿入操作の明示的な暗号化を構成し、暗号化されたメッセージをデータベースに挿入します。
// Configure your MongoDB client's encryption options here
class client_encryption client_encryption(std::move(client_encryption_opts));
auto data_key_id = client_encryption.create_data_key("local");options::encrypt encrypt_opts{};encrypt_opts.key_id(data_key_id.view());encrypt_opts.algorithm(options::encrypt::encryption_algorithm::k_deterministic);
// Explicitly encrypts a BSON valueauto to_encrypt = bsoncxx::types::bson_value::make_value("secret message");auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts);
// Explicitly decrypts a BSON valueauto decrypted_message = client_encryption.decrypt(encrypted_message);
// Inserts the encrypted value into the databasecoll.insert_one(make_document(kvp("encryptedField", encrypted_message)));明示的な暗号化を構成する完全な例については、 ドライバーソースコードの 明示的な暗号化の例 を参照してください。
自動復号化による明示的な暗号化
すべてのユーザーに対してサポートされている明示的な暗号化と自動復号化を構成できます。自動暗号化を使用せずに自動復号化を構成するには、options::auto_encryptionインスタンスを作成し、その bypass_auto_encryptionフィールドをtrue に設定します。次に、これらのオプションをクライアントに適用します。
次の例では、自動復号化を使用して明示的な暗号化を構成するための options::auto_encryptionインスタンスを作成し、このオプションインスタンスをoptions::client の auto_encryption_optsフィールドに渡します。これにより、 自動復号化 を使用するように構成されたクライアントが作成されます。
options::auto_encryption auto_encrypt_opts{};auto_encrypt_opts.bypass_auto_encryption(true);
options::client client_opts{};client_opts.auto_encryption_opts(std::move(auto_encrypt_opts));class client client_encrypted {uri{}, std::move(client_opts)};自動復号化を使用して明示的な暗号化を構成する完全な例については、 ドライバーソースコードの 明示的な暗号化の自動復号化の例 を参照してください。
詳細情報
CSFLEの詳細については、 MongoDB Serverマニュアルの「CSFLE」を参照してください。