注意
エンタープライズ機能
フィールドレベル暗号化の自動機能は、MongoDB Enterprise 4.2 以降と MongoDB Atlas 4.2 以降のクラスターでのみ使用できます。
クライアント側のフィールドレベルの自動暗号化には、どのフィールドを暗号化する必要があるか、またそれらのフィールドを暗号化する方法を識別するユーザー指定のルールが必要です。アプリケーションは、JSON schema ドラフト 4 標準構文 と次の暗号化固有の キーワードの厳密なサブセットを使用して自動暗号化ルールを指定する必要があります。
encryptスキーマ キーワード- 現在のフィールドを暗号化するときに使用する暗号化オプションを指定します。encryptMetadataschema キーワード- 継承可能な暗号化オプションを指定します。
MongoDB database で、 hrデータベースのemployeesコレクションに次のようなドキュメントが含まれているとします。
{ "fname" : "Jo", "lname" : "Doe", "taxid" : "123-45-6789", "taxid-short" : "6789" }
taxidフィールドとtaxid-shortフィールドには、クライアントとサーバーの両方で不正な表示から保護する必要がある個人を特定できる情報(PII)が含まれています。 hr.employeesコレクションの次の自動暗号化ルールは、自動クライアント側フィールドレベル暗号化用に フィールドとtaxid taxid-shortフィールドをマークします。公式 MongoDB 4.2 + 互換性のあるドライバー、 mongosh 、および4 。 2 mongoこれらのルールで構成された またはそれ以降のレガシー shelltaxid taxid-shortは、hr.employees コレクションへの書込みまたは読み取り操作のために、 フィールドと フィールドを自動的に暗号化します。
{ "hr.employees": { "bsonType": "object", "properties": { "taxid": { "encrypt": { "keyId": [UUID("11d58b8a-0c6c-4d69-a0bd-70c6d9befae9")], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512_Random", "bsonType" : "string" } }, "taxid-short": { "encrypt": { "keyId": [UUID("2ee77064-5cc5-45a6-92e1-7de6616134a8")], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "string" } } } } }
MongoDB shell の場合は、
Mongo()コンストラクターを使用して、クライアント側のフィールドレベル暗号化構成オブジェクトの一部として含まれる自動暗号化ルールとのデータベース接続を作成します。 例については、「自動クライアント側暗号化が有効になっているクラスターへの接続」を参照してください。公式 MongoDB ドライバーの場合は、ドライバー固有のデータベース接続コンストラクター(例:
MongoClient)を使用して、クライアント側のフィールドレベル暗号化構成オブジェクトの一部として含まれる自動暗号化ルールを使用してデータベース接続を作成します。 より完全なドキュメントとチュートリアルについては、ドライバー API リファレンスを参照してください。
重要
クライアント側のフィールドレベルの自動暗号化は、暗号化動作の定義のみに JSON schema 構文の厳密なサブセットをサポートします。 自動暗号化ルールでドキュメント検証キーワードを指定しないでください。 ドキュメント検証ルールを定義するには、サーバー側スキーマ検証を構成します。
encrypt Schema Keyword
"bsonType" : "object", "properties" : { "<fieldName>" : { "encrypt" : { "algorithm" : "<string>", "bsonType" : "<string>" | [ "<string>" ], "keyId" : [ <UUID> ] } } }
encryptオブジェクト
<fieldName>を暗号化する必要があることを示します。encryptオブジェクトには次の要件があります。encryptは、<fieldName>オブジェクトに兄弟フィールドを含めることはできません。encryptは、<fieldName>オブジェクトの唯一の子である必要があります。encryptcannot be specified within any subschema of theitemsoradditionalItemskeywords. 具体的には、クライアント側のフィールドレベルの自動暗号化では、配列の個々の要素の暗号化はサポートされていません。
encryptオブジェクトには次のフィールドのみを含めることができます。encryptオブジェクトに他のフィールドを含めると、自動暗号化された読み取りまたは書込み操作の発行時にエラーが発生しますkeyIdまたはalgorithmが省略されている場合、自動暗号化共有ライブラリは親フィールドの完全なツリーをチェックし、オプションを指定する最も近いencryptMetadataオブジェクトからそれらのオプションを構築しようとします。bsonTypeは継承できず、 の値によっては必須になる 場合algorithmがあります。自動暗号化共有ライブラリが、オブジェクトに指定されたフィールドと必要な
encryptMetadata継承されたキーを使用して、完全なencryptオブジェクトを構築できない場合、自動暗号化は失敗し、エラーが返されます。
encrypt.algorithm文字列
<fieldName>の値を暗号化するときに使用する暗号化アルゴリズムを示します。 次のアルゴリズムのみをサポートします 。AEAD_AES_256_CBC_HMAC_SHA_512-RandomAEAD_AES_256_CBC_HMAC_SHA_512-Deterministic
暗号化アルゴリズムに関する詳細なドキュメントについては、「暗号化アルゴリズム 」を参照してください。
省略した場合、自動暗号化共有ライブラリは、最も近い
encryptMetadata.algorithmキーの親フィールドの完全なツリーを確認し、その値を継承します。 親algorithmが存在しない場合、自動フィールドレベル暗号化は失敗し、エラーが返されます。encrypt.algorithmまたはその継承値がAEAD_AES_256_CBC_HMAC_SHA_512-Deterministicの場合、encryptオブジェクトには フィールド が必要encrypt.bsonTypeです。encrypt.algorithmまたはその継承値がAEAD_AES_256_CBC_HMAC_SHA_512-Randomの場合、encryptオブジェクトには フィールドencrypt.bsonTypeが含まれる可能性が あります。
encrypt.bsonTypestring |文字列の配列
暗号化されるフィールドのBSON type 。
encrypt.algorithmがAEAD_AES_256_CBC_HMAC_SHA_512-Deterministicの場合は必須です。encrypt.algorithmまたはその継承値がAEAD_AES_256_CBC_HMAC_SHA_512-Deterministicの場合、bsonTypeは単一の型 を指定する必要があります。 は、決定的な暗号化アルゴリズムを持つ次のbsonTypeのいずれもサポートしていませ ん 。BSON typesdoubledecimal128boolobjectarray
encrypt.algorithmまたはその継承値がAED_AES_256_CBC_HMAC_SHA_512-Randomの場合、bsonTypeは任意であり、サポートされているBSON typesの配列を指定できます。arrayまたはobjectのbsonTypeを持つフィールドの場合、クライアントは配列またはオブジェクト全体ではなく、個々の要素ではなく、配列またはオブジェクト全体を暗号化します。encrypt.bsonTypeは、encrypt.algorithmまたはその継承値に関係なく、次のタイプをサポートしていませ ん 。minKeymaxKeynullundefined
encrypt.keyId単一 UUID の配列
フィールド値の暗号化に使用するデータ暗号化のキーの UUID 。UUID は、サブタイプ のBSONバイナリ データ要素です。
4配列内に1 つのstringを指定します。
省略した場合、自動暗号化共有ライブラリは、最も近い
encryptMetadata.keyIdキーの親フィールドの完全なツリーをチェックし、その値を継承します。 親keyIdが存在しない場合、自動フィールドレベル暗号化は失敗し、エラーが返されます。keyIdまたはその継承値は、 自動暗号化 構成オプション の一部として指定されたキーヴォールトに存在する 必要 があります。指定されたデータ暗号化キーが存在しない場合、自動暗号化は失敗します。公式 MongoDB ドライバーには、UUID を指定するための言語固有の要件があります。 クライアント側のフィールドレベル暗号化の実装に関する完全なドキュメントについては、ドライバーのドキュメント を参照してください。
encryptMetadata Schema Keyword
{ "bsonType" : "object", "encryptMetadata" : { "algorithm" : "<string>", "keyId" : [ <UUID> ] }, "properties" : { "encrypt" : {} } }
encryptMetadataオブジェクト
存在の
propertiesにネストされたencryptオブジェクトが継承できる暗号化オプションを定義します。encryptに暗号化をサポートするために必要なオプションがない場合、自動暗号化共有ライブラリは親オブジェクトのツリー全体を検索して、欠落しているオプションを指定するencryptMetadataオブジェクトを見つけます。encryptMetadataは、bsonType: "object"を使用してサブスキーマで指定する必要があります。encryptMetadataは、itemsまたはadditionalItemsキーワードのサブスキーマには指定できません。 具体的には、クライアント側のフィールドレベルの自動暗号化では、配列の個々の要素の暗号化はサポートされていません。encryptMetadataオブジェクトには次のフィールドのみを含めることができます。encryptオブジェクトに他のフィールドを含めると、自動暗号化された読み取りまたは書込み操作を発行するときにエラーが発生します。
encryptMetadata.algorithm文字列
特定のフィールドを暗号化するために使用する暗号化アルゴリズム。
encryptオブジェクトにalgorithmフィールドがない場合、自動暗号化共有ライブラリは親オブジェクトのツリー全体を検索して、 を指定するencryptMetadataencryptMetadata.algorithmオブジェクトを見つけます。次のアルゴリズムのみをサポートします 。
AEAD_AES_256_CBC_HMAC_SHA_512-RandomAEAD_AES_256_CBC_HMAC_SHA_512-Deterministic
暗号化アルゴリズムに関する詳細なドキュメントについては、「暗号化アルゴリズム 」を参照してください。
AEAD_AES_256_CBC_HMAC_SHA_512-Deterministicencryptを指定する場合、その値を継承する オブジェクトは を指定する 必要がありencrypt.bsonTypeます。
encryptMetadata.keyId単一 UUID の配列
データ暗号化のキーの UUID 。UUID は、サブタイプ のBSONバイナリ データ要素です。
4配列内に1 つのstringを指定します。
encryptオブジェクトにkeyIdフィールドがない場合、自動暗号化共有ライブラリは親オブジェクトのツリー全体を検索して、 を指定するencryptMetadataencryptMetadata.keyIdオブジェクトを見つけます。データ暗号化キーは、 自動暗号化 構成オプション の一部として指定されたキーヴォールト内に存在する 必要 があります。KMS指定された構成オプションには、データキーの作成に使用される (KMS ) と CMK(Customer Master Key)への適切なアクセス権 も 含める必要があります。データ暗号化キーが存在しない場合、またはクライアントが指定された KMS および CMK でキーを復号化できない場合、自動暗号化は失敗します。
公式 MongoDB ドライバーには、UUID を指定するための言語固有の要件があります。 クライアント側のフィールドレベル暗号化の実装に関する完全なドキュメントについては、ドライバーのドキュメント を参照してください。
例
複数のフィールドの自動暗号化
各ドキュメントが次の構造を持つコレクションMedCo.patientsを例に考えてみましょう。
{ "fname" : "<String>", "lname" : "<String>", "passportId" : "<String>", "bloodType" : "<String>", "medicalRecords" : [ {<object>} ], "insurance" : { "policyNumber" : "<string>", "provider" : "<string>" } }
次のフィールドには、クエリされる可能性のある個人を特定できる情報(PII)が含まれています。
passportIdbloodTypeinsurance.policyNumberinsurance.provider
決定的な暗号化アルゴリズムは、 値の暗号化された出力が静的であることを保証します。 これにより、特定の値のクエリは意味のある結果を返すことができますが、頻度分析の回復の可能性が高まります。 したがって、決定的な暗号化アルゴリズムは、データの暗号化とクエリ可能性の両方の要件を満たします。
次のフィールドには、法的に保護された個人を特定できる情報(PII)が含まれており、クエリされることはありません。
medicalRecords
ランダム化された暗号化アルゴリズムにより、値の暗号化された出力が常に一意であることが保証されます。 これにより、フィールドの内容を最大限に保護しながら、特定のフィールド値に対するクエリが意味のある結果を返すのを防止できます。 したがって、ランダム化された暗号化アルゴリズムは、データの暗号化とクエリ可能性の両方の要件を満たします。
次のスキーマでは、 MedCo.patientsコレクションの上記の要件を満たす自動暗号化ルールを指定します。
{ "MedCo.patients" : { "bsonType" : "object", "properties" : { "passportId" : { "encrypt" : { "keyId" : [UUID("bffb361b-30d3-42c0-b7a4-d24a272b72e3")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType" : "string" } }, "bloodType" : { "encrypt" : { "keyId" : [UUID("bffb361b-30d3-42c0-b7a4-d24a272b72e3")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType" : "string" } }, "medicalRecords" : { "encrypt" : { "keyId" : [UUID("f3821212-e697-4d65-b740-4a6791697c6d")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType" : "array" } }, "insurance" : { "bsonType" : "object", "properties" : { "policyNumber" : { "encrypt" : { "keyId" : [UUID("bffb361b-30d3-42c0-b7a4-d24a272b72e3")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType" : "string" } }, "provider" : { "encrypt" : { "keyId" : [UUID("bffb361b-30d3-42c0-b7a4-d24a272b72e3")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType" : "string" } } } } } } }
上記の自動暗号化ルールは、 passportId 、 bloodType 、 insurance.policyNumber 、 insurance.provider 、 medicalRecordsフィールドを暗号化用にマークします。
passportId、bloodType、insurance.policyNumber、およびproviderフィールドは、指定されたキーを使用する決定的な暗号化を必要とします。medicalRecordsフィールドでは、指定されたキーを使用したランダム化された暗号化が必要です。
クライアント側のフィールドレベルの暗号化では、配列要素の暗号化はサポートされていませんが、ランダム化された暗号化では、フィールド内の個々の要素ではなく、配列フィールド全体の暗号化がサポートされています。 自動暗号化ルールの例では、配列全体を暗号化するためにmedicalRecordsフィールドにランダム化された暗号化を指定しています。 自動暗号化ルールがmedicalRecords.itemsまたはmedicalRecords.additionalItems内でencryptまたはencryptMetadataを指定した場合、フィールド レベルの自動暗号化は失敗し、エラーが返されます。
公式 MongoDB 4.2 + 互換ドライバー、 mongosh 、および4.2以降のレガシーmongo shell では、データベース接続オブジェクトの作成の一部として自動暗号化ルールを指定する必要があります。
mongoshの場合は、Mongo()コンストラクタを使用してデータベース接続を作成します。ClientSideFieldLevelEncryptionOptionsパラメータのschemaMapキーに自動暗号化ルールを指定します。 完全な例については、「自動クライアント側暗号化が有効になっているクラスターへの接続」を参照してください。公式の MongoDB 4.2 + 互換ドライバーには、ドライバー固有のデータベース接続コンストラクター(例:
MongoClient)を使用して、クライアント側のフィールドレベル暗号化構成オブジェクトの一部として含まれる自動暗号化ルールを使用してデータベース接続を作成します。 より完全なドキュメントとチュートリアルについては、ドライバー API リファレンスを参照してください。
すべてのクライアントで、クライアント側のフィールドレベル暗号化パラメータに指定されたkeyVaultとkmsProvidersは、自動暗号化ルールで指定されたデータ暗号化キーと、データ暗号化キーの暗号化に使用されるカスタマー マスター キーの両方へのアクセスを許可する必要があります。
継承を持つ複数のフィールドの自動暗号化
各ドキュメントが次の構造を持つコレクションMedCo.patientsを例に考えてみましょう。
{ "fname" : "<String>", "lname" : "<String>", "passportId" : "<String>", "bloodType" : "<String>", "medicalRecords" : [ {<object>} ], "insurance" : { "policyNumber" : "<string>", "provider" : "<string>" } }
次のフィールドには、クエリされる可能性のあるプライベート データが含まれています。
passportIdbloodTypeinsurance.policyNumberinsurance.provider
決定的な暗号化アルゴリズムは、 値の暗号化された出力が静的であることを保証します。 これにより、特定の値のクエリは意味のある結果を返すことができますが、頻度分析の回復の可能性が高まります。 したがって、決定的な暗号化アルゴリズムは、データの暗号化とクエリ可能性の両方の要件を満たします。
次のフィールドには、クエリされることのないプライベートデータが含まれています。
medicalRecords
ランダム化された暗号化アルゴリズムにより、値の暗号化された出力が常に一意であることが保証されます。 これにより、フィールドの内容を最大限に保護しながら、特定のフィールド値に対するクエリが意味のある結果を返すのを防止できます。 したがって、ランダム化された暗号化アルゴリズムは、データの暗号化とクエリ可能性の両方の要件を満たします。
次のスキーマでは、 MedCo.patientsコレクションの暗号化要件を満たす自動暗号化ルールを指定します。
{ "MedCo.patients" : { "bsonType" : "object", "encryptMetadata" : { "keyId" : [UUID("6c512f5e-09bc-434f-b6db-c42eee30c6b1")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" }, "properties" : { "passportId" : { "encrypt" : { "bsonType" : "string" } }, "bloodType" : { "encrypt" : { "bsonType" : "string" } }, "medicalRecords" : { "encrypt" : { "keyId" : [UUID("6c512f5e-09bc-434f-b6db-c42eee30c6b1")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType" : "array" } }, "insurance" : { "bsonType" : "object", "properties" : { "policyNumber" : { "encrypt" : { "bsonType" : "string" } }, "provider" : { "encrypt" : { "bsonType" : "string" } } } } } } }
上記の自動暗号化ルールは、 passportId 、 bloodType 、 insurance.policyNumber 、 insurance.provider 、 medicalRecordsフィールドを暗号化用にマークします。
passportId、bloodType、insurance.policyNumber、およびproviderフィールドは、親のencryptMetadataフィールドから暗号化設定を継承します。 具体的には、これらのフィールドは、指定されたデータ暗号化キーによる決定的な暗号化を指定するalgorithmとkeyIdの値を継承します。medicalRecordsフィールドでは、指定されたキーを使用したランダム化された暗号化が必要です。encryptオプションは、親のencryptMetadataフィールドに指定されたオプションを上書きします。
クライアント側のフィールドレベルの暗号化では、配列要素の暗号化はサポートされていませんが、ランダム化された暗号化では、フィールド内の個々の要素ではなく、配列フィールド全体の暗号化がサポートされています。 自動暗号化ルールの例では、配列全体を暗号化するためにmedicalRecordsフィールドにランダム化された暗号化を指定しています。 自動暗号化ルールがmedicalRecords.itemsまたはmedicalRecords.additionalItems内でencryptまたはencryptMetadataを指定した場合、フィールド レベルの自動暗号化は失敗し、エラーが返されます。
公式 MongoDB 4.2 + 互換ドライバー、 mongosh 、および4.2以降のレガシーmongo shell では、データベース接続オブジェクトの作成の一部として自動暗号化ルールを指定する必要があります。
mongoshの場合は、Mongo()コンストラクタを使用してデータベース接続を作成します。ClientSideFieldLevelEncryptionOptionsパラメータのschemaMapキーに自動暗号化ルールを指定します。 完全な例については、「自動クライアント側暗号化が有効になっているクラスターへの接続」を参照してください。公式の MongoDB 4.2 + 互換ドライバーには、ドライバー固有のデータベース接続コンストラクター(例:
MongoClient)を使用して、クライアント側のフィールドレベル暗号化構成オブジェクトの一部として含まれる自動暗号化ルールを使用してデータベース接続を作成します。 より完全なドキュメントとチュートリアルについては、ドライバー API リファレンスを参照してください。
すべてのクライアントで、クライアント側のフィールドレベル暗号化パラメータに指定されたkeyVaultとkmsProvidersは、自動暗号化ルールで指定されたデータ暗号化キーと、データ暗号化キーの暗号化に使用されるカスタマー マスター キーの両方へのアクセスを許可する必要があります。