暗号化のキーとキー ボールト
Overview
このガイドでは、使用中の暗号化の次のコンポーネントに関する詳細を学習できます。
データ暗号化キー( DEK )
カスタマー マスター キー( CMK )
キーヴォールト コレクション
キー管理システム( KMS )
前述のコンポーネントを使用して Queryable Encryption またはクライアント側フィールド レベル暗号化が有効なクライアントを設定する方法を示す手順付きガイドは、次のリソースを参照してください。
データ暗号化キーと CMK
使用中の暗号化は複数レベルのキー階層を使用してデータを保護するもので、「エンベロープ暗号化」または「ラップ キー」と呼ばれます。
カスタマー マスター キー( CMK )は、 キー管理システム( KMS )キーとも呼ばれます)で、クラウド KMS などのカスタマー プロビジョニングされたキー プロバイダーで作成する最上位のキーです。 CMKはデータ暗号化キー( DEK )を暗号化し、ドキュメントのフィールドも暗号化します。 CMKにアクセスしないと、クライアント アプリケーションは関連付けられている DEK を復号化することはできません。
MongoDB は、 CMKで暗号化された DEK を BSON ドキュメントとして Key Vault コレクションに保存します。 MongoDB では、キー管理がクライアント側でカスタマーが管理するため、DEK を復号化することはできません。
DEKを削除すると、そのDEKで暗号化されたすべてのフィールドが永続的に読み取りできなくなります。 CMK を削除すると、その CMK を使用して DEK で暗号化されたすべてのフィールドが永続的に読み取りできなくなります。
警告
カスタマー マスター キーは、Queryable Encryption で最も機密性の高いキーです。 CMKが侵害された場合、暗号化されたデータはすべて復号化されます。 リモート キー管理システムを使用してCMKを保存します。
重要
リモートKMSプロバイダーの使用
カスタマー マスター キーをリモート キー管理システム( KMS )に保存します。
リモートKMSを使用する必要がある理由の詳細については、「リモート キー管理システムを使用する理由 」を参照してください。
サポートされているすべてのKMSプロバイダーのリストを表示するには、「 KMS プロバイダー」ページを参照してください。
キー ローテーション
CMKは、プロビジョニングされたキー プロバイダーで手動または自動でローテーションします。 MongoDB はこのプロセスを認識できません。 CMKをローテーションすると、MongoDB はそれを使用してすべての新しい DEK をラップします。 既存の暗号化された DEK を再ラッピング しません 。 これらは引き続き前のCMKでラップされています。
キーヴォールト内の暗号化された DEK の一部またはすべてをローテーションするには、 KeyVault.rewrapManyDataKey()
メソッドを使用します。 指定された新しいCMKでキーをシームレスに再ラップし、アプリケーションを中断することなく実行されます。 DEK 自体は、新しいCMKで再ラップしても変更されません。
キーのローテーションの詳細については、「暗号化キーのローテーション 」を参照してください。
キーヴォールト コレクション
キーヴォールトコレクションは、暗号化された データ暗号化キー( DEK )ドキュメントの保存に使用する MongoDB のコレクションです。 DEKドキュメントは、DEK を含む BSON ドキュメントで、次の構造を持つ BSON ドキュメントです。
{ "_id" : UUID(<string>), "status" : <int>, "masterKey" : {<object>}, "updateDate" : ISODate(<string>), "keyMaterial" : BinData(0,<string>), "creationDate" : ISODate(<string>), "keyAltNames" : <array> }
Key Vault コレクションは、標準の MongoDB コレクションと同様に作成します。 キーヴォールト コレクションには、 keyAltNames
フィールドに一意のインデックスが必要です。 一意なインデックスが存在するかどうかを確認するには、Key Vault コレクションに対してlistIndexes
コマンドを実行します。
1 db.runCommand({ 2 listIndexes: "__keyVault", 3 });
1 { 2 cursor: { 3 id: Long("0"), 4 ns: 'encryption.__keyVault', 5 firstBatch: [ 6 { v: 2, key: { _id: 1 }, name: '_id_' } 7 ] 8 }, 9 ok: 1, 10 }
一意のインデックスが存在しない場合は、 DEK管理を実行する前にアプリケーションで一意のインデックスが作成される必要があります。
MongoDB コレクションの作成方法については、「データベースとコレクション 」を参照してください。
Tip
mongosh の機能
mongosh
メソッドKeyVault.createKey()
は、 keyAltNames
フィールドに一意のインデックスが存在しない場合は自動的に一意のインデックスを作成します。
DEK 、 CMK 、および Key Vault コレクションがサポートされているすべてのKMSプロバイダー アーキテクチャでどのように相互作用するのかを示す図については、「 KMS プロバイダー 」を参照してください。
キーヴォールトコレクション名
キーヴォールト コレクションを保存するには、管理者以外の名前空間を使用できます。 慣例的に、このドキュメント全体の例ではencryption.__keyVault
名前空間が使用されています。
警告
暗号化関連のコレクションを保存するために、 admin
データベースを使用しないでください。 このコレクションに 管理データベース を使用する場合、権限がないため MongoDB クライアントがデータにアクセスしたり、復号化したりできない可能性があります。
権限
キーヴォールト コレクションへのread
アクセスを持つアプリケーションは、コレクションをクエリすることで、暗号化された データ暗号化キー( DEK )を検索できます。 ただし、 DEK の暗号化に使用される CMK ( CMK )にアクセスできるアプリケーションのみが、その DEK を暗号化または復号化に使用できます。DEK を使用してドキュメントを暗号化および復号化するには、アプリケーションに Key Vault コレクションと CMK の両方へのアクセスを許可する必要があります。
MongoDB コレクションへのアクセスを許可する方法については、MongoDB マニュアルの「 ユーザーとロールの管理」を参照してください。
アプリケーションにカスタマー マスター キーへのアクセスを許可する方法については、 Queryable Encryption 自動暗号化チュートリアル、またはCSFLE 自動暗号化チュートリアル を参照してください。
キーヴォールト クラスター
デフォルトでは、MongoDB は接続されたクラスターに Key Vault コレクションを保存します。 MongoDB では、接続クラスターとは異なる MongoDB 配置で Key Vault コレクションをホストすることもサポートされています。 アプリケーションは、Queryable Encryption 操作を実行するには、Key Vault コレクションをホストするクラスターと接続クラスターの両方にアクセスする必要があります。
キーヴォールト コレクションをホストするクラスターを指定するには、クライアントのMongoClient
オブジェクトのkeyVaultClient
フィールドを使用します。 クライアントのMongoClient
オブジェクトの特定の構成オプションについて詳しくは、「 Queryable EncryptionのMongoClient オプション 」または「 CSFLE 用の MongoClient オプション 」を参照してください。
キーヴォールトコレクションの更新
Key Vault コレクションにDEKを追加するには、 ClientEncryption
オブジェクトのcreateKey
メソッドを使用します。
DEKを削除または更新するには、次のいずれかのメカニズムを使用します。
rewrapManyDataKey
メソッド標準CRUD操作
rewrapManyDataKey
メソッドの詳細については、クライアントまたはドライバーの メソッドに関するドキュメントを参照してください。
Tip
mongosh 固有の機能
データ暗号化キーの作成方法を示すチュートリアルについては、 Queryable Encryption クイック スタートまたはCSFLE クイック スタート を参照してください。