自動暗号化ルール
注意
エンタープライズ機能
フィールドレベル暗号化の自動機能は、MongoDB Enterprise 4.2 以降と MongoDB Atlas 4.2 以降のクラスターでのみ使用できます。
クライアント側のフィールドレベルの自動暗号化には、どのフィールドを暗号化する必要があるか、またそれらのフィールドを暗号化する方法を識別するユーザー指定のルールが必要です。アプリケーションは、 JSON4 schema ドラフト 標準構文 と次の暗号化固有の キーワードの厳密なサブセットを使用して自動暗号化ルールを指定する必要があります。
encrypt
スキーマ キーワード- 現在のフィールドを暗号化するときに使用する暗号化オプションを指定します。encryptMetadata
schema キーワード- 継承可能な暗号化オプションを指定します。
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>
オブジェクトの唯一の子である必要があります。encrypt
cannot be specified within any subschema of theitems
oradditionalItems
keywords. 具体的には、クライアント側のフィールドレベルの自動暗号化では、配列の個々の要素の暗号化はサポートされていません。
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
またはその継承値は、 自動暗号化 構成オプション の一部として指定されたキーヴォールトに存在する 必要 があります。指定されたデータ暗号化キーが存在しない場合、自動暗号化は失敗します。公式 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
フィールドがない場合、自動暗号化共有ライブラリは親オブジェクトのツリー全体を検索して、 を指定する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()
コンストラクタを使用してデータベース接続を作成します。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>" } }
次のフィールドには、クエリされる可能性のあるプライベート データが含まれています。
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()
コンストラクタを使用してデータベース接続を作成します。ClientSideFieldLevelEncryptionOptions
パラメータのschemaMap
キーに自動暗号化ルールを指定します。 完全な例については、「自動クライアント側暗号化が有効になっているクラスターへの接続」を参照してください。公式の MongoDB 4.2 + 互換ドライバーには、ドライバー固有のデータベース接続コンストラクター(例:
MongoClient
)を使用して、クライアント側のフィールドレベル暗号化構成オブジェクトの一部として含まれる自動暗号化ルールを使用してデータベース接続を作成します。 より完全なドキュメントとチュートリアルについては、ドライバー API リファレンスを参照してください。
すべてのクライアントで、クライアント側のフィールドレベル暗号化パラメータに指定されたkeyVault
とkmsProviders
は、自動暗号化ルールで指定されたデータ暗号化キーと、データ暗号化キーの暗号化に使用されるカスタマー マスター キーの両方へのアクセスを許可する必要があります。