Docs Menu
Docs Home
/ / /
C++ ドライバー
/

クライアントサイドのフィールド レベル暗号化

項目一覧

  • クライアントサイドのフィールド レベル暗号化
  • インストール

MongoDB 4.2 クライアント側フィールドレベル暗号化(CSFLE)の新機能: 管理者と開発者は、MongoDB の他の暗号化機能に加えて、特定のデータフィールドを暗号化できます。

CSFLE を使用すると、開発者はサーバー側の構成やディレクティブを使用せずに、クライアント側のフィールドを暗号化できます。 クライアント側のフィールドレベル暗号化は、サーバー管理者を含む権限のないユーザーが暗号化されたデータを読み取れることをアプリケーションが保証する必要があるワークロードをサポートします。

CSFLE の概要については、マニュアル内の MongoDB の公式ドキュメント をお読みください。

クライアント側のフィールドレベル暗号化では、負荷の高い暗号化作業を行うために、 libmongocryptと呼ばれる C ライブラリに依存しています。 この依存関係は C ドライバーによって管理されます。 C ドライバーのインストールが1.16.0以上で、かつクライアント側のフィールドレベル暗号化をサポートしてコンパイルされている限り、この依存関係は内部で管理する必要があります。 C ドライバーの 「 クライアント側フィールドレベル暗号化の使用 」 を参照してください。 詳しくは、 を参照してください。

自動 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 を参照してください。 (自動復号化で明示的な暗号化を使用する例)。

戻る

使用中の暗号化