使用中の暗号化
Overview
C++ドライバーでは、 使用中の暗号化と呼ばれる機能のセットを使用して、特定のドキュメントフィールドを暗号化できます。 使用中の暗号化により、アプリケーションはMongoDBに送信する前にデータを暗号化し、暗号化されたフィールドを持つドキュメントをクエリできます。
使用中の暗号化は、 MongoDBに送信されるとき、または 暗号化されたデータベース内にあるときに権限のないユーザーがプレーンテキスト データを表示するのを防ぎます。 アプリケーションで使用中の暗号化を有効にし、そのアプリケーションがデータの復号化を許可するには、アプリケーションのみがアクセスできる暗号化キーを作成する必要があります。 暗号化のキーにアクセスできるアプリケーションのみが、復号されたプレーンテキスト データにアクセスできます。 攻撃者がデータベースへのアクセスを取得した場合、暗号化のキーにアクセスできないため、暗号化された暗号化された暗号化データのみが表示されます。
使用中の暗号化を使用して、次のタイプの機密データを含むMongoDBドキュメント内のフィールドを暗号化できます。
クレジット カード番号
住所
ヘルス情報
金融情報
その他の機密情報または個人を特定できる情報(PII)
MongoDBは、使用中の暗号化を有効にするために次の機能を提供しています。
Queryable Encryption
Queryable Encryption は、使用可能な次の暗号化機能であり、MongoDB Server バージョン 6.0 のプレビュー機能として導入され、その後 MongoDB 7.0 の一般提供(GA)機能として導入されます。 Queryable Encryption は、暗号化されたフィールドで等価性を検索することをサポートしており、各値を一意に暗号化します。
重要
MongoDB 7.0 と互換性のないプレビュー機能
MongoDB 6.0 での Queryable Encryption の実装は、MongoDB 7.0 で導入された GA バージョンと互換性がありません。 Queryable Encryption プレビュー機能はサポートされなくなりました。
Queryable Encryptionの詳細については、 MongoDB Serverマニュアルの「 Queryable Encryption 」を参照してください。
クライアントサイドのフィールド レベル暗号化
クライアント側フィールド レベル暗号化( CSFLE )はMongoDB Serverバージョン 4.2 で導入され、暗号化されたフィールドの等価検索をサポートしています。 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_map
JSON 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 value auto to_encrypt = bsoncxx::types::bson_value::make_value("secret message"); auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts); // Explicitly decrypts a BSON value auto decrypted_message = client_encryption.decrypt(encrypted_message); // Inserts the encrypted value into the database coll.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」を参照してください。