クライアントサイドのフィールド レベル暗号化
クライアントサイドのフィールド レベル暗号化
MongoDB 4.2 クライアント側フィールドレベル暗号化(CSFLE)の新機能: 管理者と開発者は、MongoDB の他の暗号化機能に加えて、特定のデータフィールドを暗号化できます。
CSFLE を使用すると、開発者はサーバー側の構成やディレクティブを使用せずに、クライアント側のフィールドを暗号化できます。 クライアント側のフィールドレベル暗号化は、サーバー管理者を含む権限のないユーザーが暗号化されたデータを読み取れることをアプリケーションが保証する必要があるワークロードをサポートします。
CSFLE の概要については、マニュアル内の MongoDB の公式ドキュメント をお読みください。
インストール
libmongocrypt
クライアント側のフィールドレベル暗号化では、負荷の高い暗号化作業を行うために、libmongocrypt
と呼ばれるCライブラリに依存しています。この依存関係はCドライバーによって管理されます。 Cドライバーのインストールが 1.16.0 以上で、かつクライアント側のフィールドレベル暗号化をサポートしてコンパイルされている限り、この依存関係は内部で管理する必要があります。詳細については、 Cドライバーの「 クライアント側フィールドレベル暗号化 の使用 」を参照してください。
mongocryptd
自動 CSFLE は、ドライバーの動作中にデーモンとして実行されるmongocryptd
という新しいバイナリに依存します。 このバイナリは MongoDB Enterprise でのみ利用可能です。
mongocryptd
は、ドライバーとは別に起動されるか、暗号化が使用されるときに自動的に起動するように残すことができます。
mongocryptd を個別に実行するには、クライアントの自動暗号化オプションにmongocryptdBypassSpawn
フラグを渡します。
auto mongocryptd_options = make_document(kvp("mongocryptdBypassSpawn", true)); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
mongocryptd バイナリが現在のパスにある場合、ドライバーはカスタム フラグなしでそれを生成できます。 ただし、mongocryptd バイナリが別のパスにある場合は、 mongocryptdSpawnPath
オプションを使用してパスを設定します。
auto mongocryptd_options = make_document(kvp("mongocryptdSpawnPath", "path/to/mongocryptd")); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
例
クライアント側のフィールドレベル自動暗号化
自動クライアント側フィールドレベル暗号化は、 mongocxx::options::auto_encryption
のインスタンスに設定されたauto_encryption_opts
オプションを持つmongocxx::client
を作成することで有効になります。 次の例は、 mongocxx::client_encryption
クラスを使用して自動クライアント側フィールドレベル暗号化を設定し、新しい暗号化データキーを作成する方法を示しています。
注意
クライアント側のフィールドレベルの自動暗号化には MongoDB 4.2 Enterprise または MongoDB 4.2が必要です Atlas クラスター。 サーバーのコミュニティ バージョンは、自動復号化と明示的なクライアント側のフィールドレベル暗号化をサポートしています。
ローカル自動暗号化ルールの提供
次の例は、 schema_map オプションを介して自動暗号化ルールを指定する方法を示しています。 自動暗号化ルールは、 JSON schema 構文の厳密なサブセットを使用して表現されます。
schema_map
を指定すると、サーバーから取得された JSON schema に依存する場合よりもセキュリティが強化されます。 これにより、誤った JSON schema を広告する悪意のサーバーから保護されます。これにより、クライアントが暗号化されなければならない暗号化されていないデータを送信する可能性があります。
schema_map
で提供されている JSON schema は、自動クライアント側のフィールドレベル暗号化の構成にのみ適用されます。 JSON schema の他の検証ルールはドライバーによって強制されないため、エラーが発生します。
// // The schema map has the following form: // // { // "test.coll" : { // "bsonType" : "object", // "properties" : { // "encryptedFieldName" : { // "encrypt" : { // "keyId" : [ <datakey as UUID> ], // "bsonType" : "string", // "algorithm" : <algorithm> // } // } // } // } // } //
サンプル/mongocx/ automatic_client_ide_field_level_encryption.cpp JSON schemaを参照してください。 自動暗号化用に設定する方法の完全な例については、 を参照してください。
サーバー側のフィールドレベル暗号化の強制
MongoDB 4.2サーバーは、コレクション内の特定のフィールドの暗号化を強制するために、スキーマ検証を使用することをサポートしています。 このスキーマ検証により、アプリケーションは"encrypt"
JSON schema キーワードでマークされたフィールドに暗号化されていない値を挿入するのを防止します。
mongocxx::client_encryption
を使用して自動クライアント側フィールドレベル暗号化を設定して、新しい暗号化データキーを作成し、自動暗号化 JSON schema 構文規則を使用してコレクションを作成できます。
// Please see the linked example below for full json_schema construction. bsoncxx::document::value json_schema{}; // Create the collection with the encryption JSON Schema. auto cmd = document{} << "create" << "coll" << "validator" << open_document << "$jsonSchema" << json_schema.view() << close_document << finalize; db.run_command(cmd.view());
例は/mongocx/server_ide_field_level_encryption_enforcement.cpp を参照してください。 サーバー上で暗号化を適用する設定の完全な例については、 を参照してください。
明示的な暗号化
明示的な暗号化は MongoDB Community の機能であり、 mongocryptd
プロセスは使用されません。 明示的な暗号化はmongocxx::client_encryption
クラスによって提供されます。
// Explicitly encrypt a BSON value. auto to_encrypt = bsoncxx::types::bson_value::make_value("secret message"); auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts); // Explicitly decrypt a BSON value. auto decrypted_message = client_encryption.decrypt(encrypted_message);
例/mongocx/explit_encryption.cpp を参照してください (明示的な暗号化と復号化を使用する完全な例については、 を参照してください。
自動復号化による明示的な暗号化
ただし、自動暗号化には MongoDB 4.2 Enterprise または MongoDB 4.2 800} が必要です Atlas クラスターでは、すべてのユーザーに対して自動復号化がサポートされています。 自動暗号化を使用せずに自動復号化を構成するには、 options::auto_encryption
クラスのbypass_auto_encryption=True
を設定します。
options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.bypass_auto_encryption(true); // Please see full example for complete options construction. // Create a client with automatic decryption enabled, but automatic encryption bypassed. options::client client_opts{}; client_opts.auto_encryption_opts(std::move(auto_encrypt_opts)); class client client_encrypted {uri{}, std::move(client_opts)};
例については、/mongocx/explit_encryption_auto_decryption.cpp を参照してください。 (自動復号化で明示的な暗号化を使用する例)。