

# 保管時の DynamoDB 暗号化
<a name="EncryptionAtRest"></a>

Amazon DynamoDB に保存されているすべてのユーザーデータは、保管時に完全に暗号化されます。DynamoDB の保管時の暗号化は、[AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) に保存されている暗号化キーを使用してすべての保管中のデータを暗号化することにより高度なセキュリティを提供します。この機能は、機密データの保護における負担と複雑な作業を減らすのに役立ちます。保管時に暗号化することで、セキュリティを重視したアプリケーションを構築して、暗号化のコンプライアンスと規制の厳格な要件を満たすことができます。

DynamoDB の保管時の暗号化は、データを堅牢なメディアに保存されている場合は常に暗号化されたテーブル内にデータを配置して保護することにより、プライマリキー、ローカルおよびグローバルセカンダリインデックス、ストリーム、グローバルテーブル、バックアップ、DynamoDB Accelerator (DAX) クラスターなどに対する追加のデータ保護レイヤーを提供します。組織のポリシー、業界や政府の規制、またはコンプライアンス要件によって、アプリケーションのデータセキュリティを高めるために保管時の暗号化の使用が求められることがあります。データベースアプリケーションの暗号化の詳細については、「What is the AWS Database Encryption SDK?」を参照してください。[https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/what-is-database-encryption-sdk.html](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/what-is-database-encryption-sdk.html)

保管時の暗号化には、テーブルの暗号化に使用される暗号化キーを管理するための AWS KMS が統合されます。キーの種類と詳細については、「**AWS Key Management Service 開発者ガイド」の「[AWS Key Management Service concepts](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html#key-state-cmk-type)」を参照してください。

新しいテーブルを作成する場合、以下のいずれかの AWS KMS key の種類を選択してテーブルを暗号化できます。キーの種類は、いつでも切り替えることができます。
+ **AWS 所有のキー –** デフォルトの暗号化タイプ。キーは DynamoDB により所有されます (追加料金なし)。
+ **AWS マネージドキー –** キーはアカウントに保存され、AWS KMS によって管理されます (AWS KMS の料金が適用されます)。
+ **カスタマーマネージド型キー –** キーはお客様のアカウントに保存され、ユーザーが作成、所有、管理します。ユーザーには KMS キーに対するフルコントロールの権限があります (AWS KMS の料金が適用されます)。

キーの種類の詳細については、「[ Customer keys and AWS keys](/kms/latest/developerguide/concepts.html#key-mgmt)」を参照してください。

**注記**  
保存時の暗号化を有効にして新しい DAX クラスターを作成する場合、AWS マネージドキー を使用して、クラスター内の保管中のデータを暗号化します。
テーブルにソートキーが存在する場合、範囲の境界線を示すソートキーの一部が、プレーンテキスト形式でテーブルメタデータに保存されます。

暗号化されたテーブルにアクセスすると、DynamoDB はテーブルデータを透過的に復号化します。暗号化されたテーブルの使用あるいは管理のためにコードやアプリケーションを変更する必要はありません。DynamoDB は、期待される 1 桁ミリ秒のレイテンシーを継続的に提供し、すべての DynamoDB クエリは暗号化されたデータでシームレスに機能します。

新しいテーブルを作成する際に暗号化キーを指定したり、AWS マネジメントコンソール、AWS Command Line Interface (AWS CLI)、Amazon DynamoDB API を使用して既存のテーブルで暗号化キーを切り替えたりすることができます。この方法については、「[DynamoDB での暗号化テーブルの管理](encryption.tutorial.md)」を参照してください。

AWS 所有のキー を使用した保管時の暗号化に追加の料金はかかりません。ただし、AWS KMS 料金が AWS マネージドキー およびカスタマーマネージドキーに適用されます。料金の詳細については、「[AWS KMS の料金](https://aws.amazon.com/kms/pricing)」を参照してください。

DynamoDB の保管時の暗号化は、AWS 中国 (北京)、AWS 中国 (寧夏)、AWS GovCloud (米国) のリージョンを含むすべての AWS リージョンで利用できます。詳細については、「[保管時の DynamoDB 暗号化: 仕組み](encryption.howitworks.md)」および「[DynamoDB の保管時の暗号化の使用に関する注意事項](encryption.usagenotes.md)」を参照してください。

# 保管時の DynamoDB 暗号化: 仕組み
<a name="encryption.howitworks"></a>

Amazon DynamoDB の保管時の暗号化では、256 ビットの Advanced Encryption Standard (AES-256) を使用してデータの暗号化が行われるので、基盤となるストレージへの不正アクセスからデータを保護できます。

保管データ暗号化には、テーブルの暗号化に使用される暗号化キーを管理するための AWS Key Management Service (AWS KMS) が統合されます。

**注記**  
2022 年 5 月、AWS KMS は AWS マネージドキー のローテーションスケジュールを 3 年 (約 1,095 日間隔) ごとから毎年 (約 365 日間隔) に変更しました。  
新しい AWS マネージドキーは、作成日から 1 年後に自動的にローテーションされ、それ以降はほぼ 1 年ごとにローテーションされます。  
既存の AWS マネージドキー は、直近のローテーションから 1 年後にローテーションされ、その後毎年ローテーションされます。

## AWS 所有のキー
<a name="ddb-owned"></a>

 AWS 所有のキー はお客様の AWS アカウントに保存されません。これらは、複数の AWS アカウントで使用するために AWS が所有および管理している KMS キーのコレクションの一部です。AWS のサービスでは、データの保護に AWS 所有のキー を使用できます。DynamoDB で使用する AWS 所有のキーは毎年 (約 365 日ごとに) ローテーションされます。

AWS 所有のキー は表示、管理、使用することはできず、その使用を監視することもできません。ただし、データを暗号化するキーを保護するための作業やプログラムを操作したり変更したりする必要はありません。

AWS 所有のキー のご利用に関しては、月額料金や使用料金は請求されません。また、アカウントの AWS KMS クォータにも影響しません。

## AWS マネージドキー
<a name="managed-key-service-default-kms"></a>

AWS マネージドキー は、お客様のアカウントにある KMS キーであり、AWS KMS と統合されている AWS のサービスがお客様に代わって作成、管理、使用します。アカウントで AWS マネージドキー を表示して、キーポリシーを表示し、AWS CloudTrail ログでその使用を監査できます。ただし、これらの KMS キーを管理したり許可を変更したりすることはできません。

保管時の暗号化は、テーブルの暗号化に使用される DynamoDB (`aws/dynamodb`) 用の AWS マネージドキー を管理するために AWS KMS と自動的に統合されます。暗号化された DynamoDB テーブルを作成したときにAWS マネージドキー が存在しない場合、AWS KMS は自動的に新しいキーを作成します。このキーは、この先作成するテーブルの暗号化に使用されます。AWS KMS は、安全で可用性の高いハードウェアとソフトウェアを組み合わせて、クラウド向けに拡張されたキー管理システムを提供します。

AWS マネージドキー の許可を管理する方法の詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[AWS マネージドキー の使用の承認](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-authz)」を参照してください。

## カスタマーマネージドキー
<a name="managed-key-customer-managed"></a>

カスタマーマネージドキーは、お客様が作成、所有、管理する AWS アカウントの KMS キーです。この KMS キーでは、キーポリシー、IAM ポリシー、および許可の確立と管理、有効化と無効化、暗号化対象のローテーション、タグの追加、KMS キーを参照するエイリアスの作成、削除スケジュールの設定などを完全に制御することができます。カスタマーマネージドキーの許可を管理する方法の詳細については、「[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)」を参照してください。

カスタマーマネージドキーをテーブルレベルの暗号化キーとして指定すると、DynamoDB テーブル、ローカルおよびグローバルセカンダリインデックス、およびストリームは、同じカスタマーマネージドキーで暗号化されます。オンデマンド Backup は、Backup の作成時に指定されたテーブルレベルの暗号化キーを使用して暗号化されます。テーブルレベルの暗号化キーを更新しても、既存のオンデマンド Backup に関連付けられている暗号化キーは変更されません。

カスタマーマネージドキーの状態を無効に設定するか、削除のスケジュールを設定すると、すべてのユーザーと DynamoDB サービスは、データの暗号化と復号化、およびテーブルに対する読み取り/書き込み操作を実行できなくなります。テーブルに対するアクセスを維持し、データ損失を防止するには、DynamoDB が暗号化キーにアクセスできる必要があります。

カスタマーマネージドキーを無効化したり、削除をスケジュールしたりすると、テーブルステータスは**アクセス不能**になります。テーブルの操作を続行できるようにするには、指定された暗号化キーへの DynamoDB アクセスを 7 日以内に提供する必要があります。暗号化キーにアクセスできないことが検出されると、DynamoDB から警告メール通知が送信されます。

**注記**  
DynamoDB サービスがカスタマーマネージドキーに 7 日以上アクセスできない場合、テーブルはアーカイブされてアクセスできなくなります。DynamoDB は、テーブルのオンデマンド Backup を作成し、それに対して課金されます。このオンデマンド Backup を使用して、データを新しいテーブルに復元できます。復元を開始するには、最後に使用したカスタマーマネージドキーをテーブルで有効にし、DynamoDB からのアクセスを確立します。
グローバルテーブルレプリカの暗号化に使用したカスタマーマネージドキーにアクセスできない場合、DynamoDB は、このレプリカをレプリケーショングループから除外します。レプリカは削除されず、このリージョンに対するレプリケーションは、カスタマーマネージドキーにアクセス不能と検出されてから 20 時間後に停止します。

詳細については、「[キーの有効化](/kms/latest/developerguide/enabling-keys.html)」と「[キーの削除](/kms/latest/developerguide/deleting-keys.html)」を参照してください。

## AWS マネージドキー の使用に関する注意事項
<a name="managed-key-notes"></a>

AWS KMS アカウントに保存されている KMS キーにアクセスできない場合、Amazon DynamoDB はテーブルデータを読み取れません。DynamoDB は、エンベロープ暗号化とキー階層を使用してデータを暗号化します。AWS KMS 暗号化キーは、このキー階層のルートキーを暗号化するために使用されます。詳細については、「AWS Key Management Service デベロッパーガイド**」の「[エンベロープ暗号化](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)」を参照してください。

 DynamoDB は、DynamoDB オペレーションごとに AWS KMS を呼び出すわけではありません。キーは、アクティブなトラフィックを持つ呼び出しごとに 5 分に 1 回更新されます。

SDK が接続を再利用するように設定されていることを確認してください。そうしないと、DynamoDB は、オペレーションごとに新しい AWS KMS キャッシュエントリを再確立しなければならなくなるのでレイテンシーが発生します。さらに、AWS KMSと CloudTrail のコストが上がってしまう可能性もあります。たとえば、Node.js SDK を使用してこれを行うには、`keepAlive` を有効にした状態で新しい HTTPS エージェントを作成することができます。詳細については、「*AWS SDK for JavaScript デベロッパーガイド*」の「[Node.js での keepAlive の設定](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html)」を参照してください。

# DynamoDB の保管時の暗号化の使用に関する注意事項
<a name="encryption.usagenotes"></a>

Amazon DynamoDB で保管時の暗号化を使用する場合は、以下の点を考慮してください。

## すべてのテーブルデータの暗号化
<a name="encryption.usagenotes.tabledata"></a>

保管時のサーバー側の暗号化は、すべての DynamoDB テーブルデータで有効になり、無効にできません。テーブル内の項目のサブセットのみを暗号化することはできません。

保管時の暗号化は、永続的ストレージメディアの静的 (保管時) のデータのみを暗号化します。転送中のデータあるいは使用中のデータでデータの安全性が考慮される場合には、追加の対策を実行する必要がある場合があります。
+ 転送中のデータ: DynamoDB のすべてのデータは転送時に暗号化されます。デフォルトでは、DynamoDB との通信において、Secure Sockets Layer (SSL)/Transport Layer Security (TLS) 暗号化を使用してネットワークトラフィックを保護する HTTPS プロトコルが使用されます。
+ 使用中のデータ: DynamoDB 送信する前のデータを保護するには、クライアント側の暗号化を使用します。詳細については、「*Amazon DynamoDB Encryption Client デベロッパーガイド*」の「[クライアント側とサーバー側の暗号化](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/client-server-side.html)」を参照してください。

暗号化されたテーブルでストリーミングを使用できます。DynamoDB Streams は、テーブルレベルの暗号化キーを使用して常に暗号化されます。詳細については、「[DynamoDB Streams の変更データキャプチャ](Streams.md)」を参照してください。

DynamoDB バックアップが暗号化され、バックアップから復元されたテーブルでも暗号化が有効になります。バックアップデータの暗号化に、AWS 所有のキー、AWS マネージドキー、またはカスタマーマネージドキーを使用できます。詳細については、「[DynamoDB のバックアップと復元](Backup-and-Restore.md)」を参照してください。

ローカルセカンダリインデックスおよびグローバルセカンダリインデックスは、ベーステーブルと同じキーを使用して暗号化されます。

## 暗号化タイプ
<a name="encryption.usagenotes.encryptiontypes"></a>

**注記**  
カスタマーマネージドキーは、グローバルテーブルバージョン 2017 ではサポートされていません。DynamoDB グローバルテーブルでカスタマーマネージドキーを使用する場合は、テーブルをグローバルテーブルバージョン 2019 にアップグレードしてから有効にする必要があります。

AWS マネジメントコンソール では、AWS マネージドキー またはカスタマーマネージドキーを使用してデータを暗号化すると、暗号化タイプは `KMS` になります。AWS 所有のキー を使用すると、暗号化タイプは `DEFAULT` になります。Amazon DynamoDB API では、AWS マネージドキー またはカスタマーマネージドキーを使用すると暗号化タイプは `KMS` になります。暗号化タイプがない場合、データは AWS 所有のキー を使用して暗号化されます。AWS 所有のキー、AWS マネージドキー、カスタマーマネージドキーはいつでも切り替えることができます。コンソール、AWS Command Line Interface (AWS CLI)、または Amazon DynamoDB API を使用して、暗号化キーを切り替えることができます。

カスタマーマネージドキーを使用する場合、次の制限に注意してください。
+ DynamoDB アクセラレーター (DAX) クラスターではカスタマーマネージドキーは使用できません。詳細については、「[保管時の DAX 暗号化](DAXEncryptionAtRest.md)」を参照してください。
+ カスタマーマネージドキーを使用して、トランザクションを使用するテーブルを暗号化できます。ただし、トランザクションの伝達の堅牢性を確保するために、トランザクションリクエストのコピーはサービスによって一時的に保存され、AWS 所有のキー を使用して暗号化されます。テーブルとセカンダリインデックスのコミット済みデータは、カスタマーマネージドキーを使用して常に保管時に暗号化されます。
+ カスタマーマネージドキーを使用して、Contributor Insights を使用するテーブルを暗号化できます。ただし、Amazon CloudWatch に送信されるデータは、AWS 所有のキー を使用して暗号化されます。
+ 新しいカスタマーマネージドキーに移行する場合は、プロセスが完了するまで元のキーを有効にしておいてください。AWS では、新しいキーでデータを暗号化する前に、元のキーを使用してデータを復号化する必要があります。テーブルの SSEDescription ステータスが有効になり、新しいカスタマーマネージドキーの KMSmasterKeyArn が表示されると、プロセスは完了します。この時点で、元のキーを無効にするか、削除のスケジュールを設定できます。
+ 新しいカスタマー管理のキーが表示されると、テーブルと新しいオンデマンドバックアップが新しいキーで暗号化されます。
+ 既存のオンデマンドバックアップは、バックアップの作成時に使用されたカスタマー管理のキーで暗号化されたままになります。これらのバックアップを復元するには、同じキーが必要です。DescribeBackup API を使用してバックアップの SSEDescription を表示することで、各バックアップが作成された期間のキーを識別できます。
+ カスタマーマネージドキーを無効化した場合、または削除をスケジュールした場合、DynamoDB Streams 内のデータは 24 時間保持されます。作成後 24 時間を超えた未取得のアクティビティデータはすべて、トリミングの対象となります。
+ カスタマーマネージドキーを無効化した場合、または削除をスケジュールした場合、有効期限 (TTL) は 30 分間続きます。これらの TTL 削除は引き続き DynamoDB Streams に出力され、標準のトリミングまたは保持間隔が適用されます。

  詳細については、「[キーの有効化](/kms/latest/developerguide/enabling-keys.html)」と「[キーの削除](/kms/latest/developerguide/deleting-keys.html)」を参照してください。

## KMS キーとデータキーを使用する
<a name="dynamodb-kms"></a>

DynamoDB の保存時の暗号化機能は、AWS KMS key およびデータキーの階層を使用してテーブルのデータを保護します。DynamoDB は、同じキー階層を使用して、DynamoDB Streams、グローバルテーブル、およびバックアップが耐久性のあるメディアに書き込まれるときに保護します。

DynamoDB にテーブルを実装する前に、暗号化戦略を計画することをお勧めします。機密データまたは機密データを DynamoDB に保存する場合は、クライアント側の暗号化をプランに含めることを検討してください。これにより、データをできるだけ送信元に近い状態で暗号化し、ライフサイクル全体にわたってデータを確実に保護できます。詳細については、「[DynamoDB 暗号化クライアント](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html)」ドキュメントを参照してください。

**AWS KMS key**  
保存時の暗号化機能は、AWS KMS key の DynamoDB テーブルを保護します。デフォルトでは、DynamoDB は [AWS 所有のキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) (DynamoDB サービスアカウントで作成および管理されるマルチテナントキー) を使用します。ただし、DynamoDB テーブルは、[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)または AWS アカウント の DynamoDB (`aws/dynamodb`) 用で暗号化できます。テーブルごとに異なる KMS キーを選択できます。テーブル用に選択した KMS キーも、ローカルおよびグローバルのセカンダリインデックス、ストリーム、バックアップの暗号化に使用されます。  
テーブルを作成または更新するときは、テーブル用の KMS キーを選択します。テーブル用 KMS キーは、DynamoDB コンソールで、または [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) オペレーションを使用していつでも変更できます。キーの切り替えプロセスはシームレスであり、ダウンタイムやサービスの低下を必要としません。  
DynamoDB は、[対称 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)のみをサポートします。[非対称 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)を使用して DynamoDB テーブルを暗号化することはできません。
カスタマーマネージドキーを使用して次の機能を取得します。  
+ KMS キーを作成および管理します。これには、[キーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)および [IAM ポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)の設定、KMS キーへのアクセスを制御する[グラント](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)が含まれます。KMS キーの[有効化または無効化](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)、[自動キーローテーション](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)の有効化または無効化、使用しなくなった [KMS キーの削除](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)を実行できます。
+ [インポートされたキーマテリアル](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)を持つカスタマーマネージドキー、またはユーザーが所有して管理する[カスタムキーストア](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)で、カスタマーマネージドキーを使用できます。
+ DynamoDB テーブルの暗号化と復号を監査するには、 [AWS CloudTrail ログ](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail)で AWS KMS への DynamoDB API コールを調べます。
次のいずれかの機能が必要なときは、AWS マネージドキー を使用します。  
+ [KMS キーを表示し](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html)、[そのキーポリシーを表示](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-viewing.html)できます。(キーポリシーの変更はできません)。
+ DynamoDB テーブルの暗号化と復号を監査するには、 [AWS CloudTrail ログ](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail)で AWS KMS への DynamoDB API コールを調べます。
ただし、AWS 所有のキー は無料で、その使用は [AWS KMS リソースクォータまたはリクエストクォータ](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)に対してカウントされません。カスタマーマネージドキーおよび AWS マネージドキー には、API コールごとに[料金が発生](https://aws.amazon.com/kms/pricing/)し、これらの KMS キーには AWS KMS クォータが適用されます。

**テーブルキー**  
DynamoDB は、テーブルの KMS キーを使用して、*テーブルキー*と呼ばれるテーブルの一意の[データキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)を[生成](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)して暗号化します。テーブルキーは、暗号化されたテーブルの存続期間中は保持されます。  
テーブルキーは、キー暗号化キーとして使用されます。DynamoDB は、このテーブルキーを使用して、テーブルデータの暗号化に使用されるデータ暗号化キーを保護します。DynamoDB は、テーブル内の基礎となる各構造に対して一意のデータ暗号化キーを生成しますが、複数のテーブル項目が同じデータ暗号化キーで保護される場合があります。  

![\[保管時の暗号化で DynamoDB テーブルを暗号化する\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/service-ddb-encrypt.png)

暗号化されたテーブルに最初にアクセスすると、DynamoDB は、KMS キーを使用してテーブルキーを復号するリクエストを AWS KMS に送信します。その後、プレーンテキストテーブルキーを使用してデータ暗号化キーを復号化し、プレーンテキストデータ暗号化キーを使用してテーブルデータを復号化します。  
DynamoDB は AWS KMS の外部でテーブルキーとデータ暗号化キーを保存して使用します。これによって、[Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 暗号化および 256 ビット暗号化キーのすべてのキーが保護されます。続いて、暗号化されたキーを暗号化されたデータと一緒に保存します。これらのキーおよびデータは、必要なときにテーブルデータの暗号化に使用できます。  
テーブルの KMS キーを変更すると、DynamoDB は新しいテーブルキーを生成します。次に、新しいテーブルキーを使用してデータ暗号化キーの再暗号化が行われます。

**テーブルキーのキャッシュ**  
DynamoDB オペレーションごとに AWS KMS を呼び出さないように、DynamoDB は各呼び出しのプレーンテキストのテーブルキーをメモリにキャッシュします。DynamoDB では、キャッシュしたテーブルキーが 5 分間非アクティブ状態であった後にリクエストを取得すると、AWS KMS に新しいリクエストを送信してテーブルキーを復号します。この呼び出しは、テーブルキーの復号を求める前回のリクエスト以降に AWS KMS または AWS Identity and Access Management (IAM) で KMS キーのアクセスポリシーに加えられた変更をすべてキャプチャします。

## KMS キーの使用を認可する
<a name="dynamodb-kms-authz"></a>

DynamoDB テーブルを保護するために、アカウントで[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)または [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) を使用する場合は、その KMS キーのポリシーが DynamoDB に、ユーザーに代わってキーを使用する許可を付与する必要があります。DynamoDB の AWS マネージドキー の認可コンテキストには、そのキーポリシーとそれを使用するアクセス許可を委任するグラントが含まれます。

AWS マネージドキー はアカウントにあり、そのポリシーとグラントを表示できるため、カスタマーマネージドキーのポリシーとグラントを完全に制御することができます。ただし、AWS によって管理されているため、ポリシーを変更することはできません。

DynamoDB では、デフォルトの [AWS 所有のキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) を使用して AWS アカウント の DynamoDB テーブルを保護するための追加の認可は不要です。

**Topics**
+ [

### AWS マネージドキー のキーポリシー
](#dynamodb-policies)
+ [

### カスタマーマネージドキーのキーポリシー
](#dynamodb-customer-cmk-policy)
+ [

### グラントを使用した DynamoDB の承認
](#dynamodb-grants)

### AWS マネージドキー のキーポリシー
<a name="dynamodb-policies"></a>

DynamoDB は、[DynamoDB リソース](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)にアクセスしているユーザーの代わりに、暗号化オペレーションで DynamoDB (`aws/dynamodb`) の [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) を使用します。AWS マネージドキー のキーポリシーはアカウントのすべてのユーザーに、指定されたオペレーションで AWS マネージドキー を使用する許可を付与します。ただし、アクセス許可が付与されるのは、DynamoDB がユーザーの代わりにリクエストを行う場合のみです。キーポリシーの [ViaService 条件](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)では、リクエストが DynamoDB サービスで発生しない限り、ユーザーに AWS マネージドキー の使用を許可しません。

このキーポリシーは、すべての AWS マネージドキー のポリシーと同様に、AWS によって確立されます。このポリシーを変更することはできませんが、いつでも表示できます。詳細については、「[Viewing a key policy](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-viewing.html)」を参照してください。

このキーポリシーのポリシーステートメントには次の効果があります
+ リクエストがユーザーの代わりに DynamoDB から送信された場合、アカウントのユーザーが DynamoDB の AWS マネージドキー を暗号化オペレーションで使用することを許可します。また、このポリシーはユーザーに KMS キーの[グラントの作成](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)も許可します。
+ 認可された IAM がアカウントで DynamoDB の AWS マネージドキー のプロパティを表示し、DynamoDB の KMS キー使用を許可する[グラントを取り消す](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)ことができるようにします。DynamoDB は、継続的なメンテナンス操作に[グラント](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)を使用します。
+ DynamoDB が読み取り専用オペレーションを実行して、アカウントで DynamoDB の AWS マネージドキー を検索できるようにします。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "auto-dynamodb-1",
  "Statement" : [ {
    "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "*"
    },
    "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ],
    "Resource" : "*",
    "Condition" : {
      "StringEquals" : {
        "kms:CallerAccount" : "111122223333",
        "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com"
      }
    }
  }, {
    "Sid" : "Allow direct access to key metadata to the account",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ],
    "Resource" : "*"
  }, {
    "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly",
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "dynamodb.amazonaws.com"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ],
    "Resource" : "*"
  } ]
}
```

------

### カスタマーマネージドキーのキーポリシー
<a name="dynamodb-customer-cmk-policy"></a>

[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)を選択して DynamoDB テーブルを保護する際、DynamoDB は、選択を行うプリンシパルの代わりに KMS キーを使用するアクセス許可を取得します。そのプリンシパル、ユーザー、ロールは、DynamoDB に必要な KMS キーに対するアクセス許可を持っている必要があります。これらの許可は、[キーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM ポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)、または[グラント](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)で指定できます。

DynamoDB には、少なくとも、カスタマーマネージドキーに対する次のアクセス許可が必要です。
+ [kms:Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
+ [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)\$1 (for kms:ReEncryptFrom および kms:ReEncryptTo 向け)
+ kms:GenerateDataKey\$1 (for [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) および [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html) 向け)
+ [kms:DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms:CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

例えば、次のキーポリシーの例では、必要なアクセス許可のみを提供します。このポリシーには、以下の影響があります。
+ DynamoDB が、DynamoDB の使用許可を持つアカウントのプリンシパルの代わりに動作している場合にのみ、DynamoDB が暗号化オペレーションで KMS キーを使用し、グラントを作成することを許可します。ポリシーステートメントで指定されたプリンシパルに DynamoDB を使用する権限がない場合、呼び出しは DynamoDB サービスからのものであっても失敗します。
+  [KMS: viaService 条件キーでは、ポリシ](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) ーステートメントにリストされているプリンシパルの代わりに DynamoDB からリクエストが送信された場合にのみアクセス許可が許可されます。これらのプリンシパルは、これらのオペレーションを直接呼び出すことはできません。`kms:ViaService` の値である `dynamodb.*.amazonaws.com` は、リージョンの位置にアスタリスク (\$1) が付いていることに注意してください。DynamoDB では、クロスリージョン呼び出しを実行して [DynamoDB グローバルテーブル](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)をサポートできるように、特定の AWS リージョン から独立したアクセス許可が必要です。
+ KMS キー管理者 (`db-team` ロールを引き受けることができるユーザー) に、KMS キーへの読み取り専用アクセス許可、およびグラント (テーブルを保護するために [DynamoDB が必要とするグラント](#dynamodb-grants)を含む) を取り消す許可を付与します。

サンプルキーポリシーを使用する前に、サンプルプリンシパルを AWS アカウント の実際のプリンシパルに置き換えます。

------
#### [ JSON ]

****  

```
{
  "Id": "key-policy-dynamodb",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "*",      
      "Condition": { 
         "StringLike": {
           "kms:ViaService" : "dynamodb.*.amazonaws.com"
         }
      }
    },
    {
      "Sid":  "Allow administrators to view the KMS key and revoke grants",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/db-team"
       },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### グラントを使用した DynamoDB の承認
<a name="dynamodb-grants"></a>

キーポリシーに加えて、DynamoDB は DynamoDB (`aws/dynamodb`) のためにカスタマーマネージドキーまたは AWS マネージドキー の許可を設定するためのグラントを使用します。アカウントの KMS キーのグラントを表示するには、[ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作を使用します。DynamoDB では、[AWS 所有のキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) を使用してテーブルを保護するために、グラントや追加のアクセス許可は必要ありません。

DynamoDB は、バックグラウンドシステムメンテナンスと継続的なデータ保護タスクを実行するときに、許可を付与します。また、[テーブルキー](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-encrypt)の生成にグラントを使用します。

各グラントは、テーブルに固有です。アカウントに同じ KMS キーで暗号化された複数のテーブルがある場合、テーブルごとに各タイプのグラントがあります。グラントは、テーブル名と AWS アカウント ID を含む [DynamoDB 暗号化コンテキスト](#dynamodb-encryption-context)によって制約を受けます。また、グラントには、それが不要になった場合に[グラントを使用停止にする](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)許可が含まれます。

グラントを作成するには、DynamoDB に、暗号化されたテーブルを作成したユーザーに代わって `CreateGrant` を呼び出すための許可が必要です。AWS マネージドキー では、DynamoDB が認可されたユーザーの代わりにリクエストを行う場合にのみ、アカウントのユーザーに KMS キーで [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) の呼び出しを許可する[キーポリシー](#dynamodb-policies)からの `kms:CreateGrant` 許可を DynamoDB が取得します。

キーポリシーは、アカウントが KMS キーの[グラントを取り消す](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)ことも許可できます。ただし、アクティブな暗号化されたテーブルのグラントを取り消すと、DynamoDB はテーブルを保護および維持できなくなります。

## DynamoDB 暗号化コンテキスト
<a name="dynamodb-encryption-context"></a>

[暗号化コンテキスト](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)は、一連のキー値のペアおよび任意非シークレットデータを含みます。データを暗号化するリクエストに暗号化コンテキストを組み込むと、AWS KMS は暗号化コンテキストを暗号化されたデータに暗号化してバインドします。データを復号するには、同じ暗号化コンテキストに渡す必要があります。

DynamoDB は、すべての AWS KMS 暗号化オペレーションで同じ暗号化コンテキストを使用します。[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)または [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) を使用して DynamoDB テーブルを保護する場合、暗号化コンテキストを使用して監査レコードやログにおける KMS キーの使用を特定することができます。これは、[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) や [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) などのログにもプレーンテキストで表示されます。

また、暗号化コンテクストはポリシーとグラントの認可用の条件としても使用できます。DynamoDB は暗号化コンテキストを使用して、アカウントとリージョンのカスタマーマネージドキーまたは AWS マネージドキー へのアクセスを許可する[グラント](#dynamodb-grants)を制限します。

DynamoDB は AWS KMS へのリクエストで、2 つのキーバリューペアを持つ暗号化コンテキストを使用します。

```
"encryptionContextSubset": {
    "aws:dynamodb:tableName": "Books"
    "aws:dynamodb:subscriberId": "111122223333"
}
```
+ **テーブル** — 最初のキーと値のペアは、DynamoDB が暗号化しているテーブルを識別します。キーは、`aws:dynamodb:tableName` です。この値は、テーブルの名前です。

  ```
  "aws:dynamodb:tableName": "<table-name>"
  ```

  以下はその例です。

  ```
  "aws:dynamodb:tableName": "Books"
  ```
+ **アカウント** － 2 番目のキーバリューペアは、AWS アカウント を識別します。キーは、`aws:dynamodb:subscriberId` です。値は、アカウント ID です。

  ```
  "aws:dynamodb:subscriberId": "<account-id>"
  ```

  以下はその例です。

  ```
  "aws:dynamodb:subscriberId": "111122223333"
  ```

## DynamoDB の AWS KMS との対話をモニタリングする
<a name="dynamodb-cmk-trail"></a>

[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)または [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) を使用して DynamoDB テーブルを保護する場合は、AWS CloudTrail ログを使用して、DynamoDB がユーザーに代わって AWS KMS に送信するリクエストを追跡することができます。

このセクションでは、`GenerateDataKey`、`Decrypt`、および `CreateGrant` リクエストを説明します。さらに、DynamoDB は [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) オペレーションを使用して、選択した KMS キーがアカウントとリージョンに存在するかどうかを判断します。また、 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 操作を使用して、テーブルを削除するときにグラントを削除します。

**GenerateDataKey**  
テーブルで保存時の暗号化を有効にすると、DynamoDB は一意のテーブルキーを作成します。また、*[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)* リクエストを、テーブルの KMS キーを指定する AWS KMS に送信します。  
`GenerateDataKey` 演算を記録するイベントは、次のようなサンプルイベントになります。ユーザーは DynamoDB サービスアカウントです。パラメータには、KMS キーの Amazon リソースネーム (ARN)、256 ビットキーを必要とするキー指定子、テーブルと AWS アカウント を識別する[暗号化コンテキスト](#dynamodb-encryption-context)が含まれます。  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSService", 
        "invokedBy": "dynamodb.amazonaws.com" 
    },
    "eventTime": "2018-02-14T00:15:17Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "aws:dynamodb:tableName": "Services",
            "aws:dynamodb:subscriberId": "111122223333"
        }, 
        "keySpec": "AES_256", 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    "responseElements": null,
    "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190",
    "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333",
            "type": "AWS::KMS::Key" 
        } 
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333",
    "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad"
}
```

**Decrypt**  
暗号化された DynamoDB テーブルにアクセスする場合、DynamoDB はテーブルキーを復号化して、階層内でその下にあるキーを復号化できるようにする必要があります。次に、テーブル内のデータを復号化します。テーブルキーを復号化するには、次が実行されます。DynamoDB は、テーブルの KMS キーを指定する[復号](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)リクエストを AWS KMS に送信します。  
`Decrypt` 演算を記録するイベントは、次のようなサンプルイベントになります。ユーザーは、テーブルにアクセスしている AWS アカウント のプリンシパルです。パラメータには、暗号化されたテーブルキー (暗号化テキストの blob として)、およびテーブルと AWS アカウント を識別する[暗号化コンテキスト](#dynamodb-encryption-context)が含まれます。AWS KMS は、暗号化テキストから KMS キーの ID を取得します。  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:user01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T16:42:15Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDT3HGFQZX4RY6RU",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin" 
            }
        },
        "invokedBy": "dynamodb.amazonaws.com"
    },
    "eventTime": "2018-02-14T16:42:39Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": 
    {
        "encryptionContext":
        {
            "aws:dynamodb:tableName": "Books",
            "aws:dynamodb:subscriberId": "111122223333" 
        }
    }, 
    "responseElements": null, 
    "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5",
    "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", 
    "readOnly": true, 
    "resources": [ 
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        }
    ],
    "eventType": "AwsApiCall", 
    "recipientAccountId": "111122223333"
}
```

**CreateGrant**  
[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)または [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) を使用して DynamoDB テーブルを保護する場合、DynamoDB は[グラント](#dynamodb-grants)を使用して、サービスが継続的なデータ保護、メンテナンス、耐久性のタスクを実行できるようにします。これらのグラントは、[AWS 所有のキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) では不要です。  
DynamoDB が作成するグラントは、テーブルに固有です。[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) リクエストのプリンシパルは、テーブルを作成したユーザーです。  
`CreateGrant` 演算を記録するイベントは、次のようなサンプルイベントになります。パラメータには、テーブルの KMS キーの Amazon リソースネーム (ARN)、被付与者プリンシパルと使用停止プリンシパル (DynamoDB サービス)、グラントの対象となるオペレーションが含まれます。また、指定された[暗号化コンテキスト](#dynamodb-encryption-context)を使用するすべての暗号化オペレーションを必要とする制約も含まれています。  

```
{ 
    "eventVersion": "1.05", 
    "userIdentity": 
    { 
        "type": "AssumedRole", 
        "principalId": "AROAIGDTESTANDEXAMPLE:user01", 
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", 
        "accountId": "111122223333", 
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
        "sessionContext": { 
            "attributes": { 
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T00:12:02Z" 
            }, 
            "sessionIssuer": { 
                "type": "Role", 
                "principalId": "AROAIGDTESTANDEXAMPLE", 
                "arn": "arn:aws:iam::111122223333:role/Admin", 
                "accountId": "111122223333", 
                "userName": "Admin" 
            }
        }, 
        "invokedBy": "dynamodb.amazonaws.com" 
    }, 
    "eventTime": "2018-02-14T00:15:15Z", 
    "eventSource": "kms.amazonaws.com", 
    "eventName": "CreateGrant", 
    "awsRegion": "us-west-2", 
    "sourceIPAddress": "dynamodb.amazonaws.com", 
    "userAgent": "dynamodb.amazonaws.com", 
    "requestParameters": { 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab", 
        "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "constraints": { 
            "encryptionContextSubset": {
                "aws:dynamodb:tableName": "Books",
                "aws:dynamodb:subscriberId": "111122223333" 
            } 
        }, 
        "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "operations": [ 
            "DescribeKey", 
            "GenerateDataKey", 
            "Decrypt", 
            "Encrypt", 
            "ReEncryptFrom", 
            "ReEncryptTo", 
            "RetireGrant" 
        ] 
    }, 
    "responseElements": { 
        "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" 
    }, 
    "requestID": "2192b82a-111c-11e8-a528-f398979205d8", 
    "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", 
    "readOnly": false, 
    "resources": [ 
        { 
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        } 
    ], 
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}
```

# DynamoDB での暗号化テーブルの管理
<a name="encryption.tutorial"></a>

AWS マネジメントコンソール または AWS Command Line Interface (AWS CLI) を使用すると、新しいテーブルで暗号化キーを指定し、Amazon DynamoDB の既存のテーブルで暗号化キーを更新できます。

**Topics**
+ [

## 新しいテーブルの暗号化キーを指定する
](#encryption.tutorial-creating)
+ [

## 暗号化キーの更新
](#encryption.tutorial-update)

## 新しいテーブルの暗号化キーを指定する
<a name="encryption.tutorial-creating"></a>

Amazon DynamoDB コンソールまたは AWS CLI を使用して新しいテーブルで暗号化キーを指定するには、以下の手順に従います。

### 暗号化されたテーブルの作成 (コンソール)
<a name="encryption.tutorial-console"></a>

1. AWS マネジメントコンソール にサインインして DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

1.  コンソールの左側のナビゲーションペインで、**[テーブル]** を選択します。

1. **[Create Table]** (テーブルの作成) を選択します。**[Table name]** (テーブル名) に「**Music**」と入力します。プライマリキーに「**Artist**」と入力し、ソートキーに「**SongTitle**」をそれぞれ文字列として入力します。

1. **[Settings]** (設定) では、**[Customize settings]** (設定のカスタマイズ) が選択されていることを確認してください。
**注記**  
**[Use default settings]** (デフォルト設定の使用) を選択した場合、テーブルは AWS 所有のキー を使用して保管時に暗号化され、追加コストはかかりません。

1. **[Encryption at rest]** (保管時の暗号化) で、暗号化タイプ – AWS 所有のキー、AWS マネージドキー、またはカスタマーマネージドキーを選択します。
   +  **[Owned by Amazon DynamoDB]** (Amazon DynamoDB が所有)。AWS が所有するキーで、特に DynamoDB が所有および管理します。このキーは追加料金なしで使用されます。
   + **AWS マネージドキー**。キーエイリアス: `aws/dynamodb`。キーはアカウントに保存され、AWS Key Management Service (AWS KMS) によって管理されます (AWS KMS の料金が適用されます)。
   +  **[Stored in your account, and owned and managed by you.] (アカウントに保存され、お客様が所有および管理。**) カスタマーマネージドキー。キーはアカウントに保存され、AWS Key Management Service (AWS KMS) によって管理されます (AWS KMS の料金が適用されます)。
**注記**  
独自のキーを所有および管理することを選択した場合は、KMS キーポリシーが適切に設定されていることを確認してください。例を含む詳細については、「[カスタマーマネージドキーのキーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)」を参照してください。

1. **[Create table]** (テーブルの作成) を選択して暗号化テーブルを作成します。暗号化タイプを確認するには、**[Overview]** (概要) タブのテーブルの詳細を選択し、**[Additional details]** (その他の詳細) セクションを表示します。

### 暗号化されたテーブルの作成 (AWS CLI)
<a name="encryption.tutorial-cli"></a>

AWS CLI により、Amazon DynamoDB のデフォルトの AWS 所有のキー、AWS マネージドキー、またはカスタマーマネージドキーを使用してテーブルを作成します。

**デフォルトの AWS 所有のキー で暗号化テーブルを作成するには**
+ 暗号化された `Music` テーブルを次のとおりに作成します。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5
  ```
**注記**  
このテーブルは、DynamoDB サービスアカウントでデフォルトの AWS 所有のキー を使用して暗号化されます。

**AWS マネージドキー で DynamoDB 用の暗号化テーブルを作成するには**
+ 暗号化された `Music` テーブルを次のとおりに作成します。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS
  ```

   テーブルの説明の `SSEDescription` ステータスは、`ENABLED` に設定され、`SSEType` は `KMS` になります。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**カスタマーマネージドキーで DynamoDB 用の暗号化テーブルを作成するには**
+ 暗号化された `Music` テーブルを次のとおりに作成します。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**注記**  
`KMSMasterKeyId` の場合、キー ID、キー ARN、またはキーエイリアスを使用できます。キーエイリアス (`alias/my-key` など) を使用する場合、DynamoDB はエイリアスを解決し、基盤となる AWS KMS キーをテーブルに関連付けます。テーブルの説明では、`KMSMasterKeyArn` はエイリアスではなく、解決されたキーのキー ARN を常に表示します。キー識別子の詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[キー識別子 (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)」を参照してください。

   テーブルの説明の `SSEDescription` ステータスは、`ENABLED` に設定され、`SSEType` は `KMS` になります。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

## 暗号化キーの更新
<a name="encryption.tutorial-update"></a>

DynamoDB コンソールまたは AWS CLI を使用して、AWS 所有のキー、AWS マネージドキー、カスタマーマネージドキーの間でいつでも既存のテーブルの暗号化キーを更新することができます。

### 暗号化キーの更新 (コンソール)
<a name="encryption.tutorial-update-console"></a>

1. AWS マネジメントコンソール にサインインして DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

1.  コンソールの左側のナビゲーションペインで、**[テーブル]** を選択します。

1. 更新するテーブルを選択します。

1. **[Actions]** (アクション) ドロップダウンを選択し、**[Update settings]** (設定の更新) オプションを選択します。

1. **[Additional settings]** (追加設定) タブに移動します。

1. **[Encryption]** (暗号化) の下の、**[Manage encryption]** (暗号化の管理) を選択します。

1. 暗号化タイプを選択します。
   +  **[Owned by Amazon DynamoDB.] (Amazon DynamoDB によって所有される。**) AWS KMS キーは DynamoDB によって所有、管理されます。このキーは追加料金なしで使用されます。
   + **AWS マネージドキー**のキーエイリアス: `aws/dynamodb`。キーはアカウントに保存され、AWS Key Management Service (AWS KMS) によって管理されます (AWS KMS の料金が適用されます)。
   +  **[Stored in your account, and owned and managed by you.] (アカウントに保存され、ユーザーが所有、管理される。**) キーはアカウントに保存され、AWS Key Management Service (AWS KMS) によって管理されます (AWS KMS の料金が適用されます)。
**注記**  
独自のキーを所有および管理することを選択した場合は、KMS キーポリシーが適切に設定されていることを確認してください。詳細については、「[カスタマーマネージドキーのキーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)」を参照してください。

   続いて、**[Save]** (保存) を選択して暗号化されたテーブルを更新します。暗号化タイプを確認するには、[**概要**] タブでテーブルの詳細を参照します。

### 暗号化キーの更新 (AWS CLI)
<a name="encryption.tutorial-update-cli"></a>

次の例は、AWS CLI を使用して暗号化テーブルを更新する方法を示しています。

**デフォルトの AWS 所有のキー で暗号化テーブルを更新するには**
+ 暗号化された `Music` テーブルを次の例のとおりに更新します。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=false
  ```
**注記**  
このテーブルは、DynamoDB サービスアカウントでデフォルトの AWS 所有のキー を使用して暗号化されます。

**DynamoDB 用の AWS マネージドキー で暗号化テーブルを更新するには**
+ 暗号化された `Music` テーブルを次の例のとおりに更新します。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true
  ```

   テーブルの説明の `SSEDescription` ステータスは、`ENABLED` に設定され、`SSEType` は `KMS` になります。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**DynamoDB のカスタマーマネージドキーで暗号化テーブルを更新するには**
+ 暗号化された `Music` テーブルを次の例のとおりに更新します。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**注記**  
`KMSMasterKeyId` の場合、キー ID、キー ARN、またはキーエイリアスを使用できます。キーエイリアス (`alias/my-key` など) を使用する場合、DynamoDB はエイリアスを解決し、基盤となる AWS KMS キーをテーブルに関連付けます。テーブルの説明では、`KMSMasterKeyArn` はエイリアスではなく、解決されたキーのキー ARN を常に表示します。

   テーブルの説明の `SSEDescription` ステータスは、`ENABLED` に設定され、`SSEType` は `KMS` になります。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```