

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# DynamoDB 靜態加密使用須知
<a name="encryption.usagenotes"></a>

在您使用 Amazon DynamoDB 中靜態加密時請考量以下項目。

## 所有資料表資料都會加密
<a name="encryption.usagenotes.tabledata"></a>

已對所有 DynamoDB 資料表資料啟用伺服器端靜態加密，且無法停用。您無法僅加密資料表中的項目子集。

只有持久性儲存媒體上的資料是靜態 (靜止) 時，靜態加密才會加密資料。如果對傳輸中資料或使用中資料有資料安全性的疑慮，您可能需要進行額外的措施：
+ 傳輸中的資料：DynamoDB 中的所有資料都是在傳輸中加密的。根據預設，與 DynamoDB 之間的通訊會使用 HTTPS 協定，其使用 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) 加密保護網路流量。
+ 使用中資料：在將資料傳送至 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>

**注意**  
Global Table 版本 2017 不支援客戶自管金鑰。如果要在 DynamoDB Global Table 中使用客戶自管金鑰，則需要將資料表升級為 Global Table 版本 2019，然後將其啟用。

在 上 AWS 管理主控台，加密類型是當您使用 AWS 受管金鑰 或客戶受管金鑰來加密資料`KMS`時。使用 AWS 擁有的金鑰時，加密類型為 `DEFAULT`。在 Amazon DynamoDB API 中，加密類型是當您使用 AWS 受管金鑰 或客戶受管金鑰`KMS`時。在缺少加密類型的情況下，會使用 AWS 擁有的金鑰來加密資料。您可以隨時在 AWS 擁有的金鑰 AWS 受管金鑰和客戶受管金鑰之間切換。您可以使用 主控台、 AWS Command Line Interface (AWS CLI) 或 Amazon DynamoDB API 來切換加密金鑰。

請注意，使用客戶自管金鑰時有下列限制：
+ 您無法搭配 DynamoDB Accelerator (DAX) 叢集使用客戶自管金鑰。如需詳細資訊，請參閱 [DAX 靜態加密](DAXEncryptionAtRest.md)。
+ 您可以使用客戶自管金鑰來加密使用交易的資料表。不過，為了確保交易傳播的持久性，服務會暫時儲存交易請求的副本，並使用 AWS 擁有的金鑰進行加密。資料表和次要索引中已遞交的資料一律會使用客戶自管金鑰進行靜態加密。
+ 您可以使用客戶自管金鑰來加密使用 Contributor Insights 的資料表。不過，傳輸至 的資料 Amazon CloudWatch 會使用 加密 AWS 擁有的金鑰。
+ 當您轉換到新的客戶受管金鑰時，請務必保持啟用原始金鑰，直到程序完成為止。 AWS 仍然需要原始金鑰來解密資料，才能使用新的金鑰進行加密。當資料表的 SSE 描述狀態為「啟用」，且顯示新客戶自管金鑰的 KMSMasterKeyArn 時，程序就會完成。此時可以停用或排程刪除原始金鑰。
+ 顯示新的客戶自管金鑰後，資料表和任何新的隨需備份都會使用新的金鑰加密。
+ 任何現有的隨需備份都會使用建立備份時使用的客戶自管金鑰進行加密。您將需要相同的金鑰來還原這些備份。您可以使用 DescribeBackup API 來檢視該備份的 SSE 描述，識別建立每個備份的期間的金鑰。
+ 如果您停用客戶自管金鑰或排定其刪除的時間，所有在 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 會使用相同的金鑰階層來保護 DynamoDB 串流、全域資料表和備份。

我們建議您先規劃加密策略，再於 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 服務帳戶中建立和管理的多租用戶加密金鑰。但是，您可以使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 AWS 帳戶中 DynamoDB (`aws/dynamodb`) 加密您的 DynamoDB 資料表。您可以為每個資料表選取不同的 KMS 金鑰。您為資料表選取的 KMS 金鑰也會用來加密其本機和全域次要索引、串流和備份。  
建立或更新資料表時，您可以選取資料表的 KMS 金鑰。您可以隨時在 DynamoDB 主控台或使用 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) 操作變更資料表的 KMS 金鑰。切換金鑰的程序是無縫的，且不需要停機時間或降低服務效能。  
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)和[授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)來控制對 KMS 金鑰的存取。您可以[啟用和停用](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html) KMS 金鑰、啟用和停用[自動金鑰輪換](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)中的客戶自管金鑰。
+ 您可以在 [AWS CloudTrail 日誌](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail) AWS KMS 中檢查對 的 DynamoDB API 呼叫，以稽核 DynamoDB 資料表的加密和解密。
 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)。(您無法變更金鑰政策。)
+ 您可以在[AWS CloudTrail 日誌](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail) AWS KMS 中檢查對 的 DynamoDB API 呼叫，以稽核 DynamoDB 資料表的加密和解密。
不過， AWS 擁有的金鑰 是免費的，其使用不會計入[AWS KMS 資源或請求配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。客戶受管金鑰和 會針對每個 API AWS KMS 呼叫 AWS 受管金鑰 [產生費用](https://aws.amazon.com/kms/pricing/)，而配額適用於這些 KMS 金鑰。

**資料表金鑰**  
DynamoDB 對資料表使用 KMS 金鑰來為資料表[產生](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)和加密唯一的[資料金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)，稱為*資料表金鑰*。資料表金鑰會在加密資料表的生命週期內持續存在。  
資料表金鑰用作金鑰加密金鑰。DynamoDB 使用此資料表金鑰來保護用於加密資料表資料的資料加密金鑰。DynamoDB 會為資料表中的每個基礎結構產生唯一的資料加密金鑰，但多個資料表項目可能受到相同的資料加密金鑰保護。  

![\[使用靜態加密來加密 DynamoDB 資料表\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/service-ddb-encrypt.png)

當您第一次存取加密的資料表時，DynamoDB 會傳送請求給 AWS KMS ，以使用 KMS 金鑰來解密資料表金鑰。然後，它使用純文字資料表金鑰來解密資料加密金鑰，並使用純文字資料加密金鑰來解密資料表資料。  
DynamoDB 會存放並使用 外部的資料表金鑰和資料加密金鑰 AWS KMS。它使用[進階加密標準](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 加密和 256 位元加密金鑰來保護所有金鑰。然後，它會將加密金鑰與加密資料一起存放，以便這些資料可用來隨需解密資料表。  
如果您變更了資料表的 KMS 金鑰，DynamoDB 便會產生新的資料表金鑰。然後，使用新的資料表金鑰來重新加密資料加密金鑰。

**資料表金鑰快取**  
為了避免 AWS KMS 針對每個 DynamoDB 操作呼叫 ，DynamoDB 會快取記憶體中每個呼叫者的純文字資料表金鑰。如果 DynamoDB 在閒置五分鐘後收到快取資料表金鑰的請求，則會將新的請求傳送至 AWS KMS 以解密資料表金鑰。此呼叫將擷取自上次請求解密資料表金鑰以來，對 或 AWS Identity and Access Management (IAM) 中 AWS KMS KMS 金鑰存取政策所做的任何變更。

## 授權使用您的 KMS 金鑰
<a name="dynamodb-kms-authz"></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 資料表，該 KMS 金鑰的政策必須允許 DynamoDB 代您使用該金鑰。 AWS 受管金鑰 適用於 DynamoDB 的 上的授權內容包含其金鑰政策和授予，以委派使用它的許可。

您可以完全控制客戶自管金鑰的政策和授予，因為 AWS 受管金鑰 在您的帳戶中，您可以檢視其政策和授予。但是，由於由 管理 AWS，您無法變更政策。

DynamoDB 不需要額外的授權，即可使用預設值[AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)來保護您 中的 DynamoDB 資料表 AWS 帳戶。

**Topics**
+ [的金鑰政策 AWS 受管金鑰](#dynamodb-policies)
+ [客戶自管金鑰的金鑰政策](#dynamodb-customer-cmk-policy)
+ [使用授予來授權 DynamoDB](#dynamodb-grants)

### 的金鑰政策 AWS 受管金鑰
<a name="dynamodb-policies"></a>

當 DynamoDB 在密碼編譯操作中使用適用於 DynamoDB (`aws/dynamodb`) 的 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 時，它是代表正在存取 [DynamoDB 資源](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)的使用者進行這項操作。上的金鑰政策 AWS 受管金鑰 提供帳戶中所有使用者使用 AWS 受管金鑰 進行指定操作的許可。但是，只有在 DynamoDB 代表使用者提出請求時才會授予許可。除非請求源自 DynamoDB 服務， AWS 受管金鑰 否則金鑰政策中的 [ViaService 條件](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)不允許任何使用者使用 。

此金鑰政策與所有政策一樣 AWS 受管金鑰，是由 建立 AWS。您不能改變它，但可以隨時檢視它。如需詳細資訊，請參閱[檢視金鑰政策](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-viewing.html)。

金鑰政策中的政策陳述式具有下列效果：
+ 當請求來自 DynamoDB 時，允許帳戶中的使用者在密碼編譯操作中使用 AWS 受管金鑰 適用於 DynamoDB 的 。此政策也允許使用者為 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 執行唯讀操作，在您的帳戶中尋找 AWS 受管金鑰 適用於 DynamoDB 的 。

------
#### [ 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 金鑰。該主體 (使用者或角色) 必須在 KMS 金鑰上擁有 DynamoDB 需要的許可。您可以在[金鑰政策](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 (適用於 kms:ReEncryptFrom and kms:ReEncryptTo)
+ kms:GenerateDataKey\$1 (適用於 [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 在密碼編譯操作中使用 KMS 金鑰並建立授予，但只有在其代替具備使用 DynamoDB 許可帳戶中的主體時才能進行。如果政策陳述式中指定的主體沒有使用 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 需要獨立於任何特定 的許可， AWS 區域 才能進行跨區域呼叫以支援 [DynamoDB 全域資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)。
+ 給予 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 會使用授予在客戶自管金鑰或 AWS 受管金鑰 for DynamoDB (`aws/dynamodb`) 上設定許可。若要檢視您帳戶中 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 金鑰加密的多個資料表，則每個資料表有每一種類型的授予。授予受到 [DynamoDB 加密內容](#dynamodb-encryption-context)的限制，其中包含資料表名稱和 AWS 帳戶 ID，並包含不再需要的淘[汰授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)的許可。

如要建立授予，DynamoDB 必須擁有代替建立加密資料表使用者呼叫 `CreateGrant` 的許可。對於 AWS 受管金鑰，DynamoDB 會從[金鑰政策](#dynamodb-policies)取得`kms:CreateGrant`許可，這允許帳戶使用者只有在 DynamoDB 代表授權使用者提出請求時，才對 KMS 金鑰呼叫 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)。

金鑰政策也會允許帳戶[撤銷 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)。

在其對 的請求中 AWS KMS，DynamoDB 使用具有兩個鍵/值對的加密內容。

```
"encryptionContextSubset": {
    "aws:dynamodb:tableName": "Books"
    "aws:dynamodb:subscriberId": "111122223333"
}
```
+ **資料表** – 第一個鍵值對會識別 DynamoDB 正在加密的資料表。金鑰為 `aws:dynamodb:tableName`。值是資料表的名稱。

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

  例如：

  ```
  "aws:dynamodb:tableName": "Books"
  ```
+ **帳戶** – 第二個鍵值對會識別 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)* 請求傳送至 AWS KMS ，以指定資料表的 KMS 金鑰。  
記錄 `GenerateDataKey` 操作的事件類似於以下範例事件。使用者是 DynamoDB 服務帳戶。參數包括秘密 KMS 金鑰的 Amazon Resource Name (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"
}
```

**解密**  
當您存取加密的 DynamoDB 資料表時，DynamoDB 需要解密資料表金鑰以便解密階層下方的金鑰。然後解密資料表中的資料。解密資料表金鑰。DynamoDB 會將[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求傳送至 AWS KMS ，以指定資料表的 KMS 金鑰。  
記錄 `Decrypt` 操作的事件類似於以下範例事件。使用者是您存取資料表的委託 AWS 帳戶 人。這些參數包括加密的資料表金鑰 （做為加密文字 Blob)，以及識別資料表和 的[加密內容](#dynamodb-encryption-context) AWS 帳戶。 會從加密文字 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 Resource Name (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"
}
```