Overview
Queryable Encryption の明示的な暗号化メカニズムの使用方法を学習します。 明示的な暗号化では、フィールドの暗号化に使用されるキーマテリアルを指定できます。 これにより、セキュリティをきめ細やかに制御できますが、コレクションの構成と MongoDB ドライバーのコードの記述が複雑になります。
明示的な暗号化とは、データベースで実行する各操作に対して、ドキュメント内のフィールドを暗号化および復号化する方法を指定するメカニズムです。
次の MongoDB 製品で明示的な暗号化が利用できます。
- MongoDB Community Server 
- MongoDB Enterprise Advanced 
- MongoDB Atlas 
明示的な暗号化の使用
ClientEncryption インスタンスの作成
ClientEncryption mongoshは、Key Vault コレクションと明示的な暗号化に関係する KMS 操作をカプセル化するドライバーと で使用される抽象化です。
ClientEncryptionインスタンスを作成するには、次の手順を指定します。
- カスタマー マスター キーをホストするKMSプロバイダーへのアクセス用に構成された - kmsProvidersオブジェクト
- キーヴォールト コレクションの名前空間 
- MongoDB Community Server を使用する場合は、 - bypassQueryAnalysisオプションを- Trueに設定します
- キーヴォールト コレクションへのアクセス権を持つ - MongoClientインスタンス
その他のClientEncryptionオプションについては、「 Queryable Encryption の MongoClient オプション 」を参照してください。
読み取り操作と書込み操作におけるフィールドの暗号化
読み取りおよび書込み操作を実行する前に、アプリケーション全体で読み取りおよび書込み操作を更新し、アプリケーションがフィールドを暗号化する必要があります。
フィールドを暗号化するには、 ClientEncryptionインスタンスのencryptメソッドを使用します。 以下を指定します。
- 暗号化する値 
- 使用されるアルゴリズム( - Indexedまたは- Unindexedのいずれか)
- データ暗号化キーの ID 
- 競合係数( - Indexedアルゴリズムを使用している場合)
- 読み取り操作を実行している場合は、フィールドに定義されているクエリタイプを設定します( - Indexedアルゴリズムを使用している場合)
アルゴリズムの選択
フィールドにqueryTypeを指定する場合は、 Indexedアルゴリズムを使用します。
Indexed は等価クエリをサポートします。 Indexedフィールドにはサーバー上のインデックスが必要です。 インデックスは、db.createCollection() でencryptedFieldsオプションを指定して作成されます
自動復号化
フィールドを自動的に復号化するには、 MongoClientインスタンスを次のように構成します。
- kmsProvidersオブジェクトを指定する
- キーヴォールトコレクションを指定する 
- MongoDB Community Server を使用する場合は、 - bypassQueryAnalysisオプションを- Trueに設定します
注意
MongoDB Community Server での自動復号化
MongoDB Community Server では自動復号化が利用できます。 自動暗号化には MongoDB Enterprise または MongoDB Atlas が必要です。
サーバー側のフィールドレベル暗号化の強制
「暗号化のフィールド」 を指定して、コレクション内の特定のフィールドの暗号化を強制します。
Indexed フィールドにはサーバー上のインデックスが必要です。 インデックスは、 db.createCollection()でencryptedFieldsオプションを指定して作成されます。
MongoDB インスタンスが特定のフィールドの暗号化を強制する場合、明示的な暗号化を使用して Queryable Encryption を実行するクライアントは、指定されたようにそれらのフィールドを暗号化する必要があります。 サーバー側での Queryable Encryption 適用の設定方法については、「フィールドの暗号化とクエリ可能性 」を参照してください。
詳細
キーヴォールト コレクション、データ暗号化キー、CMK の詳細については、「キーとキーヴォールト 」を参照してください。
KMSプロバイダーとkmsProvidersオブジェクトの詳細については、「 KMS プロバイダー 」を参照してください。