フィールドの暗号化とクエリ可能性
項目一覧
Overview
このガイドでは、次の Queryable Encryption に関するトピックについて学習できます。
暗号化のフィールドを指定する方法。
コレクションの作成時に暗号化されたフィールドをクエリ可能かどうか指定する方法。
クエリのタイプと暗号化されたフィールドで使用できるタイプ。
暗号化されたフィールドでクエリを有効にするかどうかを決定する際に考慮する必要があること。
暗号化するフィールドを指定する
Queryable Encryption を使用すると、MongoDB ドキュメント内のどのフィールドを自動的に暗号化するフィールドを指定できます。
重要
暗号化には、 _id
フィールドを除くドキュメント内の任意のフィールドを指定できます。
暗号化とクエリのフィールドを指定するには、次のプロパティを含む JSON schema を定義します。
キー名 | タイプ | 必須 |
---|---|---|
path | 文字列 | 必須 |
bsonType | 文字列 | 必須 |
keyId | バイナリ | 必須 |
queries | オブジェクト | 任意。 フィールドをクエリできる場合を除き、省略します。 |
例
この例では、JSON schema Queryable Encryption機能によって自動的に暗号化されるフィールドを指定する を作成する方法を示します。
個人を特定できる情報(PII)、クレジットカード情報、機密性の高い医療情報が含まれている次のドキュメントを検討してみましょう。
{ "firstName": "Jon", "lastName": "Snow", "patientId": 12345187, "address": "123 Cherry Ave", "medications": [ "Adderal", "Lipitor" ], "patientInfo": { "ssn": "921-12-1234", "billing": { "type": "visa", "number": "1234-1234-1234-1234" } } }
PII と機密医療情報を安全に保護するには、それらのフィールドを自動的に暗号化するようにJSON schema Queryable Encryptionを構成する を作成します。次のサンプル JSON schema は、暗号化するフィールドを指定する方法を示しています。
const encryptedFieldsObject = { fields: [ { path: "patientId", keyId: "<unique data encryption key>", bsonType: "int" }, { path: "patientInfo.ssn", keyId: "<unique data encryption key>", bsonType: "string" }, { path: "medications", keyId: "<unique data encryption key>", bsonType: "array" }, { path: "patientInfo.billing", keyId: "<unique data encryption key>", bsonType: "object" }, ] }
keyId
フィールドには、Queryable Encryption がフィールドを暗号化するために使用する一意のデータ暗号化キー(DEK)が必要であることに注意してください。 DEK の詳細については、 暗号化キー管理 を参照してください。
Queryable Encryption フィールドの指定
JSON schema でクエリ可能にするフィールドにqueries
プロパティを含めます。 これにより、承認されたクライアントは暗号化されたフィールドを使用して読み取りおよび書込みクエリを発行できるようになります。 フィールドをクエリできるようにしたい場合を除き、 queries
プロパティを省略できます。
例
次のコードqueries
スニペットは、JSON schema に プロパティを追加して、 フィールドと フィールドをクエリ可能にする方法を示しています。patientId
patientInfo.ssn
const encryptedFieldsObject = { fields: [ { path: "patientId", keyId: "<unique data encryption key>", bsonType: "int", queries: { queryType: "equality" } }, { path: "patientInfo.ssn", keyId: "<unique data encryption key>", bsonType: "string", queries: { queryType: "equality" } }, { path: "medications", keyId: "<unique data encryption key>", bsonType: "array" }, { path: "patientInfo.billing", keyId: "<unique data encryption key>", bsonType: "object" }, ] }
クエリ タイプの詳細については、「クエリ タイプ 」を参照してください。
Queryable Encryption の有効化
次の方法で、JSON schema で指定するフィールドで Queryable Encryption を有効にできます。
次のコード スニペットに示すように、アプリケーションがコレクションを作成するために使用するクライアントに、
encryptedFieldsObject
定数で表されるJSON schemaを渡します。
const client = new MongoClient(uri, { autoEncryption: { keyVaultNameSpace: "<your keyvault namespace>", kmsProviders: "<your kms provider>", extraOptions: { cryptSharedLibPath: "<path to FLE Shared Library>" }, encryptedFieldsMap: { "<databaseName.collectionName>": { encryptedFieldsObject } } } ... await client.db("<database name>").createCollection("<collection name>"); }
注意
コレクションを作成する前に、Queryable Encryption を有効にすることが重要です。 コレクションの作成後に Queryable Encryption を有効にしても、そのコレクション内のドキュメントのフィールドは暗号化されません。
autoEncryption
構成オプションの詳細については、「 Queryable Encryption の MongoClient オプション 」のセクションを参照してください。
次のコード スニペットに示すように、暗号化されたフィールド オブジェクトを 呼び出しに渡して、新しいコレクションを作成します。
await encryptedDB.createCollection("<collection name>", { encryptedFields: encryptedFieldsObject });
Tip
最高レベルのセキュリティを実現するには、コレクションを作成するときと、コレクションにアクセスするためのクライアントを作成するときに、両方で暗号化されたフィールドを指定します。 これにより、サーバーのセキュリティが侵害された場合でも、クライアントを介して情報は暗号化されます。
重要
MongoDB では、挿入操作によって暗黙的にコレクションを作成するのではなく、Queryable Encryption を使用するときにコレクションを明示的に作成することを推奨しています。 createCollection()
を使用してコレクションを作成すると、この操作によって暗号化されたフィールドにインデックスが作成されます。 インデックスがないと、暗号化されたフィールドに対するクエリの実行が遅くなる可能性があります。
クエリ タイプ
Queryable Encryption では、暗号化されたフィールド オブジェクトのqueries
オプションにクエリタイプを渡すことで、クエリを有効にするフィールドを指定できます。
Queryable Encryption は現在、 none
またはequality
クエリタイプをサポートしています。 MongoDB 6.0 で Queryable Encryption の一部として導入された新しい暗号化フレームワークは、範囲演算子や string 演算子など、追加の表現暗号化検索に対応するように設計されています。
クエリタイプがnone
の場合、データは暗号化されますが、クエリ可能なものではないことを示します。 クエリタイプがnone
の暗号化されたデータではクエリを実行できません。 クエリが次の場所で実行される場合、暗号化されたデータが返されます。
暗号化されていないフィールド
同じコレクション内のクエリ タイプが
equality
で、クライアントで復号化されたフィールド。
重要
指定されていないクエリ タイプ
クエリタイプが明示的に指定されていない場合、クエリタイプはデフォルトでnone
になり、データはクエリできなくなります。
equality
クエリ タイプでは、次の式を使用して暗号化されたフィールドをクエリできます。
注意
暗号化されたフィールドをnull
または正規表現と比較するクエリでは、サポートされているクエリ演算子を使用している場合でも、エラーが発生します。
equality
クエリタイプを使用する Queryable Encryption では、暗号化されたフィールドが次のBSONタイプのいずれかと比較される場合、フィールドに対する読み取りまたは書込み操作はサポートされません。
double
decimal128
object
array
javascriptWithScope
(非推奨)
クエリを有効にする際の考慮事項
Queryable Encryption を使用する場合、暗号化されたフィールドをクエリ可能にするかどうかを選択できます。 暗号化されたフィールドを読み取る必要がある読み取り操作または書き込み操作を実行する必要がない場合は、そのフィールドでクエリを有効にしないことを選択してください。 クエリ可能なフィールド、または暗号化されていない他のフィールドをクエリすることで、ドキュメント全体を検索することもできます。
暗号化されたフィールドをクエリ可能にすると、Queryable Encryption は暗号化されたフィールドごとにインデックスを作成します。これにより、そのフィールドの書込み操作が長くなる可能性があります。 書込み (write) 操作によってインデックス付きフィールドがアップデートされると、MongoDB は関連するインデックスもアップデートします。
暗号化されたフィールドでクエリを有効にすると、コレクションにはより多くのストレージ領域が必要になります。 enxcol_.
で始まるこれらのコレクション名には、重要な暗号化メタデータが含まれています。
警告
enxcol_.
以降のコレクションは変更しないでください。