最新プロバイダー - AWS データベース暗号化 SDK

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

最新プロバイダー

注記

クライアント側の暗号化ライブラリの名前が AWS Database Encryption SDK に変更されました。次のトピックには、DynamoDB Encryption Client for Java のバージョン 1.x~2.x および DynamoDB Encryption Client for Python のバージョン 1.x~3.x に関する情報が記載されています。詳細については、「AWS Database Encryption SDK for DynamoDB バージョンのサポート」を参照してください。

最新プロバイダーは、プロバイダーストアで機能するように設計された暗号化マテリアルプロバイダー (CMP) です。プロバイダーストアから CMP を取得し、CMP から返る暗号化マテリアルを取得します。これは、通常、各 CMP を使用して複数の暗号化マテリアルをリクエストします。ただし、プロバイダーストアの機能を使用して、マテリアルが再利用される範囲を制御し、CMP のローテーション頻度を決定し、最新プロバイダーを変更せずに使用する CMP のタイプを変更することもできます。

注記

最新プロバイダーの MostRecentProvider 記号に関連付けられたコードは、プロセスの有効期間の間、暗号化マテリアルをメモリに保存する場合があります。これにより、呼び出し元は、使用する権限がなくなったキーを使用できるようになる可能性があります。

MostRecentProvider 記号は、DynamoDB 暗号化クライアントのサポートされている古いバージョンでは廃止されており、バージョン 2.0.0 から除去されています。これは、CachingMostRecentProvider 記号に置き換えられています。詳細については、「最新プロバイダーの更新」を参照してください。

最新プロバイダーは、プロバイダーストアとその暗号ソースへの呼び出しを最小限に抑える必要のあるアプリケーションや、セキュリティ要件に違反せずに一部の暗号化マテリアルを再利用できるアプリケーションに適しています。例えば、これを使用して、項目を暗号化または復号するたびに AWS KMS を呼び出さなくても、AWS Key Management Service (AWS KMS) の AWS KMS key で暗号化マテリアルを保護できます。

選択したプロバイダーストアによって、最新プロバイダーが使用する CMP のタイプと、新しい CMP を取得する頻度が決まります。設計したカスタムプロバイダーストアを含む、最新プロバイダーと互換性のある任意のプロバイダーストアを使用できます。

DynamoDB 暗号化クライアントには、ラップされたマテリアルプロバイダー (ラップされた CMP) を作成して返す MetaStore が含まれています。MetaStore は、生成したラップされた CMP の複数のバージョンを内部の DynamoDB テーブルに保存し、DynamoDB 暗号化クライアントの内部インスタンスによるクライアント側の暗号化でそれらを保護します。

MetaStore は、AWS KMS key によって保護されている暗号化マテリアルを生成する Direct KMS プロバイダー、ユーザーが提供したラッピングキーと署名キーを使用するラップされた CMP、ユーザーが設計した互換性のあるカスタム CMP など、テーブル内のマテリアルを保護するように任意のタイプの内部 CMP を使用するように設定できます。

サンプルコードについては、以下を参照してください。

使用方法

最新プロバイダーを作成するには、プロバイダーストアを作成して構成した後、プロバイダーストアを使用する最新プロバイダーを作成する必要があります。

次の例は、MetaStore を使用し、Direct KMS プロバイダーから暗号化マテリアルを含む内部 DynamoDB テーブルのバージョンを保護する最新プロバイダーを作成する方法を示しています。以下の例では、CachingMostRecentProvider 記号を使用します。

それぞれの最新プロバイダーには、MetaStore テーブル内の CMP、有効期限 (TTL) 設定、およびキャッシュが保持できるエントリの数を決定するキャッシュサイズ設定を特定する名前が付けられています。これらの例では、キャッシュサイズを 1000 エントリに設定し、TTL を 60 秒に設定します。

Java
// Set the name for MetaStore's internal table final String keyTableName = 'metaStoreTable' // Set the Region and AWS KMS key final String region = 'us-west-2' final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' // Set the TTL and cache size final long ttlInMillis = 60000; final long cacheSize = 1000; // Name that identifies the MetaStore's CMPs in the provider store final String materialName = 'testMRP' // Create an internal DynamoDB client for the MetaStore final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); // Create an internal Direct KMS Provider for the MetaStore final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kms, keyArn); // Create an item encryptor for the MetaStore, // including the Direct KMS Provider final DynamoDBEncryptor keyEncryptor = DynamoDBEncryptor.getInstance(kmsProv); // Create the MetaStore final MetaStore metaStore = new MetaStore(ddb, keyTableName, keyEncryptor); //Create the Most Recent Provider final CachingMostRecentProvider cmp = new CachingMostRecentProvider(metaStore, materialName, ttlInMillis, cacheSize);
Python
# Designate an AWS KMS key kms_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' # Set the name for MetaStore's internal table meta_table_name = 'metaStoreTable' # Name that identifies the MetaStore's CMPs in the provider store material_name = 'testMRP' # Create an internal DynamoDB table resource for the MetaStore meta_table = boto3.resource('dynamodb').Table(meta_table_name) # Create an internal Direct KMS Provider for the MetaStore kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id) # Create the MetaStore with the Direct KMS Provider meta_store = MetaStore( table=meta_table, materials_provider=kms_cmp ) # Create a Most Recent Provider using the MetaStore # Sets the TTL (in seconds) and cache size (# entries) most_recent_cmp = MostRecentProvider( provider_store=meta_store, material_name=material_name, version_ttl=60.0, cache_size=1000 )

使用方法

最新プロバイダーがプロバイダーストアから CMP を取得します。次に、CMP を使用して、暗号化マテリアルを生成し、それを項目エンクリプタに返します。

最新プロバイダーについて

最新プロバイダーは、プロバイダーストアから暗号化マテリアルプロバイダー (CMP) を取得します。次に、CMP を使用して、それが返す暗号化マテリアルを生成します。各最新プロバイダーは 1 つのプロバイダーストアに関連付けられていますが、プロバイダーストアは複数のホスト間で複数のプロバイダーに CMP を提供できます。

最新プロバイダーは、任意のプロバイダーストアから互換性のある CMP を使用できます。暗号化または復号マテリアルを CMP に要求し、項目エンクリプタに出力を返します。暗号化オペレーションは実行されません。

最新プロバイダーは、そのプロバイダーストアから CMP を要求するために、使用する既存の CMP のマテリアル名とバージョンを提供します。暗号化マテリアルでは、最新プロバイダーは常に最大 (「最新の」) バージョンをリクエストします。復号マテリアルの場合、次の図に示すように、暗号化マテリアルの作成に使用された CMP のバージョンをリクエストします。

最新プロバイダー

最新プロバイダーは、プロバイダーストアが返す CMP のバージョンをメモリ内のローカル最小使用 (LRU) キャッシュに保存します。キャッシュにより、最新プロバイダーは、すべての項目のプロバイダーストアを呼び出さずに必要な CMP を取得できます。必要に応じてキャッシュをクリアすることができます。

最新プロバイダーは、アプリケーションの特性に基づいて調整できる設定可能な有効期限 (TTL) 値を使用します。

MetaStore について

互換性のあるカスタムプロバイダーストアなどの任意のプロバイダーストアで最新プロバイダーを使用できます。DynamoDB 暗号化クライアントには、設定してカスタマイズできる安全な実装である MetaStore が含まれています。

MetaStore は、CMP で必要なラッピングキー、ラップ解除キー、および署名キーで構成された、ラップされた CMP を作成して返すプロバイダーストアです。ラップされた CMP は常にすべての項目に対して一意の項目暗号化キーを生成するため、MetaStore は最新プロバイダーにとって安全なオプションです。項目暗号化キーと署名キーを保護するラップキーのみが再利用されます。

次の図は、MetaStore のコンポーネントと、最新プロバイダーとのやり取りの方法を示しています。

MetaStore

MetaStore はラップされた CMP を生成し、内部 DynamoDB テーブルに (暗号化された形式で) 保存します。パーティションキーは、最新プロバイダーマテリアルの名前であり、ソートキーはそのバージョン番号です。テーブル内のマテリアルは、項目エンクリプタや内部暗号化マテリアルプロバイダー (CMP) など、内部 DynamoDB 暗号化クライアントによって保護されています。

MetaStore では、Direct KMS プロバイダー、提供する暗号化マテリアルを使用したラップされた CMP、または互換性のあるカスタム CMP など、あらゆるタイプの内部 CMP を使うことができます。MetaStore の内部 CMP が Direct KMS プロバイダーの場合、再利用可能なラッピングおよび署名キーは、AWS Key Management Service (AWS KMS) 内の AWS KMS key で保護されます。MetaStore は、内部テーブルに新しい CMP バージョンを追加するか、内部テーブルから CMP バージョンを取得するたびに AWS KMS を呼び出します。

有効期限 (TTL) の値を設定する

作成した最新プロバイダーごとに有効期限 (TTL) の値を設定できます。一般に、アプリケーションで実用的な最も低い TTL 値を使用します。

TTL 値の使用は、最新プロバイダーの CachingMostRecentProvider 記号で変更されます。

注記

最新プロバイダーの MostRecentProvider 記号は、DynamoDB 暗号化クライアントのサポートされている古いバージョンでは廃止されており、バージョン 2.0.0 から除去されています。これは、CachingMostRecentProvider 記号に置き換えられています。可能な限り早急にコードを更新することをお勧めします。詳細については、「最新プロバイダーの更新」を参照してください。

CachingMostRecentProvider

CachingMostRecentProvider は、以下の 2 つの異なる方法で TTL 値を使用します。

  • TTL により、最新プロバイダーがプロバイダーストアで新しいバージョンの CMP をチェックする頻度を決定します。新しいバージョンが利用可能な場合、最新プロバイダーはその CMP を置き換え、暗号化マテリアルを更新します。それ以外の場合、現在の CMP と暗号化マテリアルを引き続き使用します。

  • TTL により、キャッシュ内の CMP を使用できる期間を決定します。キャッシュされた CMP を暗号化に使用する前に、最新プロバイダーはキャッシュ内の時間を評価します。CMP キャッシュ時間が TTL を超えると、CMP はキャッシュから削除され、最新プロバイダーはプロバイダストアから新しい最新バージョン CMP を取得します。

MostRecentProvider

MostRecentProvider では、TTL により、最新プロバイダーがプロバイダーストアで新しいバージョンの CMP をチェックする頻度が決定されます。新しいバージョンが利用可能な場合、最新プロバイダーはその CMP を置き換え、暗号化マテリアルを更新します。それ以外の場合、現在の CMP と暗号化マテリアルを引き続き使用します。

TTL では、新しい CMP バージョンが作成される頻度は決定されません。新しい CMP バージョンを作成するには、暗号化マテリアルをローテーションします。

理想的な TTL 値は、アプリケーションとそのレイテンシー、および可用性の目標によって異なります。TTL を低くすると、暗号化マテリアルがメモリに格納される時間が短縮され、セキュリティプロファイルが向上します。また、TTL が低いほど、重要な情報がより頻繁に更新されます。例えば、内部 CMP が Direct KMS プロバイダーである場合、呼び出し元が AWS KMS key を使用する権限をまだ持っているかを、より頻繁に検証します。

ただし、TTL が低すぎると、プロバイダーストアへの頻繁な呼び出しによってコストが増加し、プロバイダーストアがアプリケーションや、サービスアカウントを共有する他のアプリケーションからのリクエストをスロットリングする可能性があります。また、暗号化マテリアルをローテーションする速度で TTL を調整することでメリットが得られる場合があります。

テスト中に、お使いのアプリケーションと、セキュリティおよびパフォーマンス標準に適した設定が見つかるまで、さまざまなワークロードで TTL とキャッシュサイズを変更します。

暗号化マテリアルの回転

最新プロバイダーで暗号化マテリアルが必要な場合、最新プロバイダーは必ず、認識している最新バージョンの CMP を使用します。新しいバージョンをチェックする頻度は、最新プロバイダーを構成するときに設定した有効期限 (TTL) 値によって決定されます。

TTL が期限切れになると、最新プロバイダーはプロバイダーストアで新しいバージョンの CMP をチェックします。新しいバージョンを使用できる場合、最新プロバイダーはそれを取得し、キャッシュ内の CMP を置き換えます。プロバイダーストアに新しいバージョンがあることが検出されるまで、この CMP とその暗号化マテリアルが使用されます。

最新プロバイダーの新しいバージョンの CMP を作成するようにプロバイダーストアに指示するには、プロバイダーストアの新規プロバイダーの作成オペレーション作を、最新プロバイダーのマテリアル名で呼び出します。プロバイダーストアは新しい CMP を作成し、暗号化されたコピーをより大きなバージョン番号で内部ストレージに保存します。(CMP を返しますが、破棄することもできます。) その結果、次に最新プロバイダーがプロバイダーストアにその CMP の最大バージョン番号を問い合わせるときに、最新プロバイダーは新しいより大きなバージョン番号を取得し、それをストアに対する後続のリクエストで使用して、CMP の新しいバージョンが作成されたかどうかを確認します。

時間、処理された項目または属性の数、またはアプリケーションに合ったその他のメトリクスに基づいて、新しいプロバイダー作成コールをスケジュールできます。

暗号化マテリアルを取得する

最新プロバイダーは、この図に示す次のプロセスを使用して、項目エンクリプタに返す暗号化マテリアルを取得します。出力は、プロバイダーストアが返す CMP のタイプによって異なります。最新プロバイダーは、DynamoDB 暗号化クライアントに含まれる MetaStore などの互換性のある任意のプロバイダーストアを使用できます。

DynamoDB 暗号化クライアントでの最新プロバイダーの入力、処理、および出力

CachingMostRecentProvider記号を使用して最新プロバイダーを作成するときに、プロバイダーストア、最新プロバイダーの名前、および有効期限 (TTL) 値を指定します。オプションで、キャッシュ内に存在できる暗号化マテリアルの最大数を決定するキャッシュサイズを指定することもできます。

項目エンクリプタが最新プロバイダーに暗号化マテリアルを要求すると、最新プロバイダーは、その CMP の最新バージョンのキャッシュの検索を開始します。

  • キャッシュ内で最新バージョンの CMP を検出し、CMP が TTL 値を超過していない場合、最新プロバイダーは CMP を使用して暗号化マテリアルを生成します。次に、暗号化マテリアルを項目エンクリプタに返します。このオペレーションでは、プロバイダーストアへの呼び出しは必要ありません。

  • CMP の最新バージョンがキャッシュ内に存在しない場合、またはキャッシュ内に存在していても TTL 値を超過している場合、最新プロバイダーはそのプロバイダーストアから CMP をリクエストします。リクエストには、最新プロバイダーのマテリアル名と、既知の最大のバージョン番号が含まれています。

    1. プロバイダーストアは、永続的ストレージから CMP を返します。プロバイダーストアが MetaStore の場合、最新プロバイダーのマテリアル名をパーティションキーとして使用し、バージョン番号をソートキーとして使用して、内部の DynamoDB テーブルから暗号化済みのラップされた CMP を取得します。MetaStore は、内部項目エンクリプタと内部 CMP を使用して、ラップされた CMP を復号します。次に、プレーンテキスト CMP を最新プロバイダーに返します。内部 CMP が Direct KMS Provider の場合、このステップには AWS Key Management Service (AWS KMS) コールが含まれます。

    2. CMP は、amzn-ddb-meta-idフィールドを実際のマテリアル説明に追加します。その値は、内部テーブルの CMP のマテリアル名とバージョンです。プロバイダーストアは CMP を最新プロバイダーに返します。

    3. 最新プロバイダーは CMP をメモリにキャッシュします。

    4. 最新プロバイダーは CMP を使用して暗号化マテリアルを生成します。次に、暗号化マテリアルを項目エンクリプタに返します。

復号マテリアルを取得する

項目エンクリプタが最新プロバイダーに復号マテリアルを要求すると、最新プロバイダーは以下のプロセスを使用して、それらを取得し返します。

  1. 最新プロバイダーは、項目を暗号化するために使用された暗号化マテリアルのバージョン番号をプロバイダーストアに問い合わせます。項目のマテリアル説明属性から実際のマテリアル説明を渡します。

  2. プロバイダーストアは、実際のマテリアル説明の amzn-ddb-meta-id フィールドから暗号化 CMP バージョン番号を取得し、最新プロバイダーに返します。

  3. 最新プロバイダーは、項目の暗号化と署名に使用された CMP のバージョンをキャッシュ内で検索します。

  • CMP の一致するバージョンがキャッシュにあり、かつ、CMP が有効期限 (TTL) 値を超過していないことがわかった場合、最新プロバイダーは CMP を使用して復号マテリアルを生成します。次に、復号マテリアルを項目エンクリプタに返します。このオペレーションでは、プロバイダーストアまたは他の CMP への呼び出しは必要ありません。

  • CMP の一致するバージョンがキャッシュ内に存在しない場合、またはキャッシュされた AWS KMS key が TTL 値を超過している場合、最新プロバイダーはそのプロバイダーストアから CMP をリクエストします。リクエストには、マテリアル名および暗号化 CMP バージョン番号が送信されます。

    1. プロバイダーストアは、最新プロバイダー名をパーティションキーとして使用し、バージョン番号をソートキーとして使用して、CMP の永続的ストレージを検索します。

      • 名前とバージョン番号が永続的ストレージにない場合、プロバイダーストアは例外をスローします。CMP を生成するためにプロバイダーストアを使用した場合、意図的に削除されていない限り、CMP は永続的ストレージに保存する必要があります。

      • 一致する名前とバージョン番号を持つ CMP がプロバイダーストアの永続的ストレージにある場合、プロバイダーストアは指定された CMP を最新プロバイダーに返します。

        プロバイダーストアが MetaStore の場合、その DynamoDB テーブルから暗号化済みの CMP を取得します。次に、内部 CMP の暗号化マテリアルを使用して、CMP を最新プロバイダーに返す前に暗号化された CMP を復号します。内部 CMP が Direct KMS Provider の場合、このステップには AWS Key Management Service (AWS KMS) コールが含まれます。

    2. 最新プロバイダーは CMP をメモリにキャッシュします。

    3. 最新プロバイダーは CMP を使用して復号マテリアルを生成します。次に、復号マテリアルを項目エンクリプタに返します。

最新プロバイダーの更新

最新プロバイダーの記号が MostRecentProvider から CachingMostRecentProvider に変更されています。

注記

最新プロバイダーを表す MostRecentProvider 記号は、両方の言語実装で、Java 用 DynamoDB 暗号化クライアントバージョン 1.15、および Python 用 DynamoDB 暗号化クライアントバージョン 1.3 では廃止され、DynamoDB 暗号化クライアントバージョン 2.0.0 では除去されています。代わりに、CachingMostRecentProvider を使用してください。

CachingMostRecentProvider では、以下の変更が実装されます。

  • CachingMostRecentProvider は、メモリ内の時間が、設定された有効期限 (TTL) 値を超過すると、メモリから暗号化マテリアルを定期的に除去します。

    MostRecentProvider は、プロセスの有効期間の間、メモリに暗号化マテリアルを保存する場合があります。その結果、最新プロバイダーは認証の変更を認識しない可能性があります。暗号化キーを使用するための呼び出し元のアクセス許可が取り消された後に、暗号化キーを使用する場合があります。

    この新しいバージョンにアップデートできない場合、キャッシュで clear() メソッドを定期的に呼び出すことで同様の効果を得られます。このメソッドは、キャッシュの内容を手動でフラッシュし、最新プロバイダーが新しい CMP と新しい暗号化マテリアルを要求するように求めます。

  • また、CachingMostRecentProvider にキャッシュサイズの設定を含めて、キャッシュに対するより詳細な制御を行うこともできます。

CachingMostRecentProvider を更新するには、コード内の記号名を変更する必要があります。その他の点ではすべて、CachingMostRecentProvider には MostRecentProvider との完全な下位互換性があります。テーブル項目を再暗号化する必要はありません。

ただし、CachingMostRecentProvider による、基盤となる主要インフラストラクチャへの呼び出しが増えます。有効期限 (TTL) の各間隔で、プロバイダーストアが少なくとも 1 回呼び出されます。多数のアクティブな CMP を持つアプリケーション(頻繁なローテーションによる)、または大規模なフリートを持つアプリケーションは、この変更の影響を受ける可能性が最も高くなります。

更新されたコードをリリースする前に、コードを徹底的にテストして、頻繁な呼び出しによってアプリケーションが損なわれたり、プロバイダーが依存するサービス (AWS Key Management Service (AWS KMS) や Amazon DynamoDB など) によってスロットリングが引き起こされたりしないように確認してください。パフォーマンスの問題を軽減するために、確認したパフォーマンス特性に基づいて、CachingMostRecentProvider のキャッシュサイズや有効期限 (TTL) を調整してください。ガイダンスについては、「有効期限 (TTL) の値を設定する」を参照してください。