Docs Menu
Docs Home
/
MongoDB マニュアル
/ / /

自動暗号化ルール

項目一覧

  • encrypt Schema Keyword
  • encryptMetadata Schema Keyword

注意

エンタープライズ機能

フィールドレベル暗号化の自動機能は、MongoDB Enterprise 4.2 以降と MongoDB Atlas 4.2 以降のクラスターでのみ使用できます。

クライアント側のフィールドレベルの自動暗号化には、どのフィールドを暗号化する必要があるか、またそれらのフィールドを暗号化する方法を識別するユーザー指定のルールが必要です。 アプリケーションは、JSON schema 4ドラフト 標準構文 の厳密なサブセットを使用して自動暗号化ルールを指定する必要があります および 次の暗号化固有の キーワード。

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 構文の厳密なサブセットをサポートします。 自動暗号化ルールでドキュメント検証キーワードを指定しないでください。 ドキュメント検証ルールを定義するには、サーバー側スキーマ検証を構成します。

"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 the items or additionalItems 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 typeencrypt.algorithmAEAD_AES_256_CBC_HMAC_SHA_512-Deterministicの場合は必須です。

encrypt.algorithmまたはその継承値がAEAD_AES_256_CBC_HMAC_SHA_512-Deterministicの場合、 bsonType単一の型 を指定する必要があります。 は、決定的な暗号化アルゴリズムを持つ次のbsonType のいずれもサポートしていませ ん 。BSON types

  • double

  • decimal128

  • bool

  • object

  • array

encrypt.algorithmまたはその継承値が AED_AES_256_CBC_HMAC_SHA_512-Random の場合、bsonType は任意であり、サポートされているBSON typesの配列を指定できます。 arrayまたはobjectbsonTypeを持つフィールドの場合、クライアントは配列またはオブジェクト全体ではなく、個々の要素ではなく、配列またはオブジェクト全体を暗号化します。

encrypt.bsonType は、 encrypt.algorithmまたはその継承値に関係なく、次のタイプをサポートしていませ ん 。

  • minKey

  • maxKey

  • null

  • undefined

encrypt.keyId

単一 UUID の配列

フィールド値の暗号化に使用するデータ暗号化キーの UUID 。 UUID は BSON バイナリ データ です サブタイプ4 の要素。

配列内に1 つのstringを指定します。

省略した場合、自動暗号化共有ライブラリは、最も近いencryptMetadata.keyIdキーの親フィールドの完全なツリーをチェックし、その値を継承します。 親keyIdが存在しない場合、自動フィールドレベル暗号化は失敗し、エラーが返されます。

keyIdまたはその継承値は、 自動暗号化 構成オプション の一部として指定されたキーヴォールトに存在する 必要 があります。指定されたデータ暗号化キーが存在しない場合、自動暗号化は失敗します。

公式 MongoDB ドライバーには、UUID を指定するための言語固有の要件があります。 クライアント側のフィールドレベル暗号化の実装に関する完全なドキュメントについては、ドライバーのドキュメント を参照してください。

{
"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-Deterministicencryptを指定する場合、その値を継承する オブジェクトは を指定する 必要があり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"
}
}
}
}
}
}
}

上記の自動暗号化ルールは、 passportIdbloodTypeinsurance.policyNumberinsurance.providermedicalRecordsフィールドを暗号化用にマークします。

  • passportIdbloodTypeinsurance.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 リファレンスを参照してください。

すべてのクライアントで、クライアント側のフィールドレベル暗号化パラメータに指定されたkeyVaultkmsProvidersは、自動暗号化ルール指定されたデータ暗号化キーと、データ暗号化キーの暗号化に使用されるカスタマー マスター キーの両方へのアクセスを許可する必要があります。

各ドキュメントが次の構造を持つコレクション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"
}
}
}
}
}
}
}

上記の自動暗号化ルールは、 passportIdbloodTypeinsurance.policyNumberinsurance.providermedicalRecordsフィールドを暗号化用にマークします。

  • passportIdbloodTypeinsurance.policyNumber 、およびproviderフィールドは、親のencryptMetadataフィールドから暗号化設定を継承します。 具体的には、これらのフィールドは、指定されたデータ暗号化キーによる決定的な暗号化を指定するalgorithmkeyIdの値を継承します。

  • 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 リファレンスを参照してください。

すべてのクライアントで、クライアント側のフィールドレベル暗号化パラメータに指定されたkeyVaultkmsProvidersは、自動暗号化ルール指定されたデータ暗号化キーと、データ暗号化キーの暗号化に使用されるカスタマー マスター キーの両方へのアクセスを許可する必要があります。

戻る

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