CSFLE の暗号化スキーマ
Overview
注意
エンタープライズ機能
フィールドレベル暗号化の自動機能は、MongoDB Enterprise 4.2 以降と MongoDB Atlas 4.2 以降のクラスターでのみ使用できます。
暗号化スキーマには、どのフィールドを暗号化する必要があるか、またそれらのフィールドを暗号化する方法を識別するユーザー指定のルールが含まれています。 アプリケーションは、JSON schema 4ドラフト 標準構文 の厳密なサブセットを使用して自動暗号化ルールを指定する必要があります および 次の暗号化固有の キーワード。
MongoDB shell の場合は、 Mongo()
コンストラクターを使用して、 クライアント側フィールドレベル暗号化構成オブジェクトの一部として含まれる自動暗号化ルールとのデータベース接続を作成します。 例については、「自動クライアント側暗号化が有効になっているクラスターへの接続」を参照してください。
公式 MongoDB ドライバーの場合は、ドライバー固有のデータベース接続コンストラクター( MongoClient
)を使用して、 クライアント側フィールドレベル暗号化 構成オブジェクトの一部として含まれる自動暗号化ルールとのデータベース接続を作成します。 CSFLE 固有のMongoClient
オプションの詳細については、 mongo クライアントページを参照してください。
定義
encrypt
オブジェクト
"bsonType" : "object", "properties" : { "<fieldName>" : { "encrypt" : { "algorithm" : "<string>", "bsonType" : "<string>" | [ "<string>" ], "keyId" : [ <UUID> ] } } } <fieldName>
を暗号化する必要があることを示します。encrypt
オブジェクトには次の要件があります。encrypt
は、<fieldName>
オブジェクトに兄弟フィールドを含めることはできません。encrypt
は、<fieldName>
オブジェクトの唯一の子である必要があります。encrypt
は、items
またはadditionalItems
キーワードのサブスキーマ内では指定できません。 具体的には、自動クライアント側フィールドレベル暗号化では、配列の個々の要素の暗号化はサポートされていません。
encrypt
オブジェクトには次のフィールドのみを含めることができます。encrypt
オブジェクトに他のフィールドを含めると、自動暗号化された読み取りまたは書込み操作の発行時にエラーが発生しますkeyId
またはalgorithm
が省略されている場合、自動暗号化共有ライブラリはすべての親フィールドをチェックし、オプションを指定する最も近いencryptMetadata
オブジェクトからそれらのオプションを構築しようとします。bsonType
は継承できず、 の値によっては必須となる 場合algorithm
があります。自動暗号化共有ライブラリが、オブジェクトに指定されたフィールドと必要な
encryptMetadata
継承されたキーを使用して、完全なencrypt
オブジェクトを構築できない場合、自動暗号化は失敗し、エラーが返されます。
encrypt.algorithm
文字列
<fieldName>
の値を暗号化するときに使用する暗号化アルゴリズムを示します。 次のアルゴリズムのみをサポートします 。AEAD_AES_256_CBC_HMAC_SHA_512-Random
AEAD_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.bsonType
string |文字列の配列
暗号化されるフィールドの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 typesdouble
decimal128
bool
object
array
encrypt.algorithm
またはその継承値がAED_AES_256_CBC_HMAC_SHA_512-Random
の場合、bsonType
は任意であり、サポートされているBSON typesの配列を指定できます。array
またはobject
のbsonType
を持つフィールドの場合、クライアントは配列またはオブジェクト全体ではなく、個々の要素ではなく、配列またはオブジェクト全体を暗号化します。encrypt.bsonType
は、encrypt.algorithm
またはその継承値に関係なく、次のタイプをサポートしていませ ん 。minKey
maxKey
null
undefined
encrypt.keyId
単一 UUID の配列
フィールド値の暗号化に使用するデータ暗号化キーの UUID 。 UUID は BSON バイナリ データ です サブタイプ
4
の要素。配列内に1 つのstringを指定します。
省略した場合、自動暗号化共有ライブラリは、
encryptMetadata.keyId
キーを含む最も近い祖先のすべての親フィールドをチェックし、その値を継承します。 親keyId
が存在しない場合、自動フィールドレベル暗号化は失敗し、エラーが返されます。keyId
またはその継承値は、 自動暗号化 構成オプション の一部として指定された Key Vault コレクションに存在する 必要 があります。指定された データ暗号化キーが存在しない場合、自動暗号化は失敗します。公式 MongoDB ドライバーには、UUID を指定するための言語固有の要件があります。 クライアント側のフィールドレベル暗号化の実装に関する完全なドキュメントについては、ドライバーのドキュメント を参照してください。
encryptMetadata
オブジェクト
{ "bsonType" : "object", "encryptMetadata" : { "algorithm" : "<string>", "keyId" : [ <UUID> ] }, "properties" : { "encrypt" : {} } } 存在の
properties
にネストされたencrypt
オブジェクトが継承できる暗号化オプションを定義します。encrypt
に暗号化をサポートするために必要なオプションがない場合、自動暗号化共有ライブラリはすべての親オブジェクトを検索して、欠落しているオプションを指定するencryptMetadata
オブジェクトを見つけます。encryptMetadata
は、bsonType: "object"
を使用してサブスキーマで指定する必要があります。encryptMetadata
は、items
またはadditionalItems
キーワードのサブスキーマには指定できません。 具体的には、自動クライアント側フィールドレベル暗号化では、配列の個々の要素の暗号化はサポートされていません。encryptMetadata
オブジェクトには次のフィールドのみを含めることができます。encrypt
オブジェクトに他のフィールドを含めると、自動暗号化された読み取りまたは書込み操作を発行するときにエラーが発生します。
encryptMetadata.algorithm
文字列
特定のフィールドを暗号化するために使用する暗号化アルゴリズム。
encrypt
オブジェクトにalgorithm
フィールドがない場合、自動暗号化共有ライブラリはすべての親オブジェクトを検索して、 を指定するencryptMetadata
encryptMetadata.algorithm
オブジェクトを見つけます。次のアルゴリズムのみをサポートします 。
AEAD_AES_256_CBC_HMAC_SHA_512-Random
AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic
暗号化アルゴリズムに関する完全なドキュメントについては、「フィールドと暗号化タイプ 」を参照してください。
AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic
encrypt
を指定する場合、その値を継承する オブジェクトは を指定する 必要がありencrypt.bsonType
ます。
encryptMetadata.keyId
単一 UUID の配列
データ暗号化キーの UUID 。 UUID は BSON バイナリ データ です サブタイプ
4
の要素。配列内に1 つのstringを指定します。
encrypt
オブジェクトにkeyId
フィールドがない場合、自動暗号化共有ライブラリはすべての親オブジェクトを検索して、 を指定するencryptMetadata
encryptMetadata.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)が含まれています。
passportId
bloodType
insurance.policyNumber
insurance.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()
コンストラクタを使用してデータベース接続を作成します。AutoEncryptionOpts
パラメータの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>" } }
次のフィールドには、クエリされる可能性のあるプライベート データが含まれています。
passportId
bloodType
insurance.policyNumber
insurance.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()
コンストラクタを使用してデータベース接続を作成します。AutoEncryptionOpts
パラメータのschemaMap
キーに自動暗号化ルールを指定します。 完全な例については、「自動クライアント側暗号化が有効になっているクラスターへの接続」を参照してください。公式の MongoDB 4.2 以降と互換性のあるドライバーの場合は、ドライバー固有のデータベース接続コンストラクター(
MongoClient
)を使用して、 クライアント側フィールドレベル暗号化 構成オブジェクトの一部として含まれる自動暗号化ルールとのデータベース接続を作成します。 より完全なドキュメントとチュートリアルについては、ドライバー API リファレンスを参照してください。
すべてのクライアントで、クライアント側フィールドレベル暗号化パラメータに指定されたkeyVault
とkmsProviders
は、自動暗号化ルールで指定されたデータ暗号化キーと、データ暗号化キーの暗号化に使用されるカスタマー マスター キーの両方へのアクセスを許可する必要があります。
CMK とキーヴォールト コレクションの詳細については、「キーヴォールト」ページを参照してください。
暗号化アルゴリズムの詳細については、「暗号化アルゴリズムのページ 」を参照してください。
CSFLE 固有のMongoClient
オプションの詳細については、 mongo クライアントページを参照してください。
暗号化スキーマ - パターン プロパティで暗号化
暗号化スキーマのpatternProperties
キーワードを使用して、正規表現と一致する名前を持つすべてのフィールドの暗号化ルールを定義できます。
各ドキュメントが次の構造を持つコレクションMedCo.patients
を例に考えてみましょう。
{ "fname" : "<string>", "lname" : "<string>", "passportId_PIIString" : "<string>", "bloodType_PIIString" : "<string>", "medicalRecords_PIIArray" : [ {<object>} ], "insurance" : { "policyNumber_PIINumber" : "<number>", "provider_PIIString" : "<string>" } }
プライベート<type> データを含むフィールドは、フィールド名の末尾に追加された "_PII" タグによって識別されます。
passportId_PIIString
bloodType_PIIString
medicalRecords_PIIArray
insurance.policyNumber_PIINumber
insurance.provider_PIIString
patternProperties
キーワードを使用すると、各フィールドを個別に識別したり、完全なフィールド名を使用したりせずに、これらのフィールドを暗号化するように構成できます。 これを行うには、"_PII"<type> タグで終わるすべてのフィールドに一致する正規表現を使用します。
次のJSON schemaでは、暗号化するフィールドを指定するために patternProperties
と正規表現を使用します。
{ "MedCo.patients": { "bsonType": "object", "patternProperties": { "_PIIString$": { "encrypt": { "keyId": [UUID("6c512f5e-09bc-434f-b6db-c42eee30c6b1")], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", }, }, "_PIIArray$": { "encrypt": { "keyId": [UUID("6c512f5e-09bc-434f-b6db-c42eee30c6b1")], "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", }, }, "insurance": { "bsonType": "object", "patternProperties": { "_PIINumber$": { "encrypt": { "keyId": [UUID("6c512f5e-09bc-434f-b6db-c42eee30c6b1")], "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", }, }, "_PIIString$": { "encrypt": { "keyId": [UUID("6c512f5e-09bc-434f-b6db-c42eee30c6b1")], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", }, }, }, }, }, }, }
上記の自動暗号化ルールは、 passportId_PIIString
、 bloodType_PIIString
、 medicalRecords_PIIArray
、 insurance.policyNumber_PIINumber
、 insurance.provider_PIIString
フィールドを暗号化用にマークします。
patternProperties
キーワードの詳細については、 patternProperties キーワード を参照してください。