

# 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"
}
```