

# DynamoDB 预防性安全最佳实践
<a name="best-practices-security-preventative"></a>

以下最佳实践可帮助您预测和预防 Amazon DynamoDB 中的安全事件。

**静态加密**  
DynamoDB 使用 [Amazon Key Management Service (Amazon KMS)](https://www.amazonaws.cn/kms/) 存储的加密密钥，静态加密表、索引、流和备份中存储的所有用户数据。保护您的数据免受未经授权访问，为基础存储提供额外一层数据保护。  
可以指定 DynamoDB 是否应使用 Amazon 拥有的密钥（默认加密类型）、Amazon 托管式密钥 或客户托管密钥加密用户数据。有关更多信息，请参阅 [Amazon DynamoDB 静态加密](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/EncryptionAtRest.html)。

**使用 IAM 角色对 DynamoDB 的访问进行身份验证**  
对于访问 DynamoDB 的用户、应用程序和其他 Amazon 服务，必须在 Amazon API 请求中包含有效 Amazon 凭证。不应直接在应用程序或 EC2 实例中存储 Amazon 凭证。这些长期凭证不会自动轮换，如果外泄，可能造成重大业务影响。利用 IAM 角色，可以获得临时访问密钥，用于访问 Amazon 服务和资源。  
有关更多信息，请参阅 [适用于 Amazon DynamoDB 的 Identity and Access Management](security-iam.md)。

**使用 IAM 策略进行 DynamoDB 基本授权**  
授予权限时，决定谁获得权限，获得哪些 DynamoDB API 的权限，以及允许对这些资源执行的具体操作。实施最低权限对于减小安全风险以及错误或恶意意图造成的影响至关重要。  
将权限策略附加到 IAM 身份（即用户、组和角色），从而授予对 DynamoDB 资源执行操作的权限。  
可以通过以下方法实现：  
+ [Amazon 托管（预定义）策略](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/using-identity-based-policies.html#access-policy-examples-aws-managed)
+ [客户管理型策略](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/using-identity-based-policies.html#access-policy-examples-for-sdk-cli)

**使用 IAM 策略条件进行精细访问控制**  
在 DynamoDB 中授予权限时，可以指定条件，决定权限策略生效方式。实施最低权限对于减小安全风险以及错误或恶意意图造成的影响至关重要。  
使用 IAM 策略授予权限时，可以指定条件。例如，可以：  
+ 授予权限，允许用户只读访问表或二级索引的特定项目和属性。
+ 根据用户身份授予权限，允许用户只写访问表的特定属性。
 有关更多信息，请参见[使用 IAM 策略条件进行精细访问控制](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/specifying-conditions.html)。

**使用 VPC 终端节点和策略访问 DynamoDB**  
如果只需从虚拟私有云 (VPC) 访问 DynamoDB，应使用 VPC 终端节点限制仅来自所需 VPC 的访问。这样可以防止流量穿越开放 Internet 并受到该环境的限制。  
对 DynamoDB 使用 VPC 终端节点可以通过以下方法控制和限制访问：  
+ VPC 终端节点策略 — 这些策略应用于 DynamoDB VPC 终端节点。支持控制和限制对 DynamoDB 表的 API 访问。
+ IAM 策略 – 通过对附加至用户、组或角色的策略使用 `aws:sourceVpce` 条件，可以强制对 DynamoDB 表的全部访问都通过指定的 VPC 端点。
 有关更多信息，请参见[用于 Amazon DynamoDB 的终端节点](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-endpoints-ddb.html)。

**考虑客户端加密**  
建议您在 DynamoDB 中实施表之前先制定加密策略计划。如果您要在 DynamoDB 中存储敏感或机密数据，请考虑在计划中包括客户端加密。这样，您就可以尽量靠近数据源来加密数据，确保其在整个生命周期中受到保护。加密传输中和静态敏感数据有助于确保明文数据不会提供给任何第三方。  
 [适用于 DynamoDB 的 Amazon 数据库加密 SDK](https://docs.amazonaws.cn/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html) 软件库可在您将表数据发送到 DynamoDB 之前保护表数据。它对您的 DynamoDB 表项进行加密、签名、验证和解密。您可以控制对哪些属性进行加密和签名。

**主键注意事项**  
请勿在表和全局二级索引的[主键](HowItWorks.Partitions.md)中使用敏感名称或敏感的纯文本数据。键名称将显示在您的表定义中。例如，任何有权调用 [DescribeTable](WorkingWithTables.Basics.md#WorkingWithTables.Basics.DescribeTable) 的人都可以访问主键名称。键值可以显示在您的 [Amazon CloudTrail](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 和其它日志中。此外，DynamoDB 使用键值来分发数据和路由请求，而 Amazon 管理员可以遵循这些值来保持服务的运行状况。  
如果您需要在表中使用敏感数据或需要使用 GSI 键值，我们建议使用端到端客户端加密。这使您可以对数据执行键值引用，同时确保数据在与 DynamoDB 相关的日志中绝不会以未加密的状态显示出来。实现这一目标的一种方法是使用 [Amazon Database Encryption SDK for DynamoDB](https://docs.amazonaws.cn/database-encryption-sdk/latest/devguide/client-server-side.html)，但这不是必需的。如果您使用自己的解决方案，我们应始终使用足够安全的加密算法。您不应该使用像哈希这样的非加密选项，因为在大多数情况下，它们被认为不够安全。  
如果主键的键名称很敏感，我们建议改用 ``pk`` 和 ``sk``。这是一种通用的最佳实践，可让您的分区键设计保持灵活性。  
如果您不知道哪种方案是正确的选择，请务必咨询您的安全专家或 Amazon 客户团队。