データキーキャッシュの詳細 - AWS Encryption SDK

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

データキーキャッシュの詳細

ほとんどのアプリケーションで、カスタムコードを記述することなくデータキーキャッシュのデフォルトの実装を使用できます。このセクションでは、デフォルトの実装とオプションの詳細について説明します。

データキーキャッシュの仕組み

データキーキャッシュをリクエストで使用してデータを暗号化または復号すると、AWS Encryption SDK はまずリクエストに一致するデータキーのキャッシュを検索します。有効な一致が見つかった場合、キャッシュされたデータキーを使用してデータを暗号化します。それ以外の場合は、新しいデータキーを生成します。キャッシュがない場合も同じ動作になります。

ストリームデータなど、不明なサイズのデータにデータキーキャッシュは使用されません。これにより、キャッシュ CMM が最大バイトしきい値を正しく適用できるようになります。この動作を避けるには、暗号化リクエストにメッセージサイズを追加します。

キャッシュに加えて、データキーキャッシュではキャッシュ暗号化マテリアルマネージャー (キャッシュ CMM) が使用されます。キャッシュ CMM は、キャッシュおよび基盤となる CMM とのやり取りに特化した暗号化マテリアルマネージャー (CMM) です。(マスターキープロバイダーまたはキーリングを指定すると、AWS Encryption SDK はデフォルトの CMM を自動で作成します。) キャッシュ CMM は、基盤となる CMM が返すデータキーをキャッシュします。また、キャッシュ CMM は、ユーザーが設定したキャッシュセキュリティしきい値を適用します。

キャッシュで誤ったデータキーが選択されないように、互換性のあるすべてのキャッシュ CMM では、キャッシュされた暗号化マテリアルの次のプロパティがマテリアルリクエストと一致している必要があります。

注記

この AWS Encryption SDK は、アルゴリズムスイートキー取得関数を使用する場合にのみデータキーをキャッシュします。

次のワークフローでは、データを暗号化するリクエストがデータキーキャッシュがある場合とない場合にどのように処理されるかを示します。キャッシュおよびキャッシュ CMM を含む、ユーザーが作成したキャッシュコンポーネントがプロセスの中でどのように使用されるかが示されます。

キャッシュを使用しないでデータを暗号化する

キャッシュせずに暗号化マテリアルを取得するには:

  1. アプリケーションが、AWS Encryption SDK にデータを暗号化するよう要求します。

    リクエストは、マスターキープロバイダーまたはキーリングを指定します。AWS Encryption SDK は、マスターキープロバイダーまたはキーリングとやり取りするデフォルト CMM を作成します。

  2. AWS Encryption SDK によって、暗号化マテリアルの CMM を求められます (暗号化マテリアルを取得)。

  3. CMM によって、暗号化マテリアルのキーリング (C および JavaScript)、またはマスターキープロバイダー (Java および Python) を求められます。これには、AWS Key Management Service (AWS KMS) などの暗号化サービスの呼び出しが含まれる場合があります。CMM より AWS Encryption SDK に暗号化マテリアルが返ります。

  4. AWS Encryption SDK はプレーンテキストのデータキーを使ってデータを暗号化します。また、暗号化されたデータキーと復号されたデータキーは暗号化されたメッセージに保存され、ユーザーに返ります。

キャッシュを使用しないでデータを暗号化する

キャッシュを使用してデータを暗号化する

データキーキャッシュを使用して暗号化マテリアルを取得するには:

  1. アプリケーションが、AWS Encryption SDK にデータを暗号化するよう要求します。

    このリクエストは、基盤となる暗号化マテリアルマネージャー (CMM) と関連付けられているキャッシュ暗号化マテリアルマネージャー (キャッシュCMM) を指定します。マスターキープロバイダーまたはキーリングを指定すると、AWS Encryption SDK はデフォルトの CMM を自動で作成します。

  2. SDK によって、指定したキャッシュ CMM に対して暗号化マテリアルが求められます。

  3. キャッシュ CMM は、キャッシュの暗号化マテリアルをリクエストします。

    1. キャッシュで一致が見つかった場合、期間が更新され、一致したキャッシュエントリの値を使用して、キャッシュされた暗号化マテリアルをキャッシュ CMM に返します。

      キャッシュエントリがセキュリティしきい値に準拠している場合、キャッシュ CMM はそれを SDK に返します。それ以外の場合は、一致がなかったものとしてキャッシュがエントリを削除し続行するように指示します。

    2. キャッシュで有効な一致が見つからない場合、キャッシュ CMM は基盤となる CMM に新しいデータキーを生成するよう要求します。

      基盤となる CMM は、そのキーリング (C および JavaScript)、またはマスターキープロバイダー (Java および Python) から暗号化マテリアルを取得します。これには、AWS Key Management Service などのサービスの呼び出しが含まれる場合があります。基盤となる CMM は、データキーのプレーンテキストおよび暗号化されたコピーをキャッシュ CMM に返します。

      キャッシュ CMM は、新しい暗号化マテリアルをキャッシュに保存します。

  4. キャッシュ CMM より AWS Encryption SDK に暗号化マテリアルが返ります。

  5. AWS Encryption SDK はプレーンテキストのデータキーを使ってデータを暗号化します。また、暗号化されたデータキーと復号されたデータキーは暗号化されたメッセージに保存され、ユーザーに返ります。

データキーキャッシュを使用してデータを暗号化する

暗号化マテリアルキャッシュの作成

AWS Encryption SDK は、データキーキャッシュで使用される暗号化マテリアルキャッシュの要件を定義します。また、ローカルキャッシュを提供します。これは、設定可能なインメモリの最も長く使用されていない (LRU) キャッシュです。ローカルキャッシュのインスタンスを作成するには、Java および Python の LocalCryptoMaterialsCache コンストラクタ、JavaScript の getLocalCryptographicMaterialsCache 関数、または C の aws_cryptosdk_materials_cache_local_new コンストラクタを使用します。

ローカルキャッシュには、キャッシュされたエントリの追加、削除、一致とキャッシュの保持を含む基本的なキャッシュ管理のロジックが含まれます。カスタムキャッシュ管理ロジックを作成する必要はありません。ローカルキャッシュはそのまま使用したり、カスタマイズしたり、任意の互換性のあるキャッシュを置き換えたりすることができます。

ローカルキャッシュの作成時に、その容量 (キャッシュが保持できるエントリの最大数) を設定します。この設定は、データキーの再利用が制限されている際に効率的なキャッシュを設計するのに役立ちます。

AWS Encryption SDK for Java と AWS Encryption SDK for Python は、null の暗号化マテリアルキャッシュ (NullCryptoMaterialsCache) も提供します。NullCryptoMaterialsCache は、すべての GET オペレーションのミスを返し、PUT オペレーションには応答しません。NullCryptoMaterialsCache はテストで使用したり、キャッシュコードを含むアプリケーションで一時的にキャッシュを無効にしたりするために使用できます。

AWS Encryption SDK では、それぞれの暗号化マテリアルキャッシュはキャッシュ暗号化マテリアルマネージャー (キャッシュ CMM) に関連付けられます。キャッシュ CMM は、キャッシュからデータキーを取得し、キャッシュにデータキーを格納して、設定したセキュリティしきい値を適用します。キャッシュ CMM 作成時に、使用するキャッシュ、基盤となる CMM またはキャッシュするデータキーを生成するマスターキープロバイダーを指定します。

キャッシュ暗号化マテリアルマネージャーの作成

データキーキャッシュを有効にするには、キャッシュキャッシュ暗号化マテリアルマネージャー (キャッシュ CMM) を作成します。次に、データを暗号化または復号するリクエストで、標準的な暗号化マテリアルマネージャー (CMM) の代わりにキャッシュ CMM、またはマスターキープロバイダーキーリングを指定します。

CMM には 2 つのタイプがあります。いずれもデータキー (および関連する暗号化マテリアル) を取得しますが、以下のようにさまざまな方法があります。

  • CMM は、キーリング (C または JavaScript) またはマスターキープロバイダー (Java および Python) に関連付けられています。SDK より CMM に暗号化マテリアルまたは復号マテリアルが求められると、CMM はそのキーリングまたはマスターキープロバイダーからそのマテリアルを取得します。Java および Python では、CMM はマスターキーを使用して、データキーを生成、暗号化、または復号します。C および JavaScript では、キーリングは暗号化マテリアルを生成し、暗号化して返します。

  • キャッシュ CMM は、ローカルキャッシュなどの 1 つのキャッシュ、および基盤となる CMM に関連付けられています。SDK がキャッシュ CMM に暗号化マテリアルを要求すると、キャッシュ CMM はキャッシュからそれらを取得しようとします。一致が見つからない場合、キャッシュ CMM は、基盤となる CMM にマテリアルを要求します。次に、発信者に返す前に、新しい暗号化マテリアルをキャッシュします。

また、キャッシュ CMM は、ユーザーが各キャッシュエントリに設定したセキュリティしきい値を適用します。セキュリティしきい値はキャッシュ CMM で設定され適用されるため、キャッシュが機密性情報向けに設計されていなくても、互換性があるすべてのキャッシュが使用できます。

データキーキャッシュエントリとは

データキーキャッシュにより、キャッシュにデータキーおよび関連する暗号化マテリアルが保存されます。各エントリには、以下に示す要素が含まれます。この情報は、データキーキャッシュ機能を使用するかどうかを決定するときや、キャッシュ暗号化マテリアルマネージャー (キャッシュ CMM) でセキュリティしきい値を設定するときに役立ちます。

暗号化リクエストのキャッシュされたエントリ

暗号化オペレーションの結果としてデータキーキャッシュに追加されたエントリには、次の要素が含まれます。

  • プレーンテキストのデータキー

  • 暗号化されたデータキー (1 つ以上)

  • 暗号化コンテキスト

  • メッセージ署名キー (使用している場合)

  • アルゴリズムスイート

  • セキュリティしきい値を適用するための使用量カウンターを含む、メタデータ

復号リクエストのキャッシュされたエントリ

復号オペレーションの結果としてデータキーキャッシュに追加されたエントリには、次の要素が含まれます。

  • プレーンテキストのデータキー

  • 署名の検証キー (使用している場合)

  • セキュリティしきい値を適用するための使用量カウンターを含む、メタデータ

暗号化コンテキスト: キャッシュエントリを選択する方法

任意のリクエストで暗号化リクエストを指定してデータを暗号化できます。ただし、暗号化コンテキストはデータキーキャッシュで特別な役割を果たします。データキーが同じキャッシュ CMM から発生している場合であっても、キャッシュ内でデータキーのサブグループを作成できます。

暗号化コンテキストは、任意のシークレットデータを含まない、一連のキーと値のペアです。暗号化中、暗号化コンテキストは暗号化されたデータに暗号化されてバインドされます。これにより、データを復号するために同じ暗号化コンテキストが必要になります。AWS Encryption SDK では、暗号化コンテキストは、暗号化されたデータおよびデータキーと共に、暗号化されたメッセージに保存されます。

データキーキャッシュを使用する場合、暗号化コンテキストを使用して、暗号化オペレーションに特定のキャッシュされたデータキーを選択することもできます。暗号化コンテキストは、データキー (キャッシュエントリ ID の一部) を使用してキャッシュエントリに保存されます。キャッシュされたデータキーは、その暗号化がコンテキストと一致する場合にのみ再利用されます。暗号化リクエストに特定のデータキーを再利用する場合、同じ暗号化コンテキストを指定します。これらのデータキーを回避するには、別の暗号化コンテキストを指定します。

暗号化コンテキストは常にオプションですが、推奨されています。リクエストで暗号化コンテキストを指定しない場合、空の暗号化コンテキストがキャッシュエントリ ID に含められ、各リクエストに照合されます。

アプリケーションはキャッシュされたデータキーを使用していますか?

データキーキャッシュは、特定のアプリケーションやワークロードに対して非常に効果的な最適化戦略です。ただし、リスクが伴うため、状況にどれほど効果があるかを判断し、その利点がリスクを上回るかどうかを判断することが重要です。

データキーキャッシュはデータキーを再利用するため、最も明白な効果は、新しいデータキーを生成するための呼び出し回数を減らすことです。データキーキャッシュが実装されている場合、キャッシュがミスしたとき、初期データキーを作成するためだけにAWS Encryption SDK は AWS KMS GenerateDataKey オペレーションを呼び出します。しかし、同じ暗号化コンテキストとアルゴリズムスイートを含む、同じ特性を持つ多数のデータキーを生成するアプリケーションでのみキャッシュのパフォーマンスが知覚的に向上します。

AWS Encryption SDK の実装が実際にキャッシュからのデータキーを使用しているかどうかを確認するには、次の方法を試してください。

  • マスターキーインフラストラクチャのログで、新しいデータキーを作成する呼び出しの頻度を確認します。データキーキャッシュが有効な場合、新しいキーを作成するための呼び出しの数は目に見えて低下します。たとえば、AWS KMS マスターキープロバイダーまたはキーリングを使用している場合は、GenerateDataKey 呼び出しの CloudTrail ログを検索します。

  • さまざまな暗号化リクエストに応じて AWS Encryption SDK が返す暗号化されたメッセージを比較します。たとえば AWS Encryption SDK for Java を使用している場合は、異なる暗号化呼び出しからの ParsedCipherText オブジェクトを比較します。AWS Encryption SDK for JavaScript では、MessageHeaderencryptedDataKeys プロパティの内容を比較します。データキーを再利用すると、暗号化されたメッセージ内の暗号化されたデータキーは同じになります。