

# 静态 DynamoDB 加密
<a name="EncryptionAtRest"></a>

Amazon DynamoDB 中存储的所有用户数据在静态状态下进行完全加密。DynamoDB 静态加密使用存储在 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 中的加密密钥，对所有静态数据加密，增强安全性。此功能减少保护敏感数据时涉及的操作负担和复杂性。利用静态加密，可以构建符合严格加密合规性和法规要求的安全敏感型应用程序。

如果数据存储在耐用介质中，DynamoDB 静态加密可提供额外的数据保护，始终保护加密表中的数据 — 包括主键、本地和全局二级索引、流、全局表、备份和 DynamoDB Accelerator (DAX) 集群。组织政策、行业或政府法规以及合规性需求通常要求使用静态加密增强数据安全性。有关数据库应用程序加密的更多信息，请参阅[AWS 数据库加密 SDK](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 概念](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 费用）。

有关密钥类型的更多信息，请参阅 [客户密钥和 AWS 密钥](/kms/latest/developerguide/concepts.html#key-mgmt)。

**注意**  
创建启用静态加密的新 DAX 集群时，将使用 AWS 托管式密钥 加密集群中的静态数据。
如果表具有排序键，则标记范围边界的一些排序键将以明文形式存储在表元数据中。

访问加密表时，DynamoDB 会以透明方式解密表数据。无需更改任何代码或应用程序即可使用或管理加密表。DynamoDB 继续提供您预期的个位数毫秒级延迟，所有 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)。

所有 AWS 区域提供 DynamoDB 静态加密，包括 AWS 中国（北京）和 AWS 中国（宁夏）区域以及 AWS GovCloud（美国）区域。有关更多信息，请参阅[DynamoDB 静态加密：工作原理](encryption.howitworks.md)和[DynamoDB 静态加密使用注意事项](encryption.usagenotes.md)。

# DynamoDB 静态加密：工作原理
<a name="encryption.howitworks"></a>

Amazon DynamoDB 静态加密使用 256 位高级加密标准 (AES-256) 加密数据，防止未经授权访问基础存储，帮助保护您的数据。

静态加密集成 AWS Key Management Service (AWS KMS)，管理用于加密表的加密密钥。

**注意**  
2022 年 5 月，AWS KMS 将 AWS 托管式密钥 的轮换时间表从每三年（约 1095 天）更改为每年（约 365 天）。  
新的 AWS 托管式密钥 在创建一年后自动轮换，此后大约每年轮换一次。  
现有的 AWS 托管式密钥 在他们最近一次轮换一年后自动轮换，此后每年轮换一次。

## 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 托管式密钥 是由与 AWS KMS集成的 AWS 服务代表您在账户中创建、管理和使用的 KMS 密钥。您可以查看账户中的 AWS 托管式密钥、查看其密钥策略以及在 AWS CloudTrail 日志中审核其使用情况。但是无法管理这些 KMS 密钥或更改其权限。

静态加密自动集成 AWS KMS，管理用于加密表的针对 DynamoDB (`aws/dynamodb`) 的 AWS 托管式密钥。如果创建加密 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 策略和授权；启用和禁用它们；轮换加密材料；添加标签；创建用于引用的别名；以及计划删除。有关管理客户自主管理型密钥的权限的更多信息，请参阅 [Customer managed keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

如果指定客户托管密钥作为表级加密密钥，DynamoDB 表、本地和全局二级索引以及流将使用同一客户托管密钥加密。按需备份使用创建备份时指定的表级加密密钥进行加密。更新表级加密密钥不会更改与现有按需备份关联的加密密钥。

将客户托管密钥的状态设置为禁用或计划删除，将使所有用户和 DynamoDB 服务无法加密或解密数据以及对表执行读写操作。DynamoDB 必须有权访问加密密钥，确保您可以继续访问表并防止数据丢失。

如果禁用客户托管密钥或计划删除，则表状态将变为**无法访问**。为了确保可以继续使用表，必须在七天内提供对指定加密密钥的 DynamoDB 访问权限。一旦服务检测到您的加密密钥无法访问，DynamoDB 会立即向您发送电子邮件通知以提醒您。

**注意**  
如果 DynamoDB 服务无法访问客户托管密钥超过七天，则表将被存档，无法再访问。DynamoDB 为表创建按需备份，并收取费用。可以使用此按需备份将数据还原到新表。要还原，必须启用表上最后一个客户托管密钥，DynamoDB 必须具有访问权限。
如果用于加密全局表副本的客户托管密钥无法访问，DynamoDB 将从副本组删除此副本。检测到客户托管密钥无法访问 20 小时后，副本将不会被删除，停止从该区域复制。

有关更多信息，请参阅 [启用密钥](/kms/latest/developerguide/enabling-keys.html) 和 [删除密钥](/kms/latest/developerguide/deleting-keys.html)。

## 使用 AWS 托管式密钥 的注意事项
<a name="managed-key-notes"></a>

Amazon DynamoDB 无法读取表数据，除非可以访问 AWS KMS 账户中存储的 KMS 密钥。DynamoDB 使用封装加密和密钥层次结构加密数据。您的 AWS KMS 加密密钥用于加密此密钥层次结构的根密钥。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[信封加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。

 DynamoDB 不会为每个 DynamoDB 操作调用 AWS KMS。每 5 分钟为每个有活跃流量的调用方刷新一次密钥。

确保您配置 SDK 反复使用连接。否则，将遇到 DynamoDB 延迟，必须为每个 DynamoDB 操作重新建立新的 AWS KMS 缓存条目。此外，可能需要面对更高 AWS KMS 和 CloudTrail 成本。例如，要使用 Node.js SDK 执行此操作，可以创建开启 `keepAlive` 的新 HTTPS 代理。有关更多信息，请参阅《适用于 JavaScript 的 AWS SDK 开发人员指南》**的[在 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 的通信将使用 HTTPS 协议，通过安全套接字层 (SSL)/传输层安全性 (TLS) 加密保护网络流量。
+ 正在使用的数据：在将数据发送到 DynamoDB 之前，使用客户端加密保护数据。有关更多信息，请参阅《Amazon DynamoDB Encryption Client 开发人员指南》**中的[客户端和服务器端加密](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/client-server-side.html)。

可以将流与加密表一起使用。DynamoDB 流始终使用表级加密密钥进行加密。有关更多信息，请参阅 [将更改数据捕获用于 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 Accelerator (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 使用相同的密钥层次结构来保护这些对象。

建议您在 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 服务账户中创建并管理的多租户加密密钥。但是，您也可以使用 AWS 账户 中的用于 DynamoDB (`aws/dynamodb`) 的[客户管理的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)来加密 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)和[授权](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 密钥不再使用时[删除 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)。客户托管密钥和 AWS 托管式密钥 针对每个 API 调用会[产生费用](https://aws.amazon.com/kms/pricing/)，并且 AWS KMS 配额适用于这些 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_cn/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 会生成新的表密钥。然后，它使用新的表密钥来重新加密数据加密密钥。

**表密钥缓存**  
为了避免针对每个 DynamoDB 操作调用 AWS KMS，DynamoDB 会针对每个调用方将明文表密钥缓存在内存中。如果 DynamoDB 在处于不活动状态 5 分钟后获取缓存表密钥的请求，它会向 AWS KMS 发送新请求以解密表密钥。此调用将捕获自上次请求解密表密钥以来对 AWS KMS 或 AWS Identity and Access Management (IAM) 中的 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 代表您使用该 KMS 密钥的权限。适用于 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 (`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 代表用户提出请求时才被授予。密钥策略中的 [ViaService 条件](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)不允许任何用户使用 AWS 托管式密钥，除非请求是通过 DynamoDB 服务发起的。

与所有 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 托管式密钥 的属性，并[撤销](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)允许 DynamoDB 使用 KMS 密钥的授权。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)中提供这些权限。

KMS 密钥 对客户托管密钥至少需要具备以下权限：
+ [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 和 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 还使用授权来设置适用于 DynamoDB 的客户托管式密钥或 AWS 托管式密钥 的权限 (`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)* 请求发送到指定表 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 将 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 请求发送到指定表 KMS 密钥的 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. 选择**创建表**。对于**表名称**，输入 **Music**。对于主键，输入 **Artist**；对于排序键，输入 **SongTitle**，两者均为字符串。

1. 在**设置**中，请确保选中了**自定义设置**。
**注意**  
如果选择**使用默认设置**，将使用 AWS 拥有的密钥 对表进行静态加密，不另行收费。

1. 在**静态加密**下，选择一种加密类型 - AWS 拥有的密钥、AWS 托管式密钥 或客户管理的密钥。
   +  **归 Amazon DynamoDB 所有**。AWS 拥有的密钥，具体来说，归 DynamoDB 所拥有和管理。使用此密钥不会产生额外的费用。
   + **AWS 管理的密钥**。密钥别名：`aws/dynamodb`。密钥存储在您的账户中，由 AWS Key Management Service（AWS KMS）托管。会产生 AWS KMS 费用。
   +  **存储在您的账户中，由您自行拥有和管理。**客户管理的密钥。密钥存储在您的账户中，由 AWS Key Management Service（AWS KMS）托管。会产生 AWS KMS 费用。
**注意**  
如果您选择自行拥有和管理密钥，请确保正确设置 KMS 密钥策略。有关更多信息，包括示例，请参阅[客户管理的密钥的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

1. 选择**创建表**以创建加密表。要确认加密类型，请选择**概述**选项卡并查看**其他详细信息**部分。

### 创建加密表（AWS CLI）
<a name="encryption.tutorial-cli"></a>

使用 AWS CLI 创建一个表，具有默认的 AWS 拥有的密钥、AWS 托管式密钥 或适用于 Amazon DynamoDB 的客户托管密钥。

**创建包含默认 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 拥有的密钥 加密此表。

**创建包含适用于 DynamoDB 的 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 \
    --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. 选择**操作**下拉菜单，然后选择**更新设置**选项。

1. 转至**其他设置**选项卡。

1. 在**加密**下，选择**管理加密**。

1. 选择一个加密类型：
   +  **归 Amazon DynamoDB 所有。**AWS KMS 密钥由 DynamoDB 拥有和管理。使用此密钥不会产生额外的费用。
   + **AWS 管理的密钥** 密钥别名：`aws/dynamodb`。密钥存储在您的账户中，由 AWS Key Management Service（AWS KMS）托管。会产生 AWS KMS 费用。
   +  **存储在您的账户中，由您自行拥有和管理。**密钥存储在您的账户中，由 AWS Key Management Service（AWS KMS）托管。会产生 AWS KMS 费用。
**注意**  
如果您选择自行拥有和管理密钥，请确保正确设置 KMS 密钥策略。有关更多信息，请参阅[客户管理型密钥的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

   然后，选择**保存**更新加密表。要确认加密类型，请检查**概述**选项卡下的表详细信息。

### 更新加密密钥（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",
  }
  ```