

# Amazon DynamoDB 中的安全性与合规性
<a name="security"></a>

AWS的云安全性的优先级最高。作为 AWS 客户，您将从专为满足大多数安全敏感型企业的要求而打造的数据中心和网络架构中受益。

安全性是 AWS 和您的共同责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云*的*安全性和云*中*的安全性：
+ **云的安全性** – AWS 负责保护在 AWS 云中运行 AWS 服务的基础设施。AWS 还向您提供可安全使用的服务。作为 [AWS 合规计划](https://aws.amazon.com/compliance/programs/)的一部分，我们的安全有效性会定期由第三方审核员进行测试和验证。要了解适用于 DynamoDB 的合规性计划，请参阅[合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云中的安全性** - 您的责任由您使用的 AWS 服务决定。您还需要对其他因素负责，包括您的数据的敏感性、您组织的要求以及适用的法律法规。

此文档将帮助您了解如何在使用 DynamoDB 时应用责任共担模式。以下主题说明如何配置 DynamoDB 以实现您的安全性和合规性目标。您还将了解如何使用其他 AWS 服务来帮助您监控和保护您的 DynamoDB 资源。

**Topics**
+ [适用于 Amazon DynamoDB 的 AWS 托管策略](ddb-security-iam.awsmanpol.md)
+ [使用 DynamoDB 的基于资源的策略](access-control-resource-based.md)
+ [将基于属性的访问权限控制与 DynamoDB 结合使用](attribute-based-access-control.md)
+ [DynamoDB 中的数据保护](data-protection.md)
+ [AWS Identity and Access Management（IAM）和 DynamoDB](identity-and-access-mgmt.md)
+ [DynamoDB 的行业合规性验证](Compliance.md)
+ [Amazon DynamoDB 的弹性和灾难恢复](disaster-recovery-resiliency.md)
+ [Amazon DynamoDB 中的基础设施安全性](network-isolation.md)
+ [适用于 DynamoDB 的 AWS PrivateLink](privatelink-interface-endpoints.md)
+ [Amazon DynamoDB 的配置和漏洞分析](configuration-vulnerability.md)
+ [Amazon DynamoDB 的安全最佳实践](best-practices-security.md)

# 适用于 Amazon DynamoDB 的 AWS 托管策略
<a name="ddb-security-iam.awsmanpol"></a>

DynamoDB 使用 AWS 托管策略来定义服务执行特定操作所需的一组权限。DynamoDB 维护和更新其 AWS 托管策略。您无法更改 AWS 托管式策略中的权限。有关 AWS 托管策略的更多信息，请参阅《IAM 用户指南》中的 [AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

DynamoDB 可能偶尔向 AWS 托管策略添加额外权限以支持新功能。此类更新会影响附加策略的所有身份（用户、组和角色）。当推出新功能或新操作变为可用时，最有可能会更新 AWS 托管策略。DynamoDB 将不会从 AWS 托管策略中删除权限，因此策略更新不会破坏您的现有权限。有关 AWS 托管式策略的完全列表，请参阅 [AWS managed policies](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/policy-list.html)。

## AWS 托管策略：DynamoDBReplicationServiceRolePolicy
<a name="ddb-security-iam.awsmanpol.policy"></a>

您不能将 `DynamoDBReplicationServiceRolePolicy` 策略附加到您的 IAM 实体。附加到服务相关角色的这一策略允许 DynamoDB 代表您执行操作。有关更多信息，请参阅[将 IAM 与全局表结合使用](globaltables-security.md)。

此策略授予权限，以允许服务相关角色在全局表副本之间执行数据复制。它还授予代表您管理全局表副本的管理权限。

**权限详细信息**

此策略授予执行以下操作的权限：
+ `dynamodb` – 执行数据复制和管理表副本。
+ `application-autoscaling` – 检索和管理表自动扩缩设置。
+ `account` – 检索区域状态以评估副本的可访问性。
+ `iam` – 在服务相关角色尚不存在的情况下，为应用程序自动扩缩创建服务相关角色。

此托管策略的定义可在[此处](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/DynamoDBReplicationServiceRolePolicy.html)找到。

## AWS 托管式策略：AmazonDynamoDBFullAccess\$1v2
<a name="ddb-security-iam.awsmanpol.fullaccesspolicy-v2"></a>

范围缩小的 `AmazonDynamoDBFullAccess_v2` 策略向用户授予特定访问权限。您可以将 `AmazonDynamoDBFullAccess_v2` 策略附加到 IAM 身份。此策略授予对 Amazon DynamoDB 资源的管理访问权限，并向 IAM 身份（如用户、组或角色）授予访问 AWS 服务的权限，DynamoDB 与这些服务集成以使用 DynamoDB 的所有功能。使用此策略可以访问 AWS 管理控制台中提供的所有 DynamoDB 功能。

**权限详细信息**

该策略包含以下权限：
+ `Amazon DynamoDB`
+ `DynamoDB Accelerator`
+ `AWS KMS`
+ `AWS Resource Groups Tagging`
+ `Lambda`
+ `Application Auto Scaling`
+ `CloudWatch`
+ `Amazon Kinesis`
+ `Amazon EC2`
+ `IAM`

要查看 `JSON` 格式的策略，请参阅 [AmazonDynamoDBFullAccess\$1v2](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess_v2.html)。

## AWS托管策略：AmazonDynamoDBReadOnlyAccess
<a name="ddb-security-iam.awsmanpol.readonlypolicy"></a>

您可以将 `AmazonDynamoDBReadOnlyAccess` 策略附加到 IAM 身份。

此策略授予对 Amazon DynamoDB 的只读权限。

**权限详细信息**

该策略包含以下权限：
+ `Amazon DynamoDB` – 提供对 Amazon DynamoDB 的只读访问权限。
+ `Amazon DynamoDB Accelerator (DAX)` – 提供对 Amazon DynamoDB Accelerator（DAX）的只读访问权限。
+ `Application Auto Scaling`：允许主体从 Application Auto Scaling 查看配置。这是必需权限，以便用户可以查看附加到表的自动扩展策略。
+ `CloudWatch`：允许主体查看在 CloudWatch 中配置的指标数据和警报。这是必需权限，以便用户可以查看可计费表大小以及已为表配置的 CloudWatch 警报。
+ `AWS Data Pipeline` – 允许主体查看 AWS Data Pipeline 和关联对象。
+ `Amazon EC2` – 允许主体查看 Amazon EC2 VPC、子网和安全组。
+ `IAM` – 允许主体查看 IAM 角色。
+ `AWS KMS`：允许主体查看 AWS KMS 中配置的密钥。这是必需权限，以便用户可以查看他们在其账户中创建和管理的 AWS KMS keys。
+ `Amazon SNS` - 允许主体列出 Amazon SNS 主题及其订阅情况。
+ `AWS Resource Groups` – 允许主体查看资源组及其查询。
+ `AWS Resource Groups Tagging` – 允许主体列出一个区域中所有已标记或先前标记的资源。
+ `Kinesis` – 允许主体查看 Kinesis Data Streams 描述。
+ `Amazon CloudWatch Contributor Insights` – 允许主体查看 Contributor Insights 规则收集的时间序列数据。

要查看 `JSON` 格式的策略，请参阅 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html)。

## 对 AWS 托管策略的 DynamoDB 更新
<a name="ddb-security-iam.awsmanpol.updates"></a>

此表显示了对适用于 DynamoDB 的 AWS 访问管理策略的更新。


****  

| 更改 | 说明 | 更改日期 | 
| --- | --- | --- | 
| AmazonDynamoDBFullAccess：已弃用 | 此策略已被名为 `AmazonDynamoDBFullAccess_v2` 的范围缩小的策略所取代。 **2025 年 4 月**之后，您无法将 `AmazonDynamoDBFullAccess` 策略附加到任何新的用户、组或角色。有关更多信息，请参阅 [AWS 托管式策略：AmazonDynamoDBFullAccess\$1v2](#ddb-security-iam.awsmanpol.fullaccesspolicy-v2)。  | 2025 年 4 月 28 日 | 
| AmazonDynamoDBReadOnlyAccess 对现有策略的更新 | AmazonDynamoDBReadOnlyAccess 添加了权限：dynamodb:GetAbacStatus 和 dynamodb:UpdateAbacStatus。这些权限支持您查看 ABAC 状态和在当前区域中为您的 AWS 账户启用 ABAC。 | 2024 年 11 月 18 日 | 
| AmazonDynamoDBReadOnlyAccess 对现有策略的更新 | AmazonDynamoDBReadOnlyAccess 添加了权限 dynamodb:GetResourcePolicy。此权限允许读取附加到 DynamoDB 资源的基于资源的策略。 | 2024 年 3 月 20 日 | 
| DynamoDBReplicationServiceRolePolicy 对现有策略的更新 | DynamoDBReplicationServiceRolePolicy 添加了权限 dynamodb:GetResourcePolicy。此权限允许服务相关角色读取附加到 DynamoDB 资源的基于资源的策略。 | 2023 年 12 月 15 日 | 
| DynamoDBReplicationServiceRolePolicy 对现有策略的更新 | DynamoDBReplicationServiceRolePolicy 添加了权限 account:ListRegions。此权限允许服务相关角色评估副本可访问性 | 2023 年 5 月 10 日 | 
| DynamoDBReplicationServiceRolePolicy 添加到托管策略列表中 | 添加了有关托管策略 DynamoDBReplicationServiceRolePolicy 的信息，该策略由 DynamoDB 全局表服务相关角色使用。 | 2023 年 5 月 10 日 | 
| DynamoDB 全局表开始了更改跟踪 | DynamoDB 全局表对其 AWS 托管策略开始了更改跟踪。 | 2023 年 5 月 10 日 | 

# 使用 DynamoDB 的基于资源的策略
<a name="access-control-resource-based"></a>

DynamoDB 支持针对表、索引和流的基于资源的策略。基于资源的策略允许您指定谁有权访问每个资源，以及允许他们对每个资源执行哪些操作，以此来定义访问权限。

您可以将基于资源的策略附加到 DynamoDB 资源，例如表或流。在此策略中，您可以为身份和访问管理（IAM）[主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)指定权限，这些主体可以对这些 DynamoDB 资源执行特定操作。例如，附加到表的策略将包含访问该表及其索引的权限。因此，基于资源的策略可以通过在资源级别定义权限，来协助您简化对 DynamoDB 表、索引和流的访问控制。您可以附加到 DynamoDB 资源的策略大小为最大 20 KB。

使用基于资源的策略的一个显著好处是，可以简化跨账户访问控制，从而为不同 AWS 账户中的 IAM 主体提供跨账户访问权限。有关更多信息，请参阅 [用于跨账户访问的基于资源的策略](rbac-examples.md#rbac-examples-cross-account)。

基于资源的策略还支持与 [IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 外部访问分析器和[阻止公有访问（BPA）](rbac-bpa-rbp.md)功能集成。IAM Access Analyzer 报告对基于资源的策略中指定的外部实体的跨账户访问。它还提供了可见性，有助于您完善权限并遵守最低权限原则。BPA 有助于防止针对您 DynamoDB 表、索引和流的公有访问，并且会在基于资源的策略创建和修改工作流程中自动启用。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/q9sBxrVgq4U?si=0cR4TJIlKvH9Wlu5/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/q9sBxrVgq4U?si=0cR4TJIlKvH9Wlu5)


**Topics**
+ [使用基于资源的策略创建一个表](rbac-create-table.md)
+ [将策略附加到 DynamoDB 现有表](rbac-attach-resource-based-policy.md)
+ [将基于资源的策略附加到 DynamoDB 流](rbac-attach-resource-policy-streams.md)
+ [从 DynamoDB 表中删除基于资源的策略](rbac-delete-resource-based-policy.md)
+ [在 DynamoDB 中使用基于资源的策略进行跨账户访问](rbac-cross-account-access.md)
+ [在 DynamoDB 中使用基于资源的策略屏蔽公共访问权限](rbac-bpa-rbp.md)
+ [基于资源的策略支持的 DynamoDB API 操作](rbac-iam-actions.md)
+ [使用基于 IAM 身份的策略和基于 DynamoDB 资源的策略进行授权](rbac-auth-iam-id-based-policies-DDB.md)
+ [DynamoDB 基于资源的策略示例](rbac-examples.md)
+ [DynamoDB 基于资源的策略注意事项](rbac-considerations.md)
+ [DynamoDB 基于资源的策略最佳实践](rbac-best-practices.md)

# 使用基于资源的策略创建一个表
<a name="rbac-create-table"></a>

当使用 DynamoDB 控制台、[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API、AWS CLI、[AWS SDK](rbac-attach-resource-based-policy.md#rbac-attach-policy-java-sdk) 或 CloudFormation 模板创建表时，您可以添加基于资源的策略。

## AWS CLI
<a name="rbac-create-table-CLI"></a>

以下示例将使用 `create-table`AWS CLI 命令创建一个名为 *MusicCollection* 的表。此命令还包括向表中添加基于资源的策略的 `resource-policy` 参数。此策略支持用户 *John* 对表执行 [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)、[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 和 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 操作。

切记用特定资源信息替换*斜体*文本。

```
aws dynamodb create-table \
    --table-name MusicCollection \
    --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
    --resource-policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::123456789012:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:RestoreTableToPointInTime\",
                        \"dynamodb:GetItem\",
                        \"dynamodb:DescribeTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS 管理控制台
<a name="rbac-create-table-console"></a>

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 在控制面板上，选择**创建表**。

1. 在**表详细信息**中，输入表名、分区键和排序键的详细信息。

1. 在**表设置**部分，选择**自定义设置**。

1. （可选）为**表类**、**容量计算器**、**读/写容量设置**、**二级索引**、**静态加密**和**删除保护**指定选项。

1. 在**基于资源的策略**中，添加一个策略来定义表及其索引的访问权限。在此策略中，您可以指定谁有权访问这些资源，以及允许他们对每个资源执行的操作。要添加策略，请执行以下操作之一：
   + 键入或粘贴一个 JSON 策略文档。有关 IAM 策略语言的详细信息，请参阅《IAM 用户指南》中的**[使用 JSON 编辑器创建策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。
**提示**  
要查看《Amazon DynamoDB 开发人员指南》中基于资源的策略示例，请选择**策略示例**。
   + 选择**添加语句**来添加新的语句并在提供的字段中输入信息。对所有您想添加的语句重复执行此步骤。
**重要**  
确保在保存策略之前解决任何安全警告、错误或建议。

   以下 IAM 策略允许用户 *John* 对表 *MusicCollection* 执行 [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)、[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 和 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 操作。

   切记用特定资源信息替换*斜体*文本。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::123456789012:user/username"
         },
         "Action": [
           "dynamodb:RestoreTableToPointInTime",
           "dynamodb:GetItem",
           "dynamodb:PutItem"
         ],
         "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
       }
     ]
   }
   ```

------

1. （可选）选择右下角的**预览外部访问**，以预览新策略如何影响对资源的公有和跨账户访问。在保存策略之前，您可以检查策略是引入了新的 IAM Access Analyzer 发现结果还是解析了现有的发现结果。如果您没有看到活动的分析器，请在 IAM Access Analyzer 中选择**转至 Access Analyzer** 以[创建账户分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)。有关更多信息，请参阅[预览访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)。

1. 选择**创建表**。

## AWS CloudFormation 模板
<a name="rbac-create-table-cfn"></a>

------
#### [ Using the AWS::DynamoDB::Table resource ]

以下 CloudFormation 模板使用 [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) 资源创建带有流的表。此模板还包括附加到表和流的基于资源的策略。

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MusicCollectionTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "Artist",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "Artist",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                },
                "StreamSpecification": {
                  "StreamViewType": "OLD_IMAGE",
                  "ResourcePolicy": {
                    "PolicyDocument": {
                      "Version": "2012-10-17",		 	 	 
                      "Statement": [
                        {
                            "Principal": {
                                "AWS": "arn:aws:iam::111122223333:user/John"
                            },
                            "Effect": "Allow",
                            "Action": [
                                "dynamodb:GetRecords",
                                "dynamodb:GetShardIterator",
                                "dynamodb:DescribeStream"
                            ],
                            "Resource": "*"
                        }
                      ]
                    }
                  }
                },
                "TableName": "MusicCollection",
                "ResourcePolicy": {
                    "PolicyDocument": {
                        "Version": "2012-10-17",		 	 	 
                        "Statement": [
                            {
                                "Principal": {
                                    "AWS": [
                                        "arn:aws:iam::111122223333:user/John"
                                    ]
                                },
                                "Effect": "Allow",
                                "Action": "dynamodb:GetItem",
                                "Resource": "*"
                            }
                        ]
                    }
                }
            }
           
        }
    }
}
```

------
#### [ Using the AWS::DynamoDB::GlobalTable resource ]

以下 CloudFormation 模板使用 [AWS::DynamoDB::GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html) 创建一个表，并将基于资源的策略附加到该表及其流。

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "GlobalMusicCollection": {
            "Type": "AWS::DynamoDB::GlobalTable",
            "Properties": {
                "TableName": "MusicCollection",
                "AttributeDefinitions": [{
                    "AttributeName": "Artist",
                    "AttributeType": "S"
                }],
                "KeySchema": [{
                    "AttributeName": "Artist",
                    "KeyType": "HASH"
                }],
                "BillingMode": "PAY_PER_REQUEST",
                "StreamSpecification": {
                    "StreamViewType": "NEW_AND_OLD_IMAGES"
                },
                "Replicas": [
                    {
                        "Region": "us-east-1",
                        "ResourcePolicy": {
                            "PolicyDocument": {
                                "Version": "2012-10-17",		 	 	 
                                "Statement": [{
                                    "Principal": {
                                        "AWS": [
                                            "arn:aws:iam::111122223333:user/John"
                                        ]
                                    },
                                    "Effect": "Allow",
                                    "Action": "dynamodb:GetItem",
                                    "Resource": "*"
                                }]
                            }
                        },
                        "ReplicaStreamSpecification": {
                            "ResourcePolicy": {
                                "PolicyDocument": {
                                    "Version": "2012-10-17",		 	 	 
                                    "Statement": [{
                                        "Principal": {
                                            "AWS": "arn:aws:iam::111122223333:user/John"
                                        },
                                        "Effect": "Allow",
                                        "Action": [
                                            "dynamodb:GetRecords",
                                            "dynamodb:GetShardIterator",
                                            "dynamodb:DescribeStream"
                                        ],
                                        "Resource": "*"
                                    }]
                                }
                            }
                        }
                    }
                ]
            }
        }
    }
}
```

------

# 将策略附加到 DynamoDB 现有表
<a name="rbac-attach-resource-based-policy"></a>

您可以使用 DynamoDB 控制台、[PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) API、AWS CLI、AWS SDK 或 [CloudFormation 模板](rbac-create-table.md#rbac-create-table-cfn)将基于资源的策略附加到现有表或修改现有策略。

## 附加新策略的 AWS CLI 示例
<a name="rbac-attach-policy-CLI"></a>

以下 IAM 策略示例使用 `put-resource-policy` AWS CLI 命令将基于资源的策略附加到现有表。此示例允许用户 *John* 对名为 *MusicCollection* 的现有表执行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)、[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)、[UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 和 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 操作。

切记用特定资源信息替换*斜体*文本。

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetItem\",
                        \"dynamodb:PutItem\",
                        \"dynamodb:UpdateItem\",
                        \"dynamodb:UpdateTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## 有条件地更新现有策略的 AWS CLI 示例
<a name="rbac-update-policy-CLI"></a>

要有条件地更新表现有的基于资源的策略，可以使用可选 `expected-revision-id` 参数。以下示例仅当策略存在于 DynamoDB 中且其当前修订版 ID 与提供的 `expected-revision-id` 参数相匹配时，才会更新该策略。

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --expected-revision-id 1709841168699 \ 
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetItem\",
                        \"dynamodb:UpdateItem\",
                        \"dynamodb:UpdateTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS 管理控制台
<a name="rbac-attach-policy-console"></a>

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 在控制面板中，选择现有表。

1. 导航到**权限**选项卡，然后选择**创建表策略**。

1. 在基于资源的策略编辑器中，添加要附加的策略，然后选择**创建策略**。

   以下 IAM 策略示例允许用户 *John* 对名为 *MusicCollection* 的现有表执行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)、[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)、[UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 和 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 操作。

   切记用特定资源信息替换*斜体*文本。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:user/username"
         },
         "Action": [
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:UpdateItem",
           "dynamodb:UpdateTable"
         ],
         "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
       }
     ]
   }
   ```

------

## AWS SDK for Java 2.x
<a name="rbac-attach-policy-java-sdk"></a>

以下 IAM 策略示例使用 `putResourcePolicy` 方法将基于资源的策略附加到现有表。此策略允许用户对现有表执行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API 操作。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.PutResourcePolicyRequest;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * [Get started with the AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html)
 */
public class PutResourcePolicy {

    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <tableArn> <allowedAWSPrincipal>

                Where:
                    tableArn - The Amazon DynamoDB table ARN to attach the policy to. For example, arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection.
                    allowedAWSPrincipal - Allowed AWS principal ARN that the example policy will give access to. For example, arn:aws:iam::123456789012:user/John.
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String tableArn = args[0];
        String allowedAWSPrincipal = args[1];
        System.out.println("Attaching a resource-based policy to the Amazon DynamoDB table with ARN " +
                tableArn);
        Region region = Region.US_WEST_2;
        DynamoDbClient ddb = DynamoDbClient.builder()
                .region(region)
                .build();

        String result = putResourcePolicy(ddb, tableArn, allowedAWSPrincipal);
        System.out.println("Revision ID for the attached policy is " + result);
        ddb.close();
    }

    public static String putResourcePolicy(DynamoDbClient ddb, String tableArn, String allowedAWSPrincipal) {
        String policy = generatePolicy(tableArn, allowedAWSPrincipal);
        PutResourcePolicyRequest request = PutResourcePolicyRequest.builder()
                .policy(policy)
                .resourceArn(tableArn)
                .build();

        try {
            return ddb.putResourcePolicy(request).revisionId();
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        return "";
    }

    private static String generatePolicy(String tableArn, String allowedAWSPrincipal) {
        return "{\n" +
                "    \"Version\": \"2012-10-17\",\n" +,		 	 	 
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Effect\": \"Allow\",\n" +
                "            \"Principal\": {\"AWS\":\"" + allowedAWSPrincipal + "\"},\n" +
                "            \"Action\": [\n" +
                "                \"dynamodb:GetItem\"\n" +
                "            ],\n" +
                "            \"Resource\": \"" + tableArn + "\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";
    }
}
```

# 将基于资源的策略附加到 DynamoDB 流
<a name="rbac-attach-resource-policy-streams"></a>

您可以使用 DynamoDB 控制台、[PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) API、AWS CLI、AWS SDK 或 [CloudFormation 模板](rbac-create-table.md#rbac-create-table-cfn)将基于资源的策略附加到现有表的流中或修改现有策略。

**注意**  
在使用 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) 或 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 创建流时，您无法将策略附加到该流。但是，您可以在删除表之后修改或删除策略。您也可以修改或删除已禁用流的策略。



## AWS CLI
<a name="rbac-attach-policy-stream-CLI"></a>

以下 IAM 策略示例使用 `put-resource-policy` AWS CLI 命令将基于资源的策略附加到名为 *MusicCollection* 的表的流中。此示例支持用户 *John* 对流执行 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html) 和 [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 操作。

切记用特定资源信息替换*斜体*文本。

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492 \
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetRecords\",
                        \"dynamodb:GetShardIterator\",
                        \"dynamodb:DescribeStream\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492\"
                }
            ]
        }"
```

## AWS 管理控制台
<a name="rbac-attach-policy-stream-console"></a>

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 在 DynamoDB 控制台控制面板上，选择**表**，然后选择现有表。

   确保您选择的表已开启流。有关为表开启流的信息，请参阅[启用流](Streams.md#Streams.Enabling)。

1. 选择**权限**选项卡。

1. 在**活跃流的基于资源的策略**中，选择**创建流策略**。

1. 在**基于资源的策略**编辑器中，添加策略来定义流的访问权限。在此策略中，您可以指定谁有权访问流，以及允许他们对流执行的操作。要添加策略，请执行以下操作之一：
   + 键入或粘贴一个 JSON 策略文档。有关 IAM 策略语言的详细信息，请参阅《IAM 用户指南》中的**[使用 JSON 编辑器创建策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。
**提示**  
要查看《Amazon DynamoDB 开发人员指南》中基于资源的策略示例，请选择**策略示例**。
   + 选择**添加语句**来添加新的语句并在提供的字段中输入信息。对所有您想添加的语句重复执行此步骤。
**重要**  
确保在保存策略之前解决任何安全警告、错误或建议。

1. （可选）选择右下角的**预览外部访问**，以预览新策略如何影响对资源的公有和跨账户访问。在保存策略之前，您可以检查策略是引入了新的 IAM Access Analyzer 发现结果还是解析了现有的发现结果。如果您没有看到活动的分析器，请在 IAM Access Analyzer 中选择**转至 Access Analyzer** 以[创建账户分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)。有关更多信息，请参阅[预览访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)。

1. 选择**创建策略**。

以下 IAM 策略示例将基于资源的策略附加到名为 *MusicCollection* 的表的流中。此示例支持用户 *John* 对流执行 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html) 和 [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 操作。

切记用特定资源信息替换*斜体*文本。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/username"
      },
      "Action": [
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator",
        "dynamodb:DescribeStream"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

# 从 DynamoDB 表中删除基于资源的策略
<a name="rbac-delete-resource-based-policy"></a>

您可以使用 DynamoDB 控制台、[DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html) API、AWS CLI、AWS SDK 或 CloudFormation 模板从现有表中删除基于资源的策略。

## AWS CLI
<a name="rbac-delete-policy-CLI"></a>

以下示例使用 `delete-resource-policy` AWS CLI 命令将基于资源的策略从名为 *MusicCollection* 的表中删除。

切记用特定资源信息替换*斜体*文本。

```
aws dynamodb delete-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection
```

## AWS 管理控制台
<a name="rbac-delete-policy-console"></a>

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 在 DynamoDB 控制台控制面板上，选择**表**，然后选择现有表。

1. 选择**权限**。

1. 从**管理策略**下拉列表中，选择**删除策略**。

1. 在**删除表的基于资源的策略**对话框中，输入 **confirm** 以确认删除操作。

1. 选择**删除**。

# 在 DynamoDB 中使用基于资源的策略进行跨账户访问
<a name="rbac-cross-account-access"></a>

使用基于资源的策略，您可以提供跨账户访问不同 AWS 账户中可用资源的权限。如果您在与资源相同的 AWS 区域中有分析器，则将通过 IAM Access Analyzer 外部访问调查发现报告基于资源的策略允许的所有跨账户访问权限。IAM Access Analyzer 将根据 IAM [策略语法](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html)和[最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)运行策略检查，以验证您的策略。这些检查项生成结果并提供可操作的建议，可帮助您编写可操作且符合安全最佳实践的策略。您可以在 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb/)的**权限**选项卡中查看 IAM Access Analyzer 的活动调查发现。

要了解通过使用 IAM Access Analyzer 验证策略的信息，请参阅 **《IAM 用户指南》中的 [IAM Access Analyzer 策略验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。要查看 IAM Access Analyzer 返回的警告、错误和建议的列表，请参阅 [IAM Access Analyzer 策略检查引用](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html)。

要向账户 A 中的用户 A 授予访问账户 B 中表 B 的 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 权限，请执行以下步骤：

1. 将基于资源的策略附加到表 B，该策略向用户 A 授予执行 `GetItem` 操作的权限。

1. 向用户 A 附加基于身份的策略，授予其对表 B 执行 `GetItem` 操作的权限。

使用 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb/)中提供的**预览外部访问**选项，您可以预览新策略对资源的公有访问和跨账户访问的影响。在保存策略之前，您可以检查策略是引入了新的 IAM Access Analyzer 发现结果还是解析了现有的发现结果。如果您没有看到活动的分析器，请在 IAM Access Analyzer 中选择**转至 Access Analyzer** 以[创建账户分析器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)。有关更多信息，请参阅[预览访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)。

DynamoDB 数据面板和控制面板 API 中的表名参数接受表的完整 Amazon 资源名称（ARN），以支持跨账户操作。如果您只提供表名参数而不是完整的 ARN，则将对请求者所属账户中的表执行 API 操作。有关使用跨账户访问的策略的示例，请参阅[用于跨账户访问的基于资源的策略](rbac-examples.md#rbac-examples-cross-account)。

即使其它账户的主体正在所有者账户的 DynamoDB 表中执行读取或写入，也会向该资源所有者的账户收费。如果该表具有预调配吞吐量，则来自所有者账户和其它账户中的请求者的所有请求的总和，将决定请求是受限制（如果自动扩缩已禁用），还是纵向/横向扩展（如果已启用自动扩缩）。

这些请求将记录在所有者和请求者账户的 CloudTrail 日志中，这样两个账户中的每一个账户都可以跟踪哪个账户访问了哪些数据。

## 与跨账户 AWS Lambda 函数共享访问权限
<a name="rbac-analyze-cross-account-lambda-access"></a>

**账户 A 中的 Lambda 函数**

1. 转至 [IAM 控制台](https://console.aws.amazon.com/iam/)以创建一个 IAM 角色，该角色将用作账户 A 中 AWS Lambda 函数的 [Lambda 执行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。添加具有所需 DynamoDB Streams 和 Lambda 调用权限的托管式 IAM 策略 `AWSLambdaDynamoDBExecutionRole`。此策略还将授予对您在账户 A 中可能有权访问的所有潜在 DynamoDB Streams 资源的访问权限。

1. 在 [Lambda 控制台](https://console.aws.amazon.com/lambda/)中，创建一个 AWS Lambda 函数以处理 DynamoDB 流中的记录，并在设置执行角色的过程中，选择您在上一步中创建的角色。

1. 向 DynamoDB Streams 的账户 B 的所有者提供 Lambda 函数执行角色，以配置基于资源的策略来实现跨账户读取访问。

1. 完成 Lambda 函数设置。

**账户 B 中的 DynamoDB 流**

1. 从账户 A 中获取将调用 Lambda 函数的跨账户 Lambda 执行角色。

1. 在账户 B 中的 Amazon DynamoDB 控制台上，选择 Lambda 跨账户触发器的表。在**导出和流**选项卡下，找到 DynamoDB 流 ARN。确保 DynamoDB 流状态为“开启”，并记下完整的流 ARN，因为您将需要它来设置资源策略。

1. 在**权限**选项卡下，单击**创建流策略**按钮以启动可视化策略编辑器。单击**添加新语句**按钮或编辑策略（如果策略已存在）。

1. 创建一个策略，该策略将账户 A 中的 Lambda 执行角色指定为主体，并授予所需的 DynamoDB 流操作。确保包括操作 `dynamodb:DescribeStream`、`dynamodb:GetRecords`、`dynamodb:GetShardIterator` 和 `dynamodb:ListShards`。有关 DynamoDB Streams 的资源策略示例的更多信息，请参阅 [DynamoDB 基于资源的策略示例](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-examples.html)。

**注意**  
[控制面板 API](HowItWorks.API.md#HowItWorks.API.ControlPlane) 的跨账户访问的每秒事务数（TPS）限制较低，为 500 个请求。

# 在 DynamoDB 中使用基于资源的策略屏蔽公共访问权限
<a name="rbac-bpa-rbp"></a>

[阻止公有访问（BPA）](#rbac-bpa-rbp)功能可识别并防止附加基于资源的策略，这些策略授予跨您的 [Amazon Web Services（AWS）](https://aws.amazon.com/)账户对您的 DynamoDB 表、索引或流进行公有访问的权限。使用 BPA，您可以阻止对您的 DynamoDB 资源的公有访问。BPA 会在创建或修改基于资源的策略期间执行检查，并通过 DynamoDB 帮助改善您的安全状况。

BPA 使用[自动推理](https://aws.amazon.com/what-is/automated-reasoning/)来分析您的基于资源的策略授予的访问权限，并且如果在管理基于资源的策略时发现此类权限，为您发送提醒。该分析可验证策略中使用的所有基于资源的策略语句、操作和条件键集的访问权限。

**重要**  
BPA 通过直接附加到您 DynamoDB 资源（例如表、索引和流）的基于资源的策略阻止授予公有访问权限，从而有助于保护您的资源。除了使用 BPA 之外，还要仔细检查以下策略，来确认它们不授予公有访问权限：  
附加到关联 AWS 主体（例如 IAM 角色）的基于身份的策略
附加到关联 AWS 资源 [例如 AWS Key Management Service（KMS）密钥] 的基于资源的策略

您必须确保[主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)不包含 `*` 条目，或者指定的条件键之一限制主体对资源的访问。如果基于资源的策略允许跨 AWS 账户对您的表、索引或流进行公有访问，则 DynamoDB 将阻止您创建或修改策略，直到策略中的规范得到更正并被视为非公开为止。

您可以通过在 `Principal` 块内指定一个或多个主体来将策略设为非公有。以下基于资源的策略示例通过指定两个主体来阻止公有访问。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "123456789012",
      "111122223333"
    ]
  },
  "Action": "dynamodb:*",
  "Resource": "*"
}
```

通过指定特定条件键来限制访问的策略也不被视为公有策略。除了评估基于资源的策略中指定的主体外，还使用以下[可信条件键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)来完成就非公有访问对基于资源的策略的评估：
+ `aws:PrincipalAccount`
+ `aws:PrincipalArn`
+ `aws:PrincipalOrgID`
+ `aws:PrincipalOrgPaths`
+ `aws:SourceAccount`
+ `aws:SourceArn`
+ `aws:SourceVpc`
+ `aws:SourceVpce`
+ `aws:UserId`
+ `aws:PrincipalServiceName`
+ `aws:PrincipalServiceNamesList`
+ `aws:PrincipalIsAWSService`
+ `aws:Ec2InstanceSourceVpc`
+ `aws:SourceOrgID`
+ `aws:SourceOrgPaths`

此外，要将基于资源的策略设为非公有策略，Amazon 资源名称（ARN）和字符串键的值不得包含通配符或变量。如果您的基于资源的策略使用 `aws:PrincipalIsAWSService` 键，则必须确保已将键值设置为 true。

以下策略限制指定账户中的用户 `John` 的访问权限。该条件使 `Principal` 受限制且不被视为公有。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "*"
  },
  "Action": "dynamodb:*",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:PrincipalArn": "arn:aws:iam::123456789012:user/John"
    }
  }
}
```

以下基于非公有资源的策略示例使用 `StringEquals` 运算符限制 `sourceVPC`。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "dynamodb:*",
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
      "Condition": {
        "StringEquals": {
          "aws:SourceVpc": [
            "vpc-91237329"
          ]
        }
      }
    }
  ]
}
```

------

# 基于资源的策略支持的 DynamoDB API 操作
<a name="rbac-iam-actions"></a>

本主题列出了基于资源的策略支持的 API 操作。但是，对于跨账户存取，您通过基于资源的策略只能使用一组特定的 DynamoDB API。您无法将基于资源的策略附加到资源类型，例如备份和导入。那些与在这些资源类型上运行的 API 操作相对应的 IAM 操作，并不属于基于资源的策略所支持的 IAM 操作。由于表管理员在同一个账户中配置内部表设置，因此 [UpdateTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html) 和 [DisableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DisableKinesisStreamingDestination.html) 等 API 不支持通过基于资源的策略进行跨账户访问。

支持跨账户访问的 DynamoDB 数据面板和控制面板 API 也支持表名重载，这允许您指定表 ARN 而不是表名。您可以在这些 API 的 `TableName` 参数中指定表 ARN。但是，并非所有这些 API 都支持跨账户访问。

**Topics**
+ [数据面板 API 操作](#rbac-data-plane-actions)
+ [PartiQL API 操作](#rbac-partiql-actions)
+ [控制面板 API 操作](#rbac-control-plane-actions)
+ [版本 2019.11.21（最新版）全局表 API 操作](#rbac-current-global-table-actions)
+ [版本 2017.11.29（旧版）全局表 API 操作](#rbac-legacy-global-table-actions)
+ [标签 API 操作](#rbac-tags-actions)
+ [备份与还原 API 操作](#rbac-backup-restore-actions)
+ [连续备份/还原（PITR）API 操作](#rbac-continuous-backup-restore-actions)
+ [Contributor Insights API 操作](#rbac-contributor-insights-actions)
+ [导出 API 操作](#rbac-export-actions)
+ [导入 API 操作](#rbac-import-actions)
+ [Amazon Kinesis Data Streams API 操作](#rbac-kinesis-actions)
+ [基于资源的策略 API 操作](#rbac-rbp-actions)
+ [生存时间 API 操作](#rbac-ttl-actions)
+ [其他 API 操作](#rbac-other-actions)
+ [DynamoDB Streams API 操作](#rbac-ds-actions)

## 数据面板 API 操作
<a name="rbac-data-plane-actions"></a>

下表列出了[数据面板](HowItWorks.API.md#HowItWorks.API.DataPlane) API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 数据面板 - 表/索引 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)   | 支持 | 是 | 
|   [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)   | 支持 | 是 | 
|   [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)   | 支持 | 是 | 
|   [查询](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)：  | 支持 | 是 | 
|   [Scan](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)   | 支持 | 是 | 
|   [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)   | 支持 | 是 | 
|   [TransactGetItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)   | 支持 | 是 | 
|   [TransactWriteItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html)   | 支持 | 是 | 
|   [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html)   | 支持 | 是 | 
|   [BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)   | 支持 | 是 | 

## PartiQL API 操作
<a name="rbac-partiql-actions"></a>

下表列出了 [PartiQL](HowItWorks.API.md#HowItWorks.API.DataPlane.partiql) API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| PartiQL API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [BatchExecuteStatement](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchExecuteStatement.html)   | 是 | 否 | 
|   [ExecuteStatement](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExecuteStatement.html)   | 是 | 否 | 
|   [ExecuteTransaction](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExecuteTransaction.html)   | 是 | 否 | 

## 控制面板 API 操作
<a name="rbac-control-plane-actions"></a>

下表列出了[控制面板](HowItWorks.API.md#HowItWorks.API.ControlPlane) API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 控制面板 - 表 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)   | 否 | 否 | 
|   [DeleteTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html)   | 支持 | 是 | 
|   [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)   | 支持 | 是 | 
|   [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html)   | 支持 | 是 | 

## 版本 2019.11.21（最新版）全局表 API 操作
<a name="rbac-current-global-table-actions"></a>

下表列出了[版本 2019.11.21（最新版）全局表](GlobalTables.md) API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 版本 2019.11.21（最新版）全局表 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeTableReplicaAutoScaling](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTableReplicaAutoScaling.html)   | 是 | 否 | 
|   [UpdateTableReplicaAutoScaling](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html)   | 是 | 否 | 

## 版本 2017.11.29（旧版）全局表 API 操作
<a name="rbac-legacy-global-table-actions"></a>

下表列出了[版本 2017.11.29（旧版）全局表](globaltables.V1.md) API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 版本 2017.11.29（旧版）全局表 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [CreateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateGlobalTable.html)   | 否 | 否 | 
|   [DescribeGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTable.html)   | 否 | 否 | 
|   [DescribeGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTableSettings.html)   | 否 | 否 | 
|   [ListGlobalTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListGlobalTables.html)   | 否 | 否 | 
|   [UpdateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTable.html)   | 否 | 否 | 
|   [UpdateGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTableSettings.html)   | 否 | 否 | 

## 标签 API 操作
<a name="rbac-tags-actions"></a>

下表列出了与[标签](Tagging.Operations.md)相关的 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 标签 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [ListTagsOfResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTagsOfResource.html)   | 支持 | 是 | 
|   [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)   | 支持 | 是 | 
|   [UntagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UntagResource.html)   | 支持 | 是 | 

## 备份与还原 API 操作
<a name="rbac-backup-restore-actions"></a>

下表列出了与[备份与还原](Backup-and-Restore.md)相关的 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 备份与还原 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [CreateBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateBackup.html)   | 是 | 否 | 
|   [DescribeBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeBackup.html)   | 否 | 否 | 
|   [DeleteBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteBackup.html)   | 否 | 否 | 
|  [RestoreTableFromBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableFromBackup.html)  | 否 | 否 | 

## 连续备份/还原（PITR）API 操作
<a name="rbac-continuous-backup-restore-actions"></a>

下表列出了与[连续备份/还原（PITR）](Point-in-time-recovery.md)相关的 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 连续备份/还原（PITR）API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeContinuousBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeContinuousBackups.html)   | 是 | 否 | 
|   [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)   | 是 | 否 | 
|   [UpdateContinuousBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateContinuousBackups.html)   | 是 | 否 | 

## Contributor Insights API 操作
<a name="rbac-contributor-insights-actions"></a>

下表列出了与[连续备份/还原（PITR）](Point-in-time-recovery.md)相关的 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| Contributor Insights API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeContributorInsights.html)   | 是 | 否 | 
|   [ListContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListContributorInsights.html)   | 否 | 否 | 
|   [UpdateContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateContributorInsights.html)   | 是 | 否 | 

## 导出 API 操作
<a name="rbac-export-actions"></a>

下表列出了导出 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 导出 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeExport](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeExport.html)   | 否 | 否 | 
|   [ExportTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExportTableToPointInTime.html)   | 是 | 否 | 
|   [ListExports](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListExports.html)   | 否 | 否 | 

## 导入 API 操作
<a name="rbac-import-actions"></a>

下表列出了导入 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 导入 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeImport](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeImport.html)   | 否 | 否 | 
|   [ImportTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ImportTable.html)   | 否 | 否 | 
|   [ListImports](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListImports.html)   | 否 | 否 | 

## Amazon Kinesis Data Streams API 操作
<a name="rbac-kinesis-actions"></a>

下表列出了 Kinesis Data Streams API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| Kinesis API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeKinesisStreamingDestination.html)   | 是 | 否 | 
|   [DisableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DisableKinesisStreamingDestination.html)   | 是 | 否 | 
|   [EnableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_EnableKinesisStreamingDestination.html)   | 是 | 否 | 
|   [UpdateKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateKinesisStreamingDestination.html)   | 是 | 否 | 

## 基于资源的策略 API 操作
<a name="rbac-rbp-actions"></a>

下表列出了基于资源的策略 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 基于资源的策略 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [GetResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetResourcePolicy.html)   | 是 | 否 | 
|   [PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html)   | 是 | 否 | 
|   [DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html)   | 是 | 否 | 

## 生存时间 API 操作
<a name="rbac-ttl-actions"></a>

下表列出了[生存时间](TTL.md)（TTL）API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| TTL API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTimeToLive.html)   | 是 | 否 | 
|   [UpdateTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html)   | 是 | 否 | 

## 其他 API 操作
<a name="rbac-other-actions"></a>

下表列出了其他 API 操作，针对基于资源的策略和跨账户访问所提供的 API 级支持。


| 其他 API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeLimits](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeLimits.html)   | 否 | 否 | 
|   [DescribeEndpoints](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeEndpoints.html)   | 否 | 否 | 
|   [ListBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListBackups.html)   | 否 | 否 | 
|   [ListTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTables.html)   | 否 | 否 | 

## DynamoDB Streams API 操作
<a name="rbac-ds-actions"></a>

下表列出了可实施基于资源的策略和进行跨账户访问的 DynamoDB Streams API 操作提供的 API 级支持。


| DynamoDB Streams API | 基于资源的策略支持 | 跨账户支持 | 
| --- | --- | --- | 
|   [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html)   | 支持 | 是 | 
|   [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)   | 支持 | 是 | 
|   [GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html)   | 支持 | 是 | 
|   [ListStreams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_ListStreams.html)   | 否 | 否 | 

# 使用基于 IAM 身份的策略和基于 DynamoDB 资源的策略进行授权
<a name="rbac-auth-iam-id-based-policies-DDB"></a>

**基于身份的策略**会附加到 IAM 用户、用户组和角色等身份。这些是 IAM 策略文档，控制身份可在何种条件下对哪些资源执行哪些操作。基于身份的策略可以是[托管](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)策略或[内联](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)策略。

**基于资源的策略**是附加到资源（例如 DynamoDB 表）的 IAM 策略文档。这些策略授予指定的主体对该资源执行特定操作的权限，并定义这在哪些条件下适用。例如，DynamoDB 表的基于资源的策略还包括与该表关联的索引。基于资源的策略是内联策略。没有基于托管资源的策略。

有关这些策略的更多信息，请参见《IAM 用户指南》**中的[基于身份的策略和基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

如果 IAM 主体与资源所有者来自同一个账户，则基于资源的策略足以指定对资源的访问权限。您仍然可以选择拥有基于 IAM 身份的策略以及基于资源的策略。对于跨账户访问，您必须明确允许访问身份和资源策略，如[在 DynamoDB 中使用基于资源的策略进行跨账户访问](rbac-cross-account-access.md)中所指定。当您同时使用这两种类型的策略时，将按照[确定账户中是允许还是拒绝请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)中的说明评估策略。

**重要**  
如果基于身份的策略授予对 DynamoDB 表的无条件访问权限（例如，无条件的 `dynamodb:GetItem`），则基于资源的策略在根据 `dynamodb:Attributes` 上的条件来允许访问时，不会限制该访问权限。基于身份的策略中的无条件允许语句优先，而基于资源的策略的条件不会作为限制条件加以应用。要限制对特定属性的访问，请使用显式 `Deny` 语句，而不是仅依赖基于资源的策略中的有条件 `Allow` 语句。

# DynamoDB 基于资源的策略示例
<a name="rbac-examples"></a>

当您在基于资源的策略的 `Resource` 字段中指定 ARN 时，只有当指定的 ARN 与其关联的 DynamoDB 资源的 ARN 匹配时，该策略才会生效。

**注意**  
切记用特定资源信息替换*斜体*文本。

## 表的基于资源的表策略
<a name="rbac-examples-get"></a>

以下基于资源的策略附加到名为 *MusicCollection* 的 DynamoDB 表，向 IAM 用户 *John* 和 *Jane* 授予对 *MusicCollection* 资源执行 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 和 [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html) 的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::111122223333:user/username",
            "arn:aws:iam::111122223333:user/Jane"
          ]
        },
        "Action": [
          "dynamodb:GetItem",
          "dynamodb:BatchGetItem"
        ],
        "Resource": [
          "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
        ]
    }
  ]
}
```

------

## 流的基于资源的表策略
<a name="rbac-examples-streams"></a>

以下基于资源的策略附加到名为 `2024-02-12T18:57:26.492` 的 DynamoDB 流，向 IAM 用户 *John* 和 *Jane* 授予对 `2024-02-12T18:57:26.492` 资源执行 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html) 和 [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 操作的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/username",
          "arn:aws:iam::111122223333:user/Jane"
        ]
      },
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

## 用于对指定资源执行所有操作的基于资源的策略
<a name="rbac-examples-wildcard"></a>

要允许用户对表以及与表关联的所有索引执行所有操作，可以使用通配符（\$1）来表示与该表关联的操作和资源。为资源使用通配符将允许用户访问 DynamoDB 表及其所有关联索引，包括尚未创建的索引。例如，以下策略将授予用户 *John* 对 *MusicCollection* 表及其所有索引（包括将来要创建的任何索引）执行任何操作的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/role-name"
      },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/index/index-name"
      ]
    }
  ]
}
```

------

## 用于跨账户访问的基于资源的策略
<a name="rbac-examples-cross-account"></a>

您可以为跨账户 IAM 身份指定访问 DynamoDB 资源的权限。例如，您可能需要来自可信账户的用户获得读取您表内容的权限，条件是他们只能访问这些项目中的特定项目和特定属性。以下策略支持来自可信 AWS 账户 ID *111111111111* 的用户 *John* 使用 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API 访问账户 *123456789012* 中表的数据。该策略确保用户只能访问带有 *Jane* 主键的项目，并且用户只能检索属性 `Artist` 和 `SongTitle`，而不能检索其它属性。

**重要**  
如果您未指定 `SPECIFIC_ATTRIBUTES` 条件，则会看到返回项目的所有属性。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountTablePolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:user/John"
            },
            "Action": "dynamodb:GetItem",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

除了上述基于资源的策略外，附加到用户 *John* 的基于身份的策略还需要允许 `GetItem` API 操作，以便进行跨账户访问。以下是您必须将其附加到用户 *John* 的基于身份的策略示例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountIdentityBasedPolicy",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

用户可以在 `table-name` 参数中指定表 ARN 来访问账户 *123456789012* 中的表 *MusicCollection*，以此发出 `GetItem` 请求。

```
aws dynamodb get-item \
    --table-name arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --key '{"Artist": {"S": "Jane"}' \
    --projection-expression 'Artist, SongTitle' \
    --return-consumed-capacity TOTAL
```

## 具有 IP 地址条件的基于资源的策略
<a name="rbac-examples-conditions"></a>

您可以应用条件来限制源 IP 地址、虚拟私有云（VPC）和 VPC 端点（VPCE）。您可以根据原始请求的源地址指定权限。例如，您可能希望仅允许用户从特定 IP 源（例如公司 VPN 端点）访问 DynamoDB 资源。在 `Condition` 语句中指定这些 IP 地址。

以下示例允许用户 *John* 在源 IP 为 `54.240.143.0/24` 和 `2001:DB8:1234:5678::/64` 时访问任何 DynamoDB 资源。

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

****  

```
{
  "Id":"PolicyId2",
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Sid":"AllowIPmix",
      "Effect":"Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/username"
      },
      "Action":"dynamodb:*",
      "Resource":"*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "54.240.143.0/24",
            "2001:DB8:1234:5678::/64"
          ]
        }
      }
    }
  ]
}
```

------

您也可以拒绝对 DynamoDB 资源的所有访问，除非源是特定 VPC 端点，例如 *vpce-1a2b3c4d*。

**重要**  
在仅 IPv6 的环境中，当您将 DAX 与具有基于 IP 的资源策略的 DynamoDB 表配合使用时，必须配置额外的访问规则。如果您的资源策略将对表的访问权限限制为 IPv4 地址空间 `0.0.0.0/0`，则必须允许与 DAX 集群关联的 IAM 角色进行访问。在您的策略中添加 `ArnNotEquals` 条件，以确保 DAX 保留对您的 DynamoDB 表的访问权限。有关更多信息，请参阅 [DAX 和 IPv6](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.create-cluster.DAX_and_IPV6.html)。

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

****  

```
{
  "Id":"PolicyId",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessToSpecificVPCEOnly",
      "Principal": "*",
      "Action": "dynamodb:*",
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals":{
          "aws:sourceVpce":"vpce-1a2b3c4d"
        }
      }
    }
  ]
}
```

------

## 使用 IAM 角色的基于资源的策略
<a name="rbac-examples-iam"></a>

您也可以在基于资源的策略中指定 IAM 服务角色。担任此角色的 IAM 实体受为该角色指定的允许操作以及基于资源的策略中的特定资源集的限制。

以下示例允许 IAM 实体对 *MusicCollection* 和 *MusicCollection* DynamoDB 资源执行所有 DynamoDB 操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/role-name" },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/*"
      ]
    }
  ]
}
```

------

# DynamoDB 基于资源的策略注意事项
<a name="rbac-considerations"></a>

在为 DynamoDB 资源定义基于资源的策略时，请注意以下几点：

**一般注意事项**
+ 基于资源的策略文档支持的最大大小为 20 KB。在计算策略大小时，DynamoDB 会将空格计入这一限制。
+ 成功更新给定资源的策略后，将在 15 秒内阻止对同一资源的策略进行后续更新。
+ 目前，您只能将基于资源的策略附加到现有流。在创建流时，您无法将策略附加到该流。

**全局表注意事项**
+ 基于资源的策略不适用于[全局表版本 2017.11.29（旧版）](globaltables_HowItWorks.md)副本。
+ 在基于资源的策略中，如果 DynamoDB 服务相关角色（SLR）为全局表复制数据的操作遭拒绝，则添加或删除副本将失败并显示错误。
+ [AWS:: DynamoDB:: GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html) 资源不支持在部署堆栈更新的区域以外的区域中创建副本并向该副本添加基于资源的策略。

**跨账户注意事项**
+ 使用基于资源的策略进行跨账户访问不支持使用 AWS 托管密钥的加密表，因为您无法授予对 AWS 托管 KMS 策略的跨账户访问权限。

**CloudFormation 注意事项**
+ 基于资源的策略不支持[偏差检测](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html#)。如果您在 AWS CloudFormation 堆栈模板之外更新基于资源的策略，则需要使用更改更新 CloudFormation 堆栈。
+ 基于资源的策略不支持带外更改。如果您在 CloudFormation 模板之外添加、更新或删除策略，当模板中的策略没有更改时，此更改不会被覆盖。

  例如，假设您的模板包含基于资源的策略，您稍后在模板之外对其进行更新。如果您未对模板中的策略进行任何更改，则 DynamoDB 中更新的策略将不会与模板中的策略同步。

  相反，假设您的模板不包含基于资源的策略，但您在模板之外添加策略。只要您不将此策略添加到模板中，就不会将其从 DynamoDB 中删除。当您将策略添加到模板并更新堆栈时，DynamoDB 中的现有策略将更新为与模板中定义的策略相匹配。

# DynamoDB 基于资源的策略最佳实践
<a name="rbac-best-practices"></a>

本主题介绍关于定义您 DynamoDB 资源的访问权限的最佳实践以及允许对这些资源执行的操作。

## 简化对 DynamoDB 资源的访问控制
<a name="rbac-simplify-access-control"></a>

如果需要访问 DynamoDB 资源的 AWS Identity and Access Management 主体与资源所有者属于相同的 AWS 账户，则不需要为每个主体指定基于 IAM 身份的策略。附加到给定资源的基于资源的策略就足够了。这种配置简化了访问控制。

## 使用基于资源的策略保护您的 DynamoDB 资源
<a name="rbac-protect"></a>

 对于所有 DynamoDB 表和流，创建基于资源的策略以强制对这些资源进行访问控制。基于资源的策略使您能够在资源级别集中管理权限，简化对 DynamoDB 表、索引和流的访问控制，并减少管理开销。如果没有为表或流指定基于资源的策略，则除非与 IAM 主体关联的基于身份的策略允许访问，否则将隐式拒绝对表或流的访问。

## 应用最低权限权限
<a name="rbac-least-privilege"></a>

在使用基于资源的策略设置 DynamoDB 资源的权限时，请仅授予执行操作所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为最低权限权限。在探索工作负载或使用场景所需的权限时，您可以从较广泛的权限开始。随着使用场景逐渐成熟，您可以努力减少授予权限，直至达到最低权限的标准。

## 分析跨账户访问活动以生成最低权限策略
<a name="rbac-analyze-cross-account-access"></a>

IAM Access Analyzer 报告对基于资源的策略中指定的外部实体的跨账户访问权限，并提供可见性来帮您完善权限并遵守最低权限原则。有关策略生成的更多信息，请参阅 [IAM Access Analyzer 策略生成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)。

## 使用 IAM Access Analyzer 生成最低权限策略
<a name="rbac-iam-access-analyzer"></a>

如果仅授予执行任务所需的权限，您可以根据记录在 AWS CloudTrail 中的访问活动生成策略。IAM Access Analyzer 分析您的策略使用的服务和操作。

# 将基于属性的访问权限控制与 DynamoDB 结合使用
<a name="attribute-based-access-control"></a>

[基于属性的访问权限控制（ABAC）](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)是一种授权策略，它根据基于身份的策略或其它 AWS 策略（例如基于资源的策略和组织 IAM 策略）中的[标签条件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)来定义访问权限。可以将标签附加到 DynamoDB 表，然后根据基于标签的条件来对这些表进行评估。与表关联的索引会继承您添加到表的标签。最多可以为每个 DynamoDB 表添加 50 个标签。表中所有标签支持的最大大小为 10 KB。有关为 DynamoDB 资源添加标签和为限制添加标签的更多信息，请参阅[在 DynamoDB 中为资源添加标签](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html)和 [DynamoDB 中的标签限制](Tagging.md#TaggingRestrictions)。

有关使用标签控制对 AWS 资源的访问权限的更多信息，请参阅《IAM 用户指南》中的以下主题：
+ [什么是适用于 AWS 的 ABAC](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [使用标签控制对 AWS 资源的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

使用 ABAC，可以为团队和应用程序强制使用不同的访问级别，以便使用更少的策略对 DynamoDB 表执行操作。可以在 IAM 策略的[条件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中指定一个标签，来控制对 DynamoDB 表或索引的访问权限。这些条件决定了 IAM 主体、用户或角色对 DynamoDB 表和索引拥有的访问级别。当 IAM 主体向 DynamoDB 提出访问请求时，将根据 IAM 策略中的标签条件评估资源和身份的标签。此后，只有在满足标签条件时，该策略才会生效。这使您能够创建可有效说明以下内容之一的 IAM 策略：
+ *支持用户仅管理那些具有标签（键为 `X` 和值为 `Y`）的资源*。
+ *拒绝所有用户访问用键 `X` 标记的资源*。

例如，可以创建一个策略，仅在表具有以下标签键值对时才支持用户更新该表：`"environment": "staging"`。可以使用 [aws:ResourceTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 条件键，基于附加到表的标签来支持或拒绝访问该表。

可以在创建策略时包括基于属性的条件，也可以稍后使用 AWS 管理控制台、AWS API、AWS Command Line Interface（AWS CLI）、AWS SDK 或 AWS CloudFormation 来包括这些条件。

以下示例支持对名为 `MusicTable` 的表执行 [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 操作，前提是该表包含名称为 `environment` 和值为 `production` 的标签键。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/MusicTable",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "production"
        }
      }
    }
  ]
}
```

------

**Topics**
+ [为什么应该使用 ABAC？](#why-use-abac)
+ [使用 DynamoDB 实施 ABAC 的条件键](#condition-keys-implement-abac)
+ [将 ABAC 与 DynamoDB 结合使用的注意事项](#abac-considerations)
+ [在 DynamoDB 中启用 ABAC](abac-enable-ddb.md)
+ [将 ABAC 与 DynamoDB 表和索引结合使用](abac-implementation-ddb-tables.md)
+ [将 ABAC 与 DynamoDB 表和索引结合使用的示例](abac-example-use-cases.md)
+ [排除 DynamoDB 表和索引的常见 ABAC 错误](abac-troubleshooting.md)

## 为什么应该使用 ABAC？
<a name="why-use-abac"></a>
+ **更简单的策略管理：**您使用的策略将更少，因为您不必创建不同的策略来定义每个 IAM 主体的访问级别。
+ **可扩展的访问权限控制：**使用 ABAC 可以更轻松地扩展访问权限控制，因为您不必在创建新的 DynamoDB 资源时更新策略。可以使用标签来向包含的标签与资源标签匹配的 IAM 主体授予访问权限。您可以加入新的 IAM 主体或 DynamoDB 资源，并应用适当的标签来自动授予必要的权限，而不必进行任何策略更改。
+ **精细的权限管理：**最佳实践是在创建策略时[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。使用 ABAC，您可以为 IAM 主体创建标签，并使用它们来授予对与 IAM 主体上的标签匹配的特定操作和资源的访问权限。
+ **与公司目录保持一致：**可以将标签与公司目录中的现有员工属性进行映射，以使访问权限控制策略与组织结构保持一致。

## 使用 DynamoDB 实施 ABAC 的条件键
<a name="condition-keys-implement-abac"></a>

可以在 AWS 策略中使用以下条件键来控制对 DynamoDB 表和索引的访问级别：
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag)：根据 DynamoDB 表或索引上的标签键值对是否与策略中的标签键和值匹配来控制访问权限。此条件键与对现有表或索引进行操作的所有 API 相关。

  对这些 `dynamodb:ResourceTag` 条件的评估就像您没有为资源附加任何标签一样。
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)：支持将在请求中传递的标签键值对与您在策略中指定的标签对进行比较。此条件键与包含标签作为请求有效载荷一部分的 API 相关。这些 API 包括 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) 和 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)。
+ [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)：将请求中的标签键与您在策略中指定的键进行比较。此条件键与包含标签作为请求有效载荷一部分的 API 相关。这些标签包括 `CreateTable`、`TagResource` 和 `UntagResource`。

## 将 ABAC 与 DynamoDB 结合使用的注意事项
<a name="abac-considerations"></a>

在将 ABAC 与 DynamoDB 表或索引结合使用时，以下注意事项适用：
+ DynamoDB Streams 不支持添加标签和 ABAC。
+ DynamoDB 备份不支持添加标签和 ABAC。要将 ABAC 用于备份，建议您使用 [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html)。
+ 标签不会保留在还原的表中。您需要先向还原的表添加标签，然后才能在策略中使用基于标签的条件。

# 在 DynamoDB 中启用 ABAC
<a name="abac-enable-ddb"></a>

对于大多数 AWS 账户，ABAC 在默认情况下处于启用状态。使用 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb/)，可以确认是否为您的账户启用了 ABAC。为此，请确保使用具有 [dynamodb:GetAbacStatus](#required-permissions-abac) 权限的角色打开 DynamoDB 控制台。然后，打开 DynamoDB 控制台的**设置**页面。

如果您未看到**基于属性的访问权限控制**卡片，或者该卡片的状态显示为**打开**，则表示为您的账户启用了 ABAC。但是，如果您看到**基于属性的访问权限控制**卡片的状态为**关闭**（如下图所示），则表示未为您的账户启用 ABAC。

## 基于属性的访问权限控制 - 未启用
<a name="abac-disabled-image"></a>

![\[DynamoDB 控制台上显示基于属性的访问权限控制卡片的设置页面。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


对于那些在基于身份的策略或其它策略中指定的基于标签的条件仍需要审计的 AWS 账户，尚未启用 ABAC。如果未为您的账户启用 ABAC，则会评估策略中用于对 DynamoDB 表或索引执行操作的基于标签的条件，就好像您的资源或 API 请求不存在任何标签一样。为您的账户启用 ABAC 后，将根据附加到您的表或 API 请求的标签，来评估您账户的策略中基于标签的条件。

要为您的账户启用 ABAC，我们建议您首先按照[策略审计](#policy-audit-for-abac)一节中所述来审计您的策略。然后，在您的 IAM 策略中包含 [ABAC 所需的权限](#required-permissions-abac)。最后，执行[在控制台中启用 ABAC](#abac-enable-console) 中介绍的步骤，以便在当前区域中为您的账户启用 ABAC。启用 ABAC 后，可以在选择加入后接下来的七个日历日内选择退出。

**Topics**
+ [在启用 ABAC 之前审计策略](#policy-audit-for-abac)
+ [启用 ABAC 所需的 IAM 权限](#required-permissions-abac)
+ [在控制台中启用 ABAC](#abac-enable-console)

## 在启用 ABAC 之前审计策略
<a name="policy-audit-for-abac"></a>

在为您的账户启用 ABAC 之前，请审计您的策略，以确认您账户的策略中可能存在的基于标签的条件已按预期设置。在启用 ABAC 后，审计您的策略将有助于避免因 DynamoDB 工作流程的授权变更而出现意外。要查看将基于属性的条件与标签结合使用的示例，以及实施 ABAC 之前和之后的行为，请参阅[将 ABAC 与 DynamoDB 表和索引结合使用的示例使用案例示例](abac-example-use-cases.md)。

## 启用 ABAC 所需的 IAM 权限
<a name="required-permissions-abac"></a>

您需要 `dynamodb:UpdateAbacStatus` 权限才能在当前区域中为您的账户启用 ABAC。要确认是否为您的账户启用了 ABAC，您还必须拥有 `dynamodb:GetAbacStatus` 权限。有了此权限，您就可以查看任何区域中账户的 ABAC 状态。除了访问 DynamoDB 控制台所需的权限外，您还需要这些权限。

以下 IAM 策略授予在当前区域中为账户启用 ABAC 和查看其状态的权限。

```
{
"version": "2012-10-17", 		 	 	 &TCX5-2025-waiver;
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:UpdateAbacStatus",
                "dynamodb:GetAbacStatus"
             ],
            "Resource": "*"
        }
    ]
}
```

## 在控制台中启用 ABAC
<a name="abac-enable-console"></a>

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 从顶部导航窗格中，选择要为其启用 ABAC 的区域。

1. 在左侧导航窗格中，选择**设置**。

1. 在**设置**页面上，执行以下操作：

   1. 在**基于属性的访问权限控制**卡片中，选择**启用**。

   1. 在**确认基于属性的访问权限控制设置**框中，选择**启用**以确认您的选择。

      这将为当前区域启用 ABAC，并且**基于属性的访问权限控制**卡片将显示状态**打开**。

      如果您想在控制台上启用 ABAC 后选择退出，可以在选择加入后的七个日历日内选择退出。要选择退出，请在**设置**页面上的**基于属性的访问权限控制**卡片中选择**禁用**。
**注意**  
更新 ABAC 的状态是一项异步操作。如果未立即评估策略中的标签，则可能需要等待一些时间，因为应用更改是最终一致的。

# 将 ABAC 与 DynamoDB 表和索引结合使用
<a name="abac-implementation-ddb-tables"></a>

以下步骤显示如何使用 ABAC 设置权限。在此示例场景中，您将向 DynamoDB 表添加标签，并使用包含基于标签的条件的策略创建一个 IAM 角色。然后，您将通过匹配标签条件来测试 DynamoDB 表支持的权限。

**Topics**
+ [步骤 1：向 DynamoDB 表添加标签](#abac-add-table-tags)
+ [步骤 2：使用包含基于标签的条件的策略创建 IAM 角色](#abac-create-iam-role)
+ [步骤 3：测试支持的权限](#abac-test-permissions)

## 步骤 1：向 DynamoDB 表添加标签
<a name="abac-add-table-tags"></a>

可以使用 AWS 管理控制台、AWS API、AWS Command Line Interface（AWS CLI）或 AWS SDK 或 AWS CloudFormation 向新的或现有的 DynamoDB 表添加标签。例如，以下 [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) CLI 命令向名为 `MusicTable` 的表添加一个标签。

```
aws dynamodb tag-resource —resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/MusicTable —tags Key=environment,Value=staging
```

## 步骤 2：使用包含基于标签的条件的策略创建 IAM 角色
<a name="abac-create-iam-role"></a>

使用 [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 条件键[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)，以便将在 IAM 策略中指定的标签键值对与附加到表中的键值对进行比较。如果表中包含标签键值对 `"environment": "staging"`，则以下示例策略支持用户在这些表中放置或更新项目。如果表没有指定的标签键值对，则这些操作将被拒绝。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "staging"
                }
            }
        }
    ]
}
```

------

## 步骤 3：测试支持的权限
<a name="abac-test-permissions"></a>

1. 将 IAM 策略附加到 AWS 账户中的 IAM 用户或角色。确保您使用的 IAM 主体尚不具有通过其它策略访问 DynamoDB 表的权限。

1. 确保 DynamoDB 表包含值为 `"staging"` 的 `"environment"` 标签键。

1. 对带标签的表执行 `dynamodb:PutItem` 和 `dynamodb:UpdateItem` 操作。如果 `"environment": "staging"` 标签键值对存在，则这些操作应该会成功。

   如果您对没有 `"environment": "staging"` 标签键值对的表执行这些操作，则您的请求将失败，并引发 `AccessDeniedException`。

还可以查看下一节中介绍的其它[示例用例](abac-example-use-cases.md)，以实施 ABAC 并执行更多测试。

# 将 ABAC 与 DynamoDB 表和索引结合使用的示例
<a name="abac-example-use-cases"></a>

以下示例描述了一些使用标签来实现基于属性的条件的用例。

**Topics**
+ [示例 1：使用 aws:ResourceTag 支持操作](#abac-allow-example-resource-tag)
+ [示例 2：使用 aws:RequestTag 支持操作](#abac-allow-example-request-tag)
+ [示例 3：使用 aws:TagKeys 拒绝操作](#abac-deny-example-tag-key)

## 示例 1：使用 aws:ResourceTag 支持操作
<a name="abac-allow-example-resource-tag"></a>

使用 `aws:ResourceTag/tag-key` 条件键，可以将在 IAM 策略中指定的标签键值对与 DynamoDB 表中附加的键值对进行比较。例如，如果 IAM 策略和表中的标签条件匹配，则可以支持执行特定操作，例如 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)。为此，请执行以下步骤：

------
#### [ Using the AWS CLI ]

1. 创建表。以下示例使用 [create-table](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html) AWS CLI 命令来创建名为 `myMusicTable` 的表。

   ```
   aws dynamodb create-table \
     --table-name myMusicTable \
     --attribute-definitions AttributeName=id,AttributeType=S \
     --key-schema AttributeName=id,KeyType=HASH \
     --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
     --region us-east-1
   ```

1. 向此表添加标签。以下 [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) AWS CLI 命令示例将标签键值对 `Title: ProductManager` 添加到 `myMusicTable`。

   ```
   aws dynamodb tag-resource --region us-east-1 --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable --tags Key=Title,Value=ProductManager
   ```

1. 创建[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)并将其添加到附加了 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 托管式策略的角色，如以下示例所示。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   当附加到表的标签键和值与在策略中指定的标签匹配时，此策略支持对表执行 `PutItem` 操作。

1. 使用在步骤 3 中描述的策略代入该角色。

1. 使用 [put-item](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html) AWS CLI 命令将项目放置到 `myMusicTable`。

   ```
   aws dynamodb put-item \
       --table-name myMusicTable --region us-east-1 \
       --item '{
           "id": {"S": "2023"},
           "title": {"S": "Happy Day"},
           "info": {"M": {
               "rating": {"N": "9"},
               "Artists": {"L": [{"S": "Acme Band"}, {"S": "No One You Know"}]},
               "release_date": {"S": "2023-07-21"}
           }}
       }'
   ```

1. 扫描该表，以验证该项目是否已添加到表。

   ```
   aws dynamodb scan --table-name myMusicTable  --region us-east-1
   ```

------
#### [ Using the AWS SDK for Java 2.x ]

1. 创建表。以下示例使用 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API 来创建名为 `myMusicTable` 的表。

   ```
   DynamoDbClient dynamoDB = DynamoDbClient.builder().region(region).build();
   CreateTableRequest createTableRequest = CreateTableRequest.builder()
       .attributeDefinitions(
           Arrays.asList(
               AttributeDefinition.builder()
               .attributeName("id")
               .attributeType(ScalarAttributeType.S)
               .build()
           )
       )
       .keySchema(
           Arrays.asList(
               KeySchemaElement.builder()
               .attributeName("id")
               .keyType(KeyType.HASH)
               .build()
           )
       )
       .provisionedThroughput(ProvisionedThroughput.builder()
           .readCapacityUnits(5L)
           .writeCapacityUnits(5L)
           .build()
       )
       .tableName("myMusicTable")
       .build();
   
   CreateTableResponse createTableResponse = dynamoDB.createTable(createTableRequest);
   String tableArn = createTableResponse.tableDescription().tableArn();
   String tableName = createTableResponse.tableDescription().tableName();
   ```

1. 向此表添加标签。以下示例中的 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) API 将标签键值对 `Title: ProductManager` 添加到 `myMusicTable`。

   ```
   TagResourceRequest tagResourceRequest = TagResourceRequest.builder()
       .resourceArn(tableArn)
       .tags(
           Arrays.asList(
               Tag.builder()
               .key("Title")
               .value("ProductManager")
               .build()
           )
       )
       .build();
   dynamoDB.tagResource(tagResourceRequest);
   ```

1. 创建[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)并将其添加到附加了 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 托管式策略的角色，如以下示例所示。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   当附加到表的标签键和值与在策略中指定的标签匹配时，此策略支持对表执行 `PutItem` 操作。

1. 使用在步骤 3 中描述的策略代入该角色。

1. 使用 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 将项目放置到 `myMusicTable`。

   ```
   HashMap<String, AttributeValue> info = new HashMap<>();
   info.put("rating", AttributeValue.builder().s("9").build());
   info.put("artists", AttributeValue.builder().ss(List.of("Acme Band","No One You Know").build());
   info.put("release_date", AttributeValue.builder().s("2023-07-21").build());
   
   HashMap<String, AttributeValue> itemValues = new HashMap<>();
   itemValues.put("id", AttributeValue.builder().s("2023").build());
   itemValues.put("title", AttributeValue.builder().s("Happy Day").build());
   itemValues.put("info", AttributeValue.builder().m(info).build());
   
   
   PutItemRequest putItemRequest = PutItemRequest.builder()
                   .tableName(tableName)
                   .item(itemValues)
                   .build();
   dynamoDB.putItem(putItemRequest);
   ```

1. 扫描该表，以验证该项目是否已添加到表。

   ```
   ScanRequest scanRequest = ScanRequest.builder()
                   .tableName(tableName)
                   .build();
                   
   ScanResponse scanResponse = dynamoDB.scan(scanRequest);
   ```

------
#### [ Using the 适用于 Python (Boto3) 的 AWS SDK ]

1. 创建表。以下示例使用 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API 来创建名为 `myMusicTable` 的表。

   ```
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 5,
           'WriteCapacityUnits': 5
       },
   )
   
   table_arn = create_table_response['TableDescription']['TableArn']
   ```

1. 向此表添加标签。以下示例中的 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) API 将标签键值对 `Title: ProductManager` 添加到 `myMusicTable`。

   ```
   tag_resouce_response = ddb_client.tag_resource(
       ResourceArn=table_arn,
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ]
   )
   ```

1. 创建[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)并将其添加到附加了 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 托管式策略的角色，如以下示例所示。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
           "Effect": "Allow",
           "Action": "dynamodb:PutItem",
           "Resource": "arn:aws:dynamodb:*:*:table/*",
           "Condition": {
               "StringEquals": {
               "aws:ResourceTag/Title": "ProductManager"
               }
           }
           }
       ]
       }
   ```

------

   当附加到表的标签键和值与在策略中指定的标签匹配时，此策略支持对表执行 `PutItem` 操作。

1. 使用在步骤 3 中描述的策略代入该角色。

1. 使用 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 将项目放置到 `myMusicTable`。

   ```
   put_item_response = client.put_item(
       TableName = 'myMusicTable'
       Item = {
           'id': '2023',
           'title': 'Happy Day',
           'info': {
               'rating': '9',
               'artists': ['Acme Band','No One You Know'],
               'release_date': '2023-07-21'
           }
       }
   )
   ```

1. 扫描该表，以验证该项目是否已添加到表。

   ```
   scan_response = client.scan(
       TableName='myMusicTable'
   )
   ```

------

**不带 ABAC**  
如果您未为 AWS 账户启用 ABAC，则 IAM 策略和 DynamoDB 表中的标签条件将不匹配。因此，由于 `AmazonDynamoDBReadOnlyAccess` 策略的效果，`PutItem` 操作将返回 `AccessDeniedException`。

```
An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::123456789012:assumed-role/DynamoDBReadOnlyAccess/Alice is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:PutItem action.
```

**带有 ABAC**  
如果您为 AWS 账户启用了 ABAC，则 `put-item` 操作将成功完成，并向表中添加一个新项目。这是因为，如果 IAM 策略和表中的标签条件匹配，则表中的内联策略支持 `PutItem` 操作。

## 示例 2：使用 aws:RequestTag 支持操作
<a name="abac-allow-example-request-tag"></a>

使用 [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag) 条件键，可以将在请求中传递的标签键值对与在 IAM 策略中指定的标签对进行比较。例如，您可以支持特定操作，例如 `CreateTable`，如果标签条件不匹配，则使用 `aws:RequestTag`。为此，请执行以下步骤：

------
#### [ Using the AWS CLI ]

1. 创建[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)并将其添加到附加了 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) AWS 托管式策略的角色，如以下示例所示。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. 创建包含标签键值对 `"Owner": "John"` 的表。

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Owner,Value=John \
   --table-name myMusicTable
   ```

------
#### [ Using the 适用于 Python (Boto3) 的 AWS SDK ]

1. 创建[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)并将其添加到附加了 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 托管式策略的角色，如以下示例所示。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. 创建包含标签键值对 `"Owner": "John"` 的表。

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Owner',
               'Value': 'John'
           },
       ],
   )
   ```

------

**不带 ABAC**  
如果您未为 AWS 账户启用 ABAC，则内联策略和 DynamoDB 表中的标签条件将不匹配。因此，`CreateTable` 请求将失败，而不会创建您的表。

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/Admin/John is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:CreateTable action.
```

**带有 ABAC**  
如果您为 AWS 账户启用了 ABAC，则表创建请求将成功完成。由于 `CreateTable` 请求中存在标签键值对 `"Owner": "John"`，因此内联策略支持用户 `John` 执行 `CreateTable` 操作。

## 示例 3：使用 aws:TagKeys 拒绝操作
<a name="abac-deny-example-tag-key"></a>

使用 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 条件键，可以将请求中的标签键与在 IAM 策略中指定的键进行比较。例如，您可以拒绝特定的操作，例如 `CreateTable`，如果请求中*不* 存在特定的标签键，则使用 `aws:TagKeys`。为此，请执行以下步骤：

------
#### [ Using the AWS CLI ]

1. 将[客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)添加到附加了 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) AWS 托管式策略的角色中，如以下示例所示。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. 代入策略所附加到的角色，然后使用标签键 `Title` 创建表。

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Title,Value=ProductManager \
   --table-name myMusicTable
   ```

------
#### [ Using the 适用于 Python (Boto3) 的 AWS SDK ]

1. 将[客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)添加到附加了 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) AWS 托管式策略的角色中，如以下示例所示。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. 代入策略所附加到的角色，然后使用标签键 `Title` 创建表。

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ],
   )
   ```

------

**不带 ABAC**  
如果您未为 AWS 账户启用 ABAC，则 DynamoDB 不会在 `create-table` 命令中将标签键发送到 IAM。`Null` 条件可确保在请求中没有标签键时，条件的计算结果为 `false`。由于 `Deny` 策略不匹配，因此 `create-table` 命令成功完成。

**带有 ABAC**  
如果您为 AWS 账户启用了 ABAC，则在 `create-table` 命令中传递的标签键将传递给 IAM。标签键 `Title` 是根据 `Deny` 策略中存在的基于条件的标签键 `CostCenter` 进行评估的。由于 `StringNotEquals` 运算符的原因，标签键 `Title` 与 `Deny` 策略中存在的标签键不匹配。因此，`CreateTable` 操作将失败，而不会创建表。运行 `create-table` 命令会返回 `AccessDeniedException`。

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/DynamoFullAccessRole/ProductManager is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable with an explicit deny in an identity-based policy.
```

# 排除 DynamoDB 表和索引的常见 ABAC 错误
<a name="abac-troubleshooting"></a>

本主题为您在 DynamoDB 表或索引中实施 ABAC 时可能遇到的常见错误和问题提供故障排除建议。

## 策略中服务特定的条件键导致错误
<a name="abac-troubleshooting-service-specific-keys"></a>

服务特定的条件键不被视为有效的条件键。如果您在策略中使用了此类键，则会导致错误。要修复此问题，必须将服务特定的条件键替换为适当的用于在 DynamoDB 中[实施 ABAC 的条件键](attribute-based-access-control.md#condition-keys-implement-abac)。

例如，假设您在执行 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) 请求的[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)中使用了 `dynamodb:ResourceTag` 条件键。想象一下，请求失败并引发 `AccessDeniedException`。以下示例显示了带有 `dynamodb:ResourceTag` 条件键的错误内联策略。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "dynamodb:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

要修复此问题，请将 `dynamodb:ResourceTag` 条件键替换为 `aws:ResourceTag`，如以下示例所示。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

## 无法选择退出 ABAC
<a name="abac-troubleshooting-unable-opt-out"></a>

如果通过 支持 为账户启用了 ABAC，将无法通过 DynamoDB 控制台选择退出 ABAC。要选择退出，请联系 [支持](https://console.aws.amazon.com/support)。

*仅当* 满足以下条件时，才能自行选择退出 ABAC：
+ 您使用的是[通过 DynamoDB 控制台选择加入](abac-enable-ddb.md#abac-enable-console)的自助服务方式。
+ 您将在选择加入后的七个日历日内选择退出。

# DynamoDB 中的数据保护
<a name="data-protection"></a>

Amazon DynamoDB 为任务关键型和主要数据存储提供高度耐用的存储基础设施。在 Amazon DynamoDB 区域中，数据以冗余方式存储在多个设施间的多个设备中。

DynamoDB 可保护静态存储的用户数据，本地客户端与 DynamoDB 之间传输的数据，以及 DynamoDB 与同一 AWS 区域的其他 AWS 资源之间传输的数据。

**Topics**
+ [静态 DynamoDB 加密](EncryptionAtRest.md)
+ [使用 VPC 端点和 IAM 策略保护 DynamoDB 连接](inter-network-traffic-privacy.md)

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

# 使用 VPC 端点和 IAM 策略保护 DynamoDB 连接
<a name="inter-network-traffic-privacy"></a>

Amazon DynamoDB 与本地应用程序之间，以及 DynamoDB 与同一 AWS 区域内的其他 AWS 资源之间的连接受到保护。

## 端点所需的策略
<a name="inter-network-traffic-DescribeEndpoints"></a>

Amazon DynamoDB 提供了一个 [DescribeEndpoints](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeEndpoints.html) API，使您能够枚举区域端点信息。对于向公共 DynamoDB 端点发出的请求，无论配置的 DynamoDB IAM 策略如何，API 都会进行响应，即使 IAM 或 VPC 端点策略中设定了显式或隐式拒绝也是如此。这是因为 DynamoDB 有意跳过了 `DescribeEndpoints` API 的授权。

对于来自 VPC 端点的请求，IAM 和虚拟私有云（VPC）端点策略都必须使用 IAM `dynamodb:DescribeEndpoints` 操作，向发出请求的 Identity and Access Management（IAM）主体授权以进行 `DescribeEndpoints` API 调用。否则，将拒绝访问 `DescribeEndpoints` API。

下面是端点策略的一个示例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "dynamodb:DescribeEndpoints",
            "Resource": "*"
        }
    ]
}
```

------

## 服务与本地客户端和应用之间的流量
<a name="inter-network-traffic-privacy-on-prem"></a>

私有网络和 AWS 之间有两种连接方式：
+ AWS Site-to-Site VPN 连接。有关更多信息，请参阅《AWS Site-to-Site VPN 用户指南》**中的[什么是 AWS Site-to-Site VPN？](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。
+ Direct Connect 连接。有关更多信息，请参阅《Direct Connect 用户指南》**中的[什么是 Direct Connect？](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)。

通过网络访问 DynamoDB 通过 AWS 发布的 API 进行。客户端必须支持传输层安全性协议（TLS）1.2。我们建议使用 TLS 1.3。客户端还必须支持具有完全向前保密（PFS）的密码套件，例如 Ephemeral Diffie-Hellman（DHE）或 Elliptic Curve Diffie-Hellman Ephemeral（ECDHE）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。此外，必须使用与 IAM 主体关联的访问密钥 ID 和秘密访问密钥签名请求，或者可以使用 [AWS Security Token Service（STS）](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)生成临时安全证书来签名请求。

## 同一区域中 AWS 资源之间的流量
<a name="inter-network-traffic-privacy-within-region"></a>

DynamoDB 的 Amazon Virtual Private Cloud (Amazon VPC) 端点是 VPC 内的逻辑实体，仅允许连接到 DynamoDB。Amazon VPC 将请求路由到 DynamoDB 并将响应路由回 VPC。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)。有关可以用于控制 VPC 端点访问的示例策略，请参阅[使用 IAM 策略控制对 DynamoDB 的访问](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-ddb.html)。

**注意**  
不能通过 AWS Site-to-Site VPN 或 Direct Connect 访问 Amazon VPC 端点。

# AWS Identity and Access Management（IAM）和 DynamoDB
<a name="identity-and-access-mgmt"></a>

 AWS Identity and Access Management 是一项 AWS 服务，可以帮助管理员安全地控制对 AWS 资源的访问。管理员控制谁可以通过身份验证（登录）和获得授权（具有权限）来使用 Amazon DynamoDB 和 DynamoDB Accelerator 资源。您可以使用 IAM 管理 Amazon DynamoDB 和 DynamoDB Accelerator 的访问权限以及实施安全策略。IAM 是一项可以免费使用的 AWS 服务。

 

**Topics**
+ [适用于 Amazon DynamoDB 的 Identity and Access Management](security-iam.md)
+ [使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)

# 适用于 Amazon DynamoDB 的 Identity and Access Management
<a name="security-iam"></a>





AWS Identity and Access Management（IAM）是一项，AWS 服务可以帮助管理员安全地控制对 AWS 资源的访问。IAM 管理员控制谁可以*通过身份验证*（登录）和*获得授权*（具有权限）来使用 DynamoDB 资源。IAM 是一项无需额外费用即可使用的 AWS 服务。

**Topics**
+ [受众](#security_iam_audience)
+ [使用身份进行身份验证](#security_iam_authentication)
+ [使用策略管理访问](#security_iam_access-manage)
+ [Amazon DynamoDB 如何与 IAM 结合使用](security_iam_service-with-iam.md)
+ [适用于 Amazon DynamoDB 的基于身份的策略示例](security_iam_id-based-policy-examples.md)
+ [Amazon DynamoDB 身份和访问相关问题排查](security_iam_troubleshoot.md)
+ [用于防止购买 DynamoDB 预留容量的 IAM 策略](iam-policy-prevent-purchase-reserved-capacity.md)

## 受众
<a name="security_iam_audience"></a>

您使用 AWS Identity and Access Management（IAM）的方式因您的角色而异：
+ **服务用户**：如果您无法访问功能，请从管理员处请求权限（请参阅[Amazon DynamoDB 身份和访问相关问题排查](security_iam_troubleshoot.md)）
+ **服务管理员**：确定用户访问权限并提交权限请求（请参阅[Amazon DynamoDB 如何与 IAM 结合使用](security_iam_service-with-iam.md)）
+ **IAM 管理员**：编写用于管理访问权限的策略（请参阅[适用于 Amazon DynamoDB 的基于身份的策略示例](security_iam_id-based-policy-examples.md)）

## 使用身份进行身份验证
<a name="security_iam_authentication"></a>

身份验证是您使用身份凭证登录 AWS 的方法。您必须作为 AWS 账户根用户、IAM 用户或通过担任 IAM 角色进行身份验证。

您可以使用来自 AWS IAM Identity Center（IAM Identity Center）等身份源的凭证、单点登录身份验证或 Google/Facebook 凭证，以联合身份进行登录。有关登录的更多信息，请参阅《AWS 登录 用户指南》**中的[如何登录您的 AWS 账户](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

对于编程访问，AWS 提供了 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的 AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 账户 根用户
<a name="security_iam_authentication-rootuser"></a>

 当您创建 AWS 账户 时，最初使用的是一个对所有 AWS 服务和资源拥有完全访问权限的登录身份（称为 AWS 账户*根用户*）。我们强烈建议不要使用根用户进行日常任务。有关需要根用户凭证的任务，请参阅《IAM 用户指南》**中的[需要根用户凭证的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 联合身份
<a name="security_iam_authentication-federated"></a>

作为最佳实践，请要求人类用户必须使用带有身份提供者的联合身份验证才能使用临时凭证访问 AWS 服务。

*联合身份*是来自企业目录、Web 身份提供者的用户，或 Directory Service 中的用户（这些用户使用来自身份源的凭证访问 AWS 服务）。联合身份代入可提供临时凭证的角色。

要集中管理访问权限，建议使用。AWS IAM Identity Center有关更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[什么是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

### IAM 用户和群组
<a name="security_iam_authentication-iamuser"></a>

*[IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅*《IAM 用户指南》*中的[要求人类用户使用带有身份提供商的联合身份验证才能使用临时凭证访问 AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 AWS CLI 或 AWS API 操作来担任角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问
<a name="security_iam_access-manage"></a>

您将创建策略并将其附加到 AWS 身份或资源，以控制 AWS 中的访问。策略在与身份或资源关联时定义权限。当主体发出请求时，AWS 会评估这些策略。大多数策略在 AWS 中存储为 JSON 文档。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略
<a name="security_iam_access-manage-id-based-policies"></a>

基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略
<a name="security_iam_access-manage-resource-based-policies"></a>

基于资源的策略是附加到资源的 JSON 策略文档。示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。您必须在基于资源的策略中[指定主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

基于资源的策略是位于该服务中的内联策略。您不能在基于资源的策略中使用来自 IAM 的 AWS 托管策略。

### 其他策略类型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支持额外的策略类型，这些策略类型可以设置由更常用的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略（SCP）**– 指定 AWS Organizations 中组织或组织单元的最大权限。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略（RCP）**– 设置对账户中资源的最大可用权限。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[资源控制策略（RCP）](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型
<a name="security_iam_access-manage-multiple-policies"></a>

当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解 AWS 如何确定在涉及多种策略类型时是否允许请求，请参阅《IAM 用户指南》**中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

# Amazon DynamoDB 如何与 IAM 结合使用
<a name="security_iam_service-with-iam"></a>

在使用 IAM 管理对 DynamoDB 的访问之前，您应该了解哪些 IAM 功能可与 DynamoDB 结合使用。






| IAM 功能 | DynamoDB 支持 | 
| --- | --- | 
|  [基于身份的策略](#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [基于资源的策略](#security_iam_service-with-iam-resource-based-policies)  |   是  | 
|  [策略操作](#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [策略资源](#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [策略条件键](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACL](#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC（策略中的标签）](#security_iam_service-with-iam-tags)  |   是  | 
|  [临时凭证](#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [主体权限](#security_iam_service-with-iam-principal-permissions)  |   是  | 
|  [服务角色](#security_iam_service-with-iam-roles-service)  |   是  | 
|  [服务关联角色](#security_iam_service-with-iam-roles-service-linked)  |   是  | 

要大致了解 DynamoDB 和其他 AWS 服务如何与大多数 IAM 功能结合使用，请参阅《IAM 用户指南》**中的[与 IAM 结合使用的 AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

## 适用于 DynamoDB 的基于身份的策略
<a name="security_iam_service-with-iam-id-based-policies"></a>

**支持基于身份的策略：**是

基于身份的策略是可附加到身份（如 IAM 用户、用户组或角色）的 JSON 权限策略文档。这些策略控制用户和角色可在何种条件下对哪些资源执行哪些操作。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

通过使用 IAM 基于身份的策略，您可以指定允许或拒绝的操作和资源以及允许或拒绝操作的条件。要了解可在 JSON 策略中使用的所有元素，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素引用](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

### 适用于 DynamoDB 的基于身份的策略示例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



要查看 DynamoDB 基于身份的策略示例，请参阅[适用于 Amazon DynamoDB 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## DynamoDB 内基于资源的策略
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**支持基于资源的策略：**是

基于资源的策略是附加到资源的 JSON 策略文档。基于资源的策略的示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。对于在其中附加策略的资源，策略定义指定主体可以对该资源执行哪些操作以及在什么条件下执行。您必须在基于资源的策略中[指定主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。主体可以包括账户、用户、角色、联合用户或。AWS 服务

要启用跨账户访问，您可以将整个账户或其他账户中的 IAM 实体指定为基于资源的策略中的主体。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## DynamoDB 的策略操作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**支持策略操作：**是

管理员可以使用 AWS JSON 策略来指定谁有权访问什么内容。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

JSON 策略的 `Action` 元素描述可用于在策略中允许或拒绝访问的操作。在策略中包含操作以授予执行关联操作的权限。



要查看 DynamoDB 操作的列表，请参阅《服务授权参考》**中的 [Amazon DynamoDB 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。

DynamoDB 中的策略操作在操作前使用以下前缀：

```
aws
```

要在单个语句中指定多项操作，请使用逗号将它们隔开。

```
"Action": [
      "aws:action1",
      "aws:action2"
         ]
```





要查看 DynamoDB 基于身份的策略示例，请参阅[适用于 Amazon DynamoDB 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## DynamoDB 的策略资源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**支持策略资源：**是

管理员可以使用 AWS JSON 策略来指定谁有权访问什么内容。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Resource` JSON 策略元素指定要向其应用操作的一个或多个对象。作为最佳实践，请使用其 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)指定资源。对于不支持资源级权限的操作，请使用通配符 (\$1) 指示语句应用于所有资源。

```
"Resource": "*"
```

有关 DynamoDB 资源类型及其 ARN 的列表，请参阅《服务授权参考》**中的 [Amazon DynamoDB 定义的资源](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-resources-for-iam-policies)。要了解您可以在哪些操作中指定每个资源的 ARN，请参阅 [Amazon DynamoDB 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。





要查看 DynamoDB 基于身份的策略示例，请参阅[适用于 Amazon DynamoDB 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## DynamoDB 的策略条件键
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**支持特定于服务的策略条件键：**是

管理员可以使用 AWS JSON 策略来指定谁有权访问什么内容。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Condition` 元素根据定义的条件指定语句何时执行。您可以创建使用[条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)（例如，等于或小于）的条件表达式，以使策略中的条件与请求中的值相匹配。要查看所有 AWS 全局条件键，请参阅《IAM 用户指南》**中的 [AWS 全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

要查看 DynamoDB 条件键的列表，请参阅《服务授权参考》**中的 [Amazon DynamoDB 的条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-policy-keys)。要了解您可以对哪些操作和资源使用条件键，请参阅 [Amazon DynamoDB 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。

要查看 DynamoDB 基于身份的策略示例，请参阅[适用于 Amazon DynamoDB 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## DynamoDB 中的访问控制列表（ACL）
<a name="security_iam_service-with-iam-acls"></a>

**支持 ACL：**否 

访问控制列表（ACL）控制哪些主体（账户成员、用户或角色）有权访问资源。ACL 与基于资源的策略类似，但它们不使用 JSON 策略文档格式。

## 使用 Amazon DynamoDB 的基于属性的访问权限控制（ABAC）
<a name="security_iam_service-with-iam-tags"></a>

**支持 ABAC（策略中的标签）：**是

基于属性的访问权限控制（ABAC）是一种授权策略，该策略基于称为标签的属性来定义权限。您可以将标签附加到 IAM 实体和 AWS 资源，然后设计 ABAC 策略，以支持在主体的标签与资源上的标签匹配时执行操作。

要基于标签控制访问，您需要使用 `aws:ResourceTag/key-name``aws:RequestTag/key-name` 或 `aws:TagKeys` 条件键在策略的[条件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中提供标签信息。

如果某个服务对于每种资源类型都支持所有这三个条件键，则对于该服务，该值为**是**。如果某个服务仅对于部分资源类型支持所有这三个条件键，则该值为**部分**。

有关 ABAC 的更多信息，请参阅《IAM 用户指南》**中的[使用 ABAC 授权定义权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。要查看设置 ABAC 步骤的教程，请参阅《IAM 用户指南》**中的[使用基于属性的访问权限控制（ABAC）](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。

## 将临时凭证用于 DynamoDB
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**支持临时凭证：**是

临时凭证提供对 AWS 资源的短期访问权限，并且是在您使用联合身份验证或切换角色时自动创建的。AWS 建议您动态生成临时凭证，而不是使用长期访问密钥。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)和[使用 IAM 的。AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

## DynamoDB 的跨服务主体权限
<a name="security_iam_service-with-iam-principal-permissions"></a>

**支持转发访问会话（FAS）：**是

 转发访问会话（FAS）使用调用 AWS 服务 的主体的权限，与发出请求的 AWS 服务 结合，向下游服务发出请求。有关发出 FAS 请求时的策略详情，请参阅[转发访问会话](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)。

## DynamoDB 的服务角色
<a name="security_iam_service-with-iam-roles-service"></a>

**支持服务角色：**是

 服务角色是由一项服务担任、代表您执行操作的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。IAM 管理员可以在 IAM 中创建、修改和删除服务角色。有关更多信息，请参阅《IAM 用户指南》**中的[创建向 AWS 服务 委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**警告**  
更改服务角色的权限可能会破坏 DynamoDB 的功能。仅当 DynamoDB 提供相关指导时才编辑服务角色。

## DynamoDB 的服务相关角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**支持服务关联角色：**是

 服务关联角色是一种与 AWS 服务 关联的服务角色。服务可以代入代表您执行操作的角色。服务关联角色显示在您的 AWS 账户 中，并由该服务拥有。IAM 管理员可以查看但不能编辑服务关联角色的权限。

有关创建或管理服务相关角色的详细信息，请参阅[能够与 IAM 搭配使用的 AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。在表中查找**服务相关角色**列中包含 `Yes` 的表。选择**是**链接以查看该服务的服务相关角色文档。

### DynamoDB 中支持的服务相关角色
<a name="security_iam_service-with-iam-roles-service-linked-supported-by-dynamodb"></a>

DynamoDB 支持以下服务相关角色。
+ DynamoDB 使用服务相关角色 **AWSServiceRoleForDynamoDBReplication** 跨 AWS 区域进行全局表复制。有关 **AWSServiceRoleForDynamoDBReplication** 服务相关角色的更多信息，请参阅[DynamoDB 全局表安全性](globaltables-security.md)。
+ DynamoDB Accelerator（DAX）使用服务相关角色 **AWSServiceRoleForDAX** 来配置和维护 DAX 集群。有关 **AWSServiceRoleForDAX** 服务相关角色的更多信息，请参阅[使用 DAX 的服务相关 IAM 角色](using-service-linked-roles.md)。

除了这些 DynamoDB 服务相关角色外，DynamoDB 还使用 Application Auto Scaling 服务来自动管理有关预置容量模式表的吞吐量设置。Application Auto Scaling 服务使用服务相关角色 **AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable** 来管理有关启用了自动扩缩的 DynamoDB 表的吞吐量设置。有关更多信息，请参阅 [Service-linked roles for Application Auto Scaling](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)。

# 适用于 Amazon DynamoDB 的基于身份的策略示例
<a name="security_iam_id-based-policy-examples"></a>

原定设置情况下，用户和角色没有创建或修改 DynamoDB 资源的权限。要授予用户对所需资源执行操作的权限，IAM 管理员可以创建 IAM 策略。

要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

有关 DynamoDB 定义的操作和资源类型的详细信息，包括每种资源类型的 ARN 格式，请参阅《服务授权参考》**中的 [Amazon DynamoDB 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)。

**Topics**
+ [策略最佳实践](#security_iam_service-with-iam-policy-best-practices)
+ [使用 DynamoDB 控制台](#security_iam_id-based-policy-examples-console)
+ [允许用户查看他们自己的权限](#security_iam_id-based-policy-examples-view-own-permissions)
+ [将基于身份的策略与 Amazon DynamoDB 结合使用](using-identity-based-policies.md)

## 策略最佳实践
<a name="security_iam_service-with-iam-policy-best-practices"></a>

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 DynamoDB 资源。这些操作可能会使 AWS 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **AWS 托管式策略及转向最低权限许可入门**：要开始向用户和工作负载授予权限，请使用 *AWS 托管式策略*来为许多常见使用场景授予权限。您可以在 AWS 账户 中找到这些策略。建议通过定义特定于您的使用场景的 AWS 客户托管式策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的 AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果通过特定 AWS 服务（例如 CloudFormation）使用服务操作，您还可以使用条件来授予对服务操作的访问权限。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证（MFA）**：如果您所处的场景要求您的 AWS 账户 中有 IAM 用户或根用户，请启用 MFA 来提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 使用 DynamoDB 控制台
<a name="security_iam_id-based-policy-examples-console"></a>

要访问 Amazon DynamoDB 控制台，您必须具有一组最低的权限。这些权限必须允许您列出和查看有关您的 AWS 账户中的 DynamoDB 资源的详细信息。如果创建比必需的最低权限更为严格的基于身份的策略，对于附加了该策略的实体（用户或角色），控制台将无法按预期正常运行。

对于只需要调用 AWS CLI 或 AWS API 的用户，无需为其提供最低控制台权限。相反，只允许访问与其尝试执行的 API 操作相匹配的操作。

要确保用户和角色仍可使用 DynamoDB 控制台，请将 DynamoDB `ConsoleAccess` 或 `ReadOnly` AWS 托管式策略也添加到实体。有关更多信息，请参阅《IAM 用户指南》**中的[为用户添加权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)。

## 允许用户查看他们自己的权限
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

该示例说明了您如何创建策略，以允许 IAM 用户查看附加到其用户身份的内联和托管式策略。此策略包括在控制台上完成此操作或者以编程方式使用 AWS CLI 或 AWS API 所需的权限。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# 将基于身份的策略与 Amazon DynamoDB 结合使用
<a name="using-identity-based-policies"></a>

该主题涵盖了将基于身份的 AWS Identity and Access Management（IAM）策略与 Amazon DynamoDB 结合使用并提供了示例。示例说明账户管理员如何将权限策略附加到 IAM 身份（即用户、组和角色），从而授予对 Amazon DynamoDB 资源执行操作的权限。

本主题的各个部分涵盖以下内容：
+ [使用 Amazon DynamoDB 控制台所需的 IAM 权限](#console-permissions)
+ [适用于 Amazon DynamoDB 的 AWS 托管式（预定义）IAM 策略](#access-policy-examples-aws-managed)
+ [客户管理型策略示例](#access-policy-examples-for-sdk-cli)



下面是权限策略的示例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DescribeQueryScanBooksTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:111122223333:table/Books"
        }
    ]
}
```

------

 该策略有一条语句用于为针对 `us-west-2` AWS 区域中的某个表（由 `account-id` 指定的 AWS 账户所有）的三项 DynamoDB 操作（`dynamodb:DescribeTable`、`dynamodb:Query` 和 `dynamodb:Scan`)）授予权限。`Resource` 值中的 *Amazon 资源名称（ARN）*指定了要应用权限的表。

## 使用 Amazon DynamoDB 控制台所需的 IAM 权限
<a name="console-permissions"></a>

要使用 DynamoDB 控制台，用户必须拥有一组最低权限来允许他们使用 AWS 账户中的 DynamoDB 资源。除这些 DynamoDB 权限以外，控制台还需要权限：
+ 显示指标和图形的 Amazon CloudWatch 权限。
+ AWS Data Pipeline导出和导入 DynamoDB 数据的 权限。
+  AWS Identity and Access Management访问导出和导入所需角色的 权限。
+ 每当触发 CloudWatch 警报时通知您的 Amazon Simple Notification Service 权限。
+ AWS Lambda处理 DynamoDB Streams 记录的 权限。

如果创建比必需的最低权限更为严格的 IAM 策略，对于附加了该 IAM 策略的用户， 控制台将无法按预期正常运行。为确保这些用户仍可使用 DynamoDB 控制台，也可向用户附加 `AmazonDynamoDBReadOnlyAccess` AWS 托管策略，如 [适用于 Amazon DynamoDB 的 AWS 托管式（预定义）IAM 策略](#access-policy-examples-aws-managed) 中所述。

对于只需要调用 AWS CLI 或 Amazon DynamoDB API 的用户，您无需为其提供最低控制台权限。

**注意**  
 如果涉及 VPC 端点，您还需要授权 DescribeEndpoints API 调用，以通过 IAM 操作 (dynamodb:DescribeEndpoints) 请求 IAM 主体。有关更多信息，请参阅 [端点所需的策略](inter-network-traffic-privacy.md#inter-network-traffic-DescribeEndpoints)。

## 适用于 Amazon DynamoDB 的 AWS 托管式（预定义）IAM 策略
<a name="access-policy-examples-aws-managed"></a>

AWS 通过提供由 AWS 创建和管理的独立 IAM 策略来满足许多常用案例的要求。这些 AWS 托管策略可针对常用案例授予必要的权限，使您不必调查所需权限。有关更多信息，请参阅 *IAM 用户指南*中的 [AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

下面的 AWS 托管式策略可附加到您账户中的用户，这些托管式策略特定于 DynamoDB 并且按使用案例场景进行分组：
+ **AmazonDynamoDBReadOnlyAccess** – 通过 AWS 管理控制台授予对 DynamoDB 资源的只读访问权限。
+ **AmazonDynamoDBFullAccess** – 通过 AWS 管理控制台授予对 DynamoDB 资源的完全访问权限。

您可以通过登录到 IAM 控制台并在该控制台中搜索特定策略来查看这些 AWS 托管权限策略。

**重要**  
最佳实践是创建自定义 IAM 策略，从而向有需要的用户、角色或组授予[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

## 客户管理型策略示例
<a name="access-policy-examples-for-sdk-cli"></a>

本节的用户策略示例介绍如何授予各 DynamoDB 操作权限的策略示例。当您使用 AWS SDK 或 AWS CLI 时，可以使用这些策略。当您使用控制台时，您需要授予特定于控制台的其他权限。有关更多信息，请参阅 [使用 Amazon DynamoDB 控制台所需的 IAM 权限](#console-permissions)。

**注意**  
以下所有策略示例都使用一个 AWS 区域并包含虚构的账户 ID 和表名。

示例：
+ [用于向表上的所有 DynamoDB 操作授予权限的 IAM 策略](grant-permissions-to-any-action-on-table.md)
+ [用于授予对 DynamoDB 表中项目的只读权限的 IAM 策略](read-only-permissions-on-table-items.md)
+ [用于授予对特定 DynamoDB 表及其索引的访问权限的 IAM 策略](iam-policy-specific-table-indexes.md)
+ [用于对 DynamoDB 表进行读取、写入、更新和删除访问的 IAM 策略](iam-policy-example-data-crud.md)
+ [用于在同一 AWS 账户中隔离 DynamoDB 环境的 IAM 策略](iam-policy-separate-environments.md)
+ [用于防止购买 DynamoDB 预留容量的 IAM 策略](iam-prevent-purchase-reserved-capacity.md)
+ [仅授予 DynamoDB 流的读取访问权限的 IAM 策略（不适用于表）](iam-policy-read-stream-only.md)
+ [允许 AWS Lambda 函数访问 DynamoDB 流记录的 IAM 策略](iam-policy-example-lamda-process-dynamodb-streams.md)
+ [用于对 DynamoDB Accelerator（DAX）集群进行读写访问的 IAM 策略](iam-policy-example-read-write-dax-access.md)

 *IAM 用户指南*，包含[另外三个 DynamoDB 示例](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html)：
+ [Amazon DynamoDB：允许访问特定的表](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)
+ [Amazon DynamoDB：允许访问特定的列](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_columns.html)
+ [Amazon DynamoDB：允许基于 Amazon Cognito ID 对 DynamoDB 进行行级别访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html)

# 用于向表上的所有 DynamoDB 操作授予权限的 IAM 策略
<a name="grant-permissions-to-any-action-on-table"></a>

以下权限策略用于授予允许对 `Books` 表执行*所有* DynamoDB 操作的权限。`Resource` 中指定的资源 ARN 用于标识特定 AWS 区域中的表。如果将 `Resource` ARN 中的表名 `Books` 替换为通配符（\$1），则在账户的*所有*表上允许*所有* DynamoDB 操作。在此策略或任何 IAM 策略上使用通配符之前，请仔细考虑可能带来的安全影响。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

**注意**  
这是使用通配符 (\$1) 允许*全部*操作的示例，包括管理、数据操作、监控和购买 DynamoDB 预留容量。相反，最佳实践是明确指定要授予的每个操作以及仅指定该用户、角色或组需要的操作。

# 用于授予对 DynamoDB 表中项目的只读权限的 IAM 策略
<a name="read-only-permissions-on-table-items"></a>

以下权限策略用于授予 `GetItem`、`BatchGetItem`、`Scan`、`Query` 和 `ConditionCheckItem` 仅 DynamoDB 操作，因此，在 `Books` 表设置只读访问权。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

# 用于授予对特定 DynamoDB 表及其索引的访问权限的 IAM 策略
<a name="iam-policy-specific-table-indexes"></a>

以下策略授予允许对名为 `Books` 的 DynamoDB 表及所有索引执行数据修改操作的权限。有关索引工作原理的更多信息，请参阅 [在 DynamoDB 中使用二级索引改进数据访问](SecondaryIndexes.md)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessTableAllIndexesOnBooks",
            "Effect": "Allow",
            "Action": [
              "dynamodb:PutItem",
              "dynamodb:UpdateItem",
              "dynamodb:DeleteItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:GetItem",
              "dynamodb:BatchGetItem",
              "dynamodb:Scan",
              "dynamodb:Query",
              "dynamodb:ConditionCheckItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

# 用于对 DynamoDB 表进行读取、写入、更新和删除访问的 IAM 策略
<a name="iam-policy-example-data-crud"></a>

如果您需要允许应用程序创建、读取、更新和删除 Amazon DynamoDB 表、索引和流中的数据，请使用此策略。请根据情况替换 AWS 区域名称、账户 ID 以及表名称或通配符（\$1）。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBIndexAndStreamAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetShardIterator",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/stream/*"
            ]
        },
        {
            "Sid": "DynamoDBTableAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:PutItem",
                "dynamodb:DescribeTable",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        },
        {
            "Sid": "DynamoDBDescribeLimitsAccess",
            "Effect": "Allow",
            "Action": "dynamodb:DescribeLimits",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

要扩展此策略以覆盖此帐户所有 AWS 区域的所有 DynamoDB 表，请使用通配符 (\$1) 作为区域和表名。例如：

```
"Resource":[
                "arn:aws:dynamodb:*:123456789012:table/*",
                "arn:aws:dynamodb:*:123456789012:table/*/index/*"
                ]
```

# 用于在同一 AWS 账户中隔离 DynamoDB 环境的 IAM 策略
<a name="iam-policy-separate-environments"></a>

假设您拥有单独的环境，其中每个环境都持有自己的名为 `ProductCatalog` 的表版本。如果您通过同一个 AWS 账户创建两个 `ProductCatalog` 表，由于权限的设置方式，可能影响其他环境。例如，关于并发控制面板操作（例如 `CreateTable`）数量的配额在 AWS 账户级别进行设置。

因此，一个环境中的每个操作都会减少另一个环境中可执行的操作数量。同时，一个环境中的代码还存在意外访问另一个环境中的表的风险。

**注意**  
如果您希望分离生产和测试工作负载以帮助控制事件的潜在“爆炸半径”，最佳实践是创建单独的 AWS 用于测试和生产工作负载。有关更多信息，请参阅 [AWS 账户管理和分离](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html)。

进一步假设您有两个开发人员（Bob 和 Alice），他们在对 `ProductCatalog` 表进行测试。每个开发人员无需单独 AWS 账户，您的开发人员可以共享同一个测试 AWS 账户。在此测试账户中，您可以创建同一个表的副本（如 `Alice_ProductCatalog` 和 `Amit_ProductCatalog`），以便每个开发人员都可以对其执行操作。在这种情况下，您可以在为测试环境创建的 AWS 账户中创建用户 Alice 和 Bob。然后，您可以授予这些用户对其拥有的表执行 DynamoDB 操作的权限。

要向这些 IAM 用户授予权限，您可以执行以下任一操作：
+ 为每个用户创建单独的策略，然后分别将每个策略挂载到相应用户。例如，您可以将以下策略挂载到用户 Alice，允许她对 `Alice_ProductCatalog` 表执行 DynamoDB 操作：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AllAPIActionsOnAliceTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:DescribeContributorInsights",
                "dynamodb:RestoreTableToPointInTime",
                "dynamodb:ListTagsOfResource",
                "dynamodb:CreateTableReplica",
                "dynamodb:UpdateContributorInsights",
                "dynamodb:CreateBackup",
                "dynamodb:DeleteTable",
                "dynamodb:UpdateTableReplicaAutoScaling",
                "dynamodb:UpdateContinuousBackups",
                "dynamodb:TagResource",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:BatchGetItem",
                "dynamodb:UpdateTimeToLive",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:UntagResource",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteTableReplica",
                "dynamodb:DescribeTimeToLive",
                "dynamodb:RestoreTableFromBackup",
                "dynamodb:UpdateTable",
                "dynamodb:DescribeTableReplicaAutoScaling",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:DescribeLimits",
                "dynamodb:ListStreams"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog/*"
          }
      ]
  }
  ```

------

  然后，您可以使用其他资源（`Amit_ProductCatalog` 表）为用户 Bob 创建类似的策略。
+ 您可以使用 IAM 策略变量编写一项策略并将其挂载到某个组，而不是为各个用户挂载策略。在此示例中，您需要创建一个组，并且将用户 Alice 和用户 Bob 添加到这个组中。以下示例授予对 `${aws:username}_ProductCatalog` 表执行所有 DynamoDB 操作的权限。评估策略时，策略变量 `${aws:username}` 将替换为请求者的用户名称。例如，如果 Alice 发送一个添加项目的请求，那么只有当 Alice 向 `Alice_ProductCatalog` 表中添加项目时才能执行这一操作。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ActionsOnUserSpecificTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog"
          },
          {
              "Sid": "AdditionalPrivileges",
              "Effect": "Allow",
              "Action": [
                  "dynamodb:ListTables",
                  "dynamodb:DescribeTable",
                  "dynamodb:DescribeContributorInsights"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/*"
          }
      ]
  }
  ```

------

**注意**  
使用 IAM 策略变量时，您必须在策略中明确指定访问 IAM 策略语言的 `2012-10-17` 版本。IAM 策略语言（`2008-10-17`）的默认版本不支持策略变量。

您无需将特定表标识为资源，可以使用通配符 (\$1) 为所有名称以发出请求的用户名称为前缀的表授予权限，如下所示。

```
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"
```

# 用于防止购买 DynamoDB 预留容量的 IAM 策略
<a name="iam-prevent-purchase-reserved-capacity"></a>

对于 Amazon DynamoDB 预留容量，您可以支付一次性预付费用并承诺在一段时间内支付最低用量级别的费用，从而节省大量成本。您可以通过 AWS 管理控制台 查看和购买预留容量。不过，您可能不希望您企业中的所有用户都能购买预留容量。有关预留容量的更多信息，请参阅 [Amazon DynamoDB 定价](https://aws.amazon.com/dynamodb/pricing)。

DynamoDB 提供以下 API 操作，以便控制对预留容量管理的访问：
+ `dynamodb:DescribeReservedCapacity` - 返回当前有效的预留容量购买信息。
+ `dynamodb:DescribeReservedCapacityOfferings` - 返回有关 当前提供的预留容量计划的详细信息。AWS
+ `dynamodb:PurchaseReservedCapacityOfferings` - 实际购买预留容量。

AWS 管理控制台 使用这些 API 操作来显示预留容量的相关信息以及进行购买。您无法从应用程序调用这些操作，因为它们只能通过控制台进行访问。但是，您可以在 IAM 权限策略中允许或拒绝对这些操作的访问。

以下策略允许用户通过 AWS 管理控制台查看预留容量服务和当前购买情况，但是新购买请求将会被拒绝。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

请注意，此策略使用通配符 (\$1) 来允许对所有 、 和 到 拒绝 的 购买所有的 DynamoDB 预留容量。

# 仅授予 DynamoDB 流的读取访问权限的 IAM 策略（不适用于表）
<a name="iam-policy-read-stream-only"></a>

当您对表启用 DynamoDB Streams 时，将捕获有关对表中的数据项目进行的每项修改的信息。有关更多信息，请参阅 [将更改数据捕获用于 DynamoDB Streams](Streams.md)。

在某些情况下，您可能需要阻止应用程序从 DynamoDB 表中读取数据，同时仍允许访问该表的流。例如，您可以配置 AWS Lambda 以在检测到项目更新时轮询流并调用 Lambda 函数，然后再执行其他处理。

您可以通过执行以下操作来控制对 DynamoDB streams 的访问：
+ `dynamodb:DescribeStream`
+ `dynamodb:GetRecords`
+ `dynamodb:GetShardIterator`
+ `dynamodb:ListStreams`

下面的示例策略向用户授予权限以便其访问名为 `GameScores` 的表中的流。ARN 中的通配符 (\$1) 用于匹配与该表关联的所有流。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessGameScoresStreamOnly",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

请注意，此策略允许访问 `GameScores` 表流，但不允许访问该表本身。

# 允许 AWS Lambda 函数访问 DynamoDB 流记录的 IAM 策略
<a name="iam-policy-example-lamda-process-dynamodb-streams"></a>

如果您希望基于 DynamoDB 流中的新事件执行特定操作，则可以编写一个由这些事件触发的 AWS Lambda 函数。诸如此类的 Lambda 函数需要拥有从 DynamoDB 流中读取数据的权限。有关将 Lambda 与 DynamoDB Streams 结合使用的更多信息，请参阅[DynamoDB Streams 和 AWS Lambda 触发器](Streams.Lambda.md)。

要向 Lambda 授予权限，请使用与 Lambda 函数的 IAM 角色关联的权限策略（也称为执行角色）。在创建 Lambda 函数时指定此策略。

例如，您可以将以下权限策略与该执行角色相关联，从而向 Lambda 授予执行所列 DynamoDB Streams 操作的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "APIAccessForDynamoDBStreams",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

有关授予权限的更多信息，请参阅 *AWS Lambda 开发人员指南*的 [AWS Lambda 权限](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)。

# 用于对 DynamoDB Accelerator（DAX）集群进行读写访问的 IAM 策略
<a name="iam-policy-example-read-write-dax-access"></a>

以下策略 允许读取、写入、更新和删除访问权限 DynamoDB Accelerator(DAX) 集群，而不是关联的 DynamoDB 表。要使用此策略，请替换 AWS 区域名称、您的账户 ID 以及 DAX 集群的名称。

**注意**  
此策略允许访问 DAX 集群，但不适用于关联 DynamoDB 表。确保您的 DAX 集群具有正确的策略来代表您对 DynamoDB 表执行这些相同的操作。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AmazonDynamoDBDAXDataOperations",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:PutItem",
                "dax:ConditionCheckItem",
                "dax:BatchGetItem",
                "dax:BatchWriteItem",
                "dax:DeleteItem",
                "dax:Query",
                "dax:UpdateItem",
                "dax:Scan"
            ],
            "Resource": "arn:aws:dax:eu-west-1:123456789012:cache/MyDAXCluster"
        }
    ]
}
```

------

要扩展此策略以覆盖一个账户在所有 AWS 区域的 DAX 访问权限，请使用通配符（\$1）作为区域名称。

```
"Resource": "arn:aws:dax:*:123456789012:cache/MyDAXCluster"
```







# Amazon DynamoDB 身份和访问相关问题排查
<a name="security_iam_troubleshoot"></a>

使用以下信息帮助您诊断和修复在使用 DynamoDB 和 IAM 时可能遇到的常见问题。

**Topics**
+ [我无权在 DynamoDB 中执行操作](#security_iam_troubleshoot-no-permissions)
+ [我无权执行 iam:PassRole](#security_iam_troubleshoot-passrole)
+ [我希望允许我的 AWS 账户以外的人访问我的 DynamoDB 资源](#security_iam_troubleshoot-cross-account-access)

## 我无权在 DynamoDB 中执行操作
<a name="security_iam_troubleshoot-no-permissions"></a>

如果AWS 管理控制台告诉您，无权执行某个操作，则必须联系管理员寻求帮助。管理员是指提供用户名和密码的人员。

当 `mateojackson` 用户尝试使用控制台查看有关虚构 `my-example-widget` 资源的详细信息，但不拥有虚构 `aws:GetWidget` 权限时，会发生以下示例错误。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: aws:GetWidget on resource: my-example-widget
```

在这种情况下，Mateo 请求他的管理员更新其策略，以允许他使用 `aws:GetWidget` 操作访问 `my-example-widget` 资源。

## 我无权执行 iam:PassRole
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到一个错误，表明您无权执行 `iam:PassRole` 操作，则必须更新策略以允许您将角色传递给 DynamoDB。

有些 AWS 服务 允许将现有角色传递到该服务，而不是创建新服务角色或服务关联角色。为此，您必须具有将角色传递到服务的权限。

当名为 `marymajor` 的 IAM 用户尝试使用控制台在 DynamoDB 中执行操作时，会发生以下示例错误。但是，服务必须具有服务角色所授予的权限才可执行此操作。Mary 不具有将角色传递到服务的权限。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在这种情况下，必须更新 Mary 的策略以允许她执行 `iam:PassRole` 操作。

如果您需要帮助，请联系 AWS 管理员。您的管理员是提供登录凭证的人。

## 我希望允许我的 AWS 账户以外的人访问我的 DynamoDB 资源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以创建一个角色，以便其他账户中的用户或您组织外的人员可以使用该角色来访问您的资源。您可以指定谁值得信赖，可以代入角色。对于支持基于资源的策略或访问控制列表（ACL）的服务，您可以使用这些策略向人员授予对您的资源的访问权。

要了解更多信息，请参阅以下内容：
+ 要了解 DynamoDB 是否支持这些功能，请参阅[Amazon DynamoDB 如何与 IAM 结合使用](security_iam_service-with-iam.md)。
+ 要了解如何为您拥有的 AWS 账户中的资源提供访问权限，请参阅《IAM 用户指南》**中的[为您拥有的另一个 AWS 账户中的 IAM 用户提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。
+ 要了解如何为第三方 AWS 账户 提供您的资源的访问权限，请参阅《IAM 用户指南》**中的[为第三方拥有的 AWS 账户 提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ 要了解如何通过身份联合验证提供访问权限，请参阅《IAM 用户指南》**中的[为经过外部身份验证的用户（身份联合验证）提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 要了解使用角色和基于资源的策略进行跨账户访问之间的差别，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 用于防止购买 DynamoDB 预留容量的 IAM 策略
<a name="iam-policy-prevent-purchase-reserved-capacity"></a>

对于 Amazon DynamoDB 预留容量，您可以支付一次性预付费用并承诺在一段时间内支付最低用量级别的费用，从而节省大量成本。您可以通过 AWS 管理控制台 查看和购买预留容量。不过，您可能不希望您企业中的所有用户都能购买预留容量。有关预留容量的更多信息，请参阅 [Amazon DynamoDB 定价](https://aws.amazon.com/dynamodb/pricing)。

DynamoDB 提供以下 API 操作，以便控制对预留容量管理的访问：
+ `dynamodb:DescribeReservedCapacity` - 返回当前有效的预留容量购买信息。
+ `dynamodb:DescribeReservedCapacityOfferings` - 返回有关 当前提供的预留容量计划的详细信息。AWS
+ `dynamodb:PurchaseReservedCapacityOfferings` - 实际购买预留容量。

AWS 管理控制台 使用这些 API 操作来显示预留容量的相关信息以及进行购买。您无法从应用程序调用这些操作，因为它们只能通过控制台进行访问。但是，您可以在 IAM 权限策略中允许或拒绝对这些操作的访问。

以下策略允许用户通过 AWS 管理控制台查看预留容量服务和当前购买情况，但是新购买请求将会被拒绝。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

请注意，此策略使用通配符 (\$1) 来允许对所有 、 和 到 拒绝 的 购买所有的 DynamoDB 预留容量。

# 使用 IAM 策略条件进行精细访问控制
<a name="specifying-conditions"></a>

在 DynamoDB 中授予权限时，可以指定确定权限策略如何生效的条件。

## 概述
<a name="FGAC_DDB.Overview"></a>

在 DynamoDB 中，您可以在使用 IAM 策略授予权限时指定条件（请参阅[适用于 Amazon DynamoDB 的 Identity and Access Management](security-iam.md)）。例如，您可以：
+ 授予权限，允许用户只读访问表或二级索引的特定项目和属性。
+ 根据用户身份授予权限，允许用户只写访问表的特定属性。

在 DynamoDB 中，您可以使用条件键在 IAM 策略中指定条件，如以下部分中的使用案例所示。

### 权限使用案例
<a name="FGAC_DDB.OverviewUseCase"></a>

除了对 DynamoDB API 操作的权限进行控制外，您还可以控制对单个的数据项目和属性的访问。例如，您可以执行以下操作：
+ 对表授予权限，但根据特定主键值限制对该表中特定项目的访问。例如，在游戏社交网络应用程序中，所有用户的游戏数据均存储在一个表中，但是用户不能访问不归自己所有的数据项目，如下图所示：  
![\[一种用例，它向用户授予表级访问权限，但限制对特定数据项的访问。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/info-hiding-horizontal.png)
+ 隐藏信息，仅向用户显示属性的子集。例如，根据用户位置显示附近机场航班数据的应用程序。航空公司名称、到达和起飞时间以及航班号均会显示。但是，飞行员姓名或乘客数量之类的属性会被隐藏，如下图所示：  
![\[一种用例，仅向用户显示数据子集，但隐藏数据的某些属性。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/info-hiding-vertical.png)

要实现如此精细的访问控制，您可以编写 IAM 权限策略，用于指定访问安全凭证和相关权限的条件。然后，将该策略应用于您使用 IAM 控制台创建的 用户、组或角色。您的 IAM 策略可以对表中单个项目的访问和项目中属性的访问实施单独控制，也可以同时控制。

您可以视情况使用 Web 联合身份验证控制使用 Login with Amazon、Facebook 或 Google 进行身份验证的用户访问。有关更多信息，请参阅 [使用 Web 身份联合验证](WIF.md)。

您可以使用 IAM `Condition` 元素实现精细的访问控制策略。通过向权限策略添加 `Condition` 元素，您可以根据特定业务要求允许或拒绝对 DynamoDB 表和索引中的项目和属性的访问。

本视频介绍 DynamoDB 中使用 IAM 策略条件进行的精细访问控制。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi)


## 了解 DynamoDB 中的精细访问权限控制
<a name="FGAC_DDB.UnderstandingFineGrainedAccess"></a>

通过 DynamoDB 中的精细访问权限控制，您可以在多个级别创建精确的权限边界：

1. **项目级访问控制**：限制用户只能访问包含特定键值的项目，这通常与其身份或权限范围相匹配。

1. **属性级访问控制**：限制用户可以查看或修改的属性（列），这样您便能够保护敏感信息，同时允许访问相同项目中的非敏感数据。

1. **特定于操作的控制**：根据所执行的操作类型，应用不同的权限规则。

这些控制是通过 IAM 策略，使用特定于 DynamoDB 的条件键来实施的。

## 指定条件：使用条件键
<a name="FGAC_DDB.ConditionKeys"></a>

AWS 为支持通过 IAM 进行访问控制的所有 AWS 服务提供了一组预定义条件键（AWS 范围内的条件键）。例如，您可以先使用 `aws:SourceIp` 条件键检查请求者的 IP 地址，然后再允许执行操作。有关更多信息和 AWS 范围条件键的列表，请参阅 IAM 用户指南中的[可用条件键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)。

以下是特定于 DynamoDB 服务的条件键，适用于 DynamoDB。

**`dynamodb:LeadingKeys`**  
表示表的第一个键属性，即分区键。键名称 `LeadingKeys` 是复数，即使该键用于单一项目操作亦如此。此外，在条件中使用 `ForAllValues` 时，必须使用 `LeadingKeys` 修饰符。

**`dynamodb:Select`**  
表示请求的 `Select` 参数。`Select` 参数可能为以下任一值：  
+ `ALL_ATTRIBUTES`
+ `ALL_PROJECTED_ATTRIBUTES`
+ `SPECIFIC_ATTRIBUTES`
+ `COUNT`
虽然此条件键通常与查询和扫描操作关联，但它适用于所有返回项目属性的 DynamoDB 操作，对于控制所有 API 操作的属性访问至关重要。在此条件键上使用 StringEqualsIfExists 或类似约束将对此条件键所适用的操作施加约束，对于不适用的操作则忽略约束。

**`dynamodb:Attributes`**  
代表请求所访问的*顶级*属性的列表。如果在请求参数中指定了某个顶级属性或者其中包含的任意嵌套属性，则请求会访问该顶级属性。例如，如果 `GetItem` 请求指定 `"Name, Address.City"` 的 `ProjectionExpression`，则 `dynamodb:Attributes` 列表将包含“Name”和“Address”。如果在精细的访问控制策略中枚举 `Attributes` 参数，则还要考虑限制 `ReturnValues` 和 `Select` 参数，以确保在多个 API 操作（如 `GetItem`、`Query` 和 `Scan`）中限制对指定属性的访问。  
此条件仅根据在请求中（例如在 ProjectionExpression 中）指定的属性进行评估，而不是根据响应中的属性进行评估。如果请求中未提供 ProjectionExpression，则无论策略中有什么属性限制，都将返回所有属性。有关如何正确保护属性访问的详细信息，请参阅下文的“确保执行基于属性的限制”部分。

**`dynamodb:ReturnValues`**  
表示请求的 `ReturnValues` 参数。根据 API 操作，`ReturnValues` 可以是以下任何值：  
+ `ALL_OLD`
+ `UPDATED_OLD`
+ `ALL_NEW`
+ `UPDATED_NEW`
+ `NONE`

**`dynamodb:ReturnConsumedCapacity`**  
表示请求的 `ReturnConsumedCapacity` 参数。`ReturnConsumedCapacity` 参数可能为以下值之一：  
+ `TOTAL`
+ `NONE`

**`dynamodb:FirstPartitionKeyValues`**  
表示表的第一个键属性，即第一个分区键。键名称 `FirstPartitionKeyValues` 是复数，即使该键用于单一项目操作亦如此。此外，在条件中使用 `FirstPartitionKeyValues` 时，必须使用 `ForAllValues` 修饰符。`FirstPartitionKeyValues` 和 `LeadingKeys` 可以互换使用。

**`dynamodb:SecondPartitionKeyValues`**  
与 `dynamodb:FirstPartitionKeyValues`相似。代表资源的第二个分区键。键名称 `SecondPartitionKeyValues` 是复数，即使该键用于单一项目操作亦如此。

**`dynamodb:ThirdPartitionKeyValues`**  
与 `dynamodb:FirstPartitionKeyValues`相似。代表资源的第三个分区键。键名称 `ThirdPartitionKeyValues` 是复数，即使该键用于单一项目操作亦如此。

**`dynamodb:FourthPartitionKeyValues`**  
与 `dynamodb:FirstPartitionKeyValues`相似。代表资源的第四个分区键。键名称 `FourthPartitionKeyValues` 是复数，即使该键用于单一项目操作亦如此。

### 确保执行基于属性的限制
<a name="FGAC_DDB.EnsuringAttributeRestrictions"></a>

使用基于属性的条件来限制对特定属性的访问时，务必要了解系统如何评估这些条件：
+ **属性条件仅根据在请求中指定的属性进行评估**，而不根据响应中的属性进行评估。
+ **对于没有 ProjectionExpression 的读取操作**（GetItem、Query、Scan 等），无论策略中有哪些属性限制，都将返回所有属性。为防止可能导致敏感数据泄露，请同时实施属性条件 (`dynamodb:Attributes`) 和要求必须请求特定属性的条件 (`dynamodb:Select`)。
+ **对于写入操作**（PutItem、UpdateItem、DeleteItem），ReturnValues 参数可以返回完整的项目，这时即使写入操作本身遵循策略，也有可能暴露受限制的属性。为防止这种暴露，请在策略中同时实施属性条件 (`dynamodb:Attributes`) 以及对 ReturnValues (`dynamodb:ReturnValues`) 的限制。

### 限制用户访问权限
<a name="FGAC_DDB.LimitingAccess"></a>

很多 IAM 权限策略只允许用户访问分区键值与用户标识符匹配的表中的项目。例如，前面提到的游戏应用程序通过这种方式限制访问，使得用户只能访问与他们的用户 ID 关联的游戏数据。IAM 替换变量 `${www.amazon.com:user_id}`、`${graph.facebook.com:id}` 和 `${accounts.google.com:sub}` 包含适用于 Login with Amazon、Facebook 和 Google 的用户标识符。要了解应用程序如何登录身份提供商并获取标识符，请参阅[使用 Web 身份联合验证](WIF.md)。

**重要**  
不支持使用精细访问控制来限制全局表复制。对用于全局表复制的 DynamoDB [服务主体或服务相关角色](globaltables-security.md)应用精细访问控制的策略条件，可能会中断全局表内的复制。

**注意**  
以下部分中的每个示例均将 `Effect` 子句设置为 `Allow`，并且仅指定允许的操作、资源和参数。只允许访问 IAM 策略中明确列出的项目。  
在某些情况下，可以重新编写这些策略以使其成为基于拒绝的策略，即将 `Effect` 子句设置为 `Deny` 并转换策略中的所有逻辑。然而，我们建议您避免对 DynamoDB 使用基于拒绝的策略，这是因为与基于允许的策略相比，它们难以正确编写。此外，将来对 DynamoDB API 的更改（或对现有 API 的更改）可能会导致基于拒绝的策略失效。

### 策略示例：使用条件实现精细访问控制
<a name="FGAC_DDB.Examples"></a>

此部分介绍了几项可对 DynamoDB 表和索引实现精细访问控制的策略。

**注意**  
所有示例都使用 us-west-2 区域和虚构的账户 ID。

#### 示例 1。基于分区键的基本访问控制以及属性限制
<a name="FGAC_DDB.Examples.BasicPartitionKeyAccess"></a>

例如，支持玩家从各种不同的游戏中进行选择并参与的移动游戏应用程序。该应用程序使用名为 `GameScores` 的 DynamoDB 表跟踪高分数以及其他用户数据。表中的每个项目都会以用户 ID 和用户所玩游戏名称唯一标识。`GameScores` 表具有一个由分区键 (`UserId`) 和排序键 (`GameTitle`) 组成的主键。用户只能访问与他们的用户 ID 关联的游戏数据。用户要想玩游戏，必须属于名为 `GameRole` 的 IAM 角色，该角色挂载了一项安全策略。

要管理此应用程序中的用户权限，您可以编写如下所示的权限策略：

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

除了授予权限以允许对 `GameScores` 表（`Resource` 元素）执行特定 DynamoDB 操作（`Action` 元素）外，`Condition` 元素还可使用以下特定于 DynamoDB 的条件键来限制相关权限：
+ `dynamodb:LeadingKeys` - 此条件键只允许用户访问分区键值与其用户 ID 匹配的项目。此 ID（即 `${www.amazon.com:user_id}`）是替代变量。有关替代变量的更多信息，请参阅 [使用 Web 身份联合验证](WIF.md)。
+ `dynamodb:Attributes` - 此条件键用于限制对特定属性的访问，这样，只有权限策略中列出的操作才能返回这些属性的值。此外，`StringEqualsIfExists` 子句可确保应用程序必须始终提供要执行操作的特定属性列表，并且应用程序无法请求所有属性。

评估 IAM 策略时，结果始终是 true（允许访问）或 false（拒绝访问）。如果 `Condition` 元素的任何部分为 false，则整个策略评估为 false，并且访问会被拒绝。

**重要**  
如果您使用 `dynamodb:Attributes`，则必须为策略中列出的表和所有二级索引指定所有主键和索引键属性名称。否则，DynamoDB 无法使用这些键属性执行所请求的操作。

IAM 策略文档只能包含以下 Unicode 字符：水平制表符（U\$10009）、换行符（U\$1000A）、回车符（U\$1000D）以及 U\$10020 到 U\$100FF 范围内的字符。

#### 示例 2：授予权限来限制访问具有特定分区键值的项目
<a name="FGAC_DDB.Examples.PartitionKeyValue"></a>

以下权限策略用于授予允许对 `GamesScore` 表执行一组 DynamoDB 操作的权限。它使用的是 `dynamodb:LeadingKeys` 条件键，仅限制对分区键值与此应用程序的 Login with Amazon 唯一用户 ID 匹配的项目 `UserID` 执行用户操作。

**重要**  
列出的操作不包括对 `Scan` 的权限，这是因为无论主键是什么，`Scan` 都会返回所有项目。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"FullAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**注意**  
当使用策略变量时，您必须在策略中明确指定版本 2012-10-17。访问策略语言的默认版本 2008-10-17 不支持策略变量。

要实现只读访问，您可以取消能修改数据的所有操作。在以下策略中，只有提供只读访问权限的操作才会包含在条件中。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"ReadOnlyAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**重要**  
如果您使用 `dynamodb:Attributes`，则必须为策略中列出的表和所有二级索引指定所有主键和索引键属性名称。否则，DynamoDB 无法使用这些键属性执行所请求的操作。

#### 示例 3：授予权限来限制访问表中的特定属性
<a name="FGAC_DDB.Examples.SpecificAttributes"></a>

以下权限策略通过添加 `dynamodb:Attributes` 条件键，只允许访问两个特定属性。这些属性可以在条件写入或扫描筛选条件中进行读取、写入或评估。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToSpecificAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem",
            "dynamodb:Scan"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "UserId",
                  "TopScore"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

**注意**  
该策略采用了允许列表方法，允许访问指定的属性集。您也可以编写禁止访问其他属性的等效策略。我们不建议采用此拒绝列表方法。用户可以遵循 Wikipedia 中描述的最小权限原则（网址为 http://en.wikipedia.org/wiki/Principle\$1of\$1least\$1privilege），并通过允许列表方法枚举所有允许的值，而不是指定禁止的属性，确定这些拒绝属性的名称。

此策略不允许 `PutItem`、`DeleteItem` 或 `BatchWriteItem`。这些操作总是会替换整个旧项目，这样用户就可以删除他们不能访问的属性的原有值。

权限策略中的 `StringEqualsIfExists` 子句可确保满足以下要求：
+ 如果用户指定了 `Select` 参数，则其值必须为 `SPECIFIC_ATTRIBUTES`。这项要求会防止 API 操作返回未授权的属性，例如来自索引投影的属性。
+ 如果用户指定了 `ReturnValues` 参数，则其值必须为 `NONE`、`UPDATED_OLD` 或 `UPDATED_NEW`。之所以这样要求是因为 `UpdateItem` 操作还会执行隐式读取操作在替换之前验证项目是否存在，并会根据需要返回之前的属性值。这种 `ReturnValues` 限制方法可以确保用户只能读取或写入允许的属性。
+ `StringEqualsIfExists` 子句可以确保在允许的操作上下文中每个请求只能使用 `Select` 或 `ReturnValues` 参数中的一个。

以下是该策略的一些变化：
+ 要只允许读取操作，您可以从允许的操作列表中将 `UpdateItem` 删除。由于剩余的操作都不接受 `ReturnValues`，您可以将 `ReturnValues` 从条件中删除。您也可以将 `StringEqualsIfExists` 更改为 `StringEquals`，这是因为 `Select` 参数始终有一个值（除非另行指定，否则为 `ALL_ATTRIBUTES`）。
+ 要只允许写入操作，您可以将 `UpdateItem` 以外的所有元素从允许的操作列表中删除。由于 `UpdateItem` 不使用 `Select` 参数，您可以将 `Select` 从条件中删除。您还必须将 `StringEqualsIfExists` 更改为 `StringEquals`，这是因为 `ReturnValues` 参数始终有一个值（除非另行指定，否则为 `NONE`）。
+ 要允许名称与某种模式匹配的所有属性，请使用 `StringLike` 而不是 `StringEquals`，并使用多字符模式匹配通配符 (\$1)。

#### 示例 4：授予权限来阻止更新特定属性
<a name="FGAC_DDB.Examples.PreventUpdates"></a>

以下权限策略用于限制用户访问以仅更新由 `dynamodb:Attributes` 条件键标识的特定属性。`StringNotLike` 条件使用 `dynamodb:Attributes` 条件键来阻止应用程序更新特定属性。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"PreventUpdatesOnCertainAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
         "Condition":{
            "ForAllValues:StringNotLike":{
               "dynamodb:Attributes":[
                  "FreeGamesAvailable",
                  "BossLevelUnlocked"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

请注意以下几点：
+ 与其他写入操作一样，`UpdateItem` 操作也需要对项目拥有读取权限才能在更新前后返回值。在该策略中，您可以通过指定 `dynamodb:ReturnValues` 条件键，将操作限制为只能访问允许更新的属性。条件键在请求中限制了 `ReturnValues` 以便仅指定 `NONE`、`UPDATED_OLD` 或 `UPDATED_NEW`，且不包括 `ALL_OLD` 或 `ALL_NEW`。
+ `StringEqualsIfExists` 运算符确保如果请求中存在 `dynamodb:Select` 或 `dynamodb:ReturnValues`，则必须与指定的值相匹配。这可以防止操作返回完整的项目。
+ 在限制属性更新时，您还应控制可以返回哪些数据，以防止受保护属性的信息泄露。
+ `PutItem` 和 `DeleteItem` 操作会替换整个项目，从而允许应用程序修改任何属性。因此，在限制应用程序只能更新特定属性时，您不应向这些 API 授予权限。

#### 示例 5：授予权限以仅查询索引中的投影属性
<a name="FGAC_DDB.Examples.QueryProjectedAttributes"></a>

以下权限策略通过使用 `dynamodb:Attributes` 条件键，允许对二级索引 (`TopScoreDateTimeIndex`) 执行查询。该策略还会将查询限制为只能请求已投影到索引中的特定属性。

要让应用程序在查询中指定属性列表，该策略还需要指定 `dynamodb:Select` 条件键以要求 DynamoDB `Query` 操作的 `Select` 参数为 `SPECIFIC_ATTRIBUTES`。属性列表仅限为使用 `dynamodb:Attributes` 条件键提供的特定列表。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryOnlyProjectedIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "TopScoreDateTime",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "Attempts"
               ]
            },
            "StringEquals":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

以下是类似的权限策略，但是查询请求的所有属性必须已投影到索引中。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryAllIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:Select":"ALL_PROJECTED_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

#### 示例 6：授予权限以限制访问特定属性和分区键值
<a name="FGAC_DDB.Examples.AttributesAndKeyValues"></a>

以下权限策略允许对表和表索引（已在 `Resource` 元素中指定）执行特定 DynamoDB 操作（已在 `Action` 元素中指定）。该策略使用 `dynamodb:LeadingKeys` 条件键来限制权限，以仅访问分区键值与用户的 Facebook ID 匹配的项目。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToCertainAttributesAndKeyValues",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${graph.facebook.com:id}"
               ],
               "dynamodb:Attributes":[
                  "attribute-A",
                  "attribute-B"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

请注意以下几点：
+ 策略允许的写入操作 (`UpdateItem`) 只能修改 attribute-A 或 attribute-B。
+ 由于该策略允许 `UpdateItem`，应用程序可以插入新项目，而隐藏属性在新项目中将为空。如果将这些属性投影到 `TopScoreDateTimeIndex` 中，该策略还能够防止导致从表中获取数据的查询。
+ 应用程序只能读取 `dynamodb:Attributes` 中列出的属性。实施此策略后，应用程序必须在读取请求中将 `Select` 参数设置为 `SPECIFIC_ATTRIBUTES`，并且只能请求允许列表中的属性。对于写入请求，应用程序不能将 `ReturnValues` 设置为 `ALL_OLD` 或 `ALL_NEW`，也不能基于任何其他属性执行条件写入操作。

#### 示例 7：拒绝权限来限制访问表中的特定属性
<a name="FGAC_DDB.Examples.DenySpecificAttributes"></a>

以下策略拒绝访问敏感属性，并确保无法通过省略投影表达式来绕过此限制。策略允许对 `CustomerData` 表的常规访问，同时明确拒绝对 `SSN` 和 `CreditCardNumber` 属性的访问。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData"
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "ForAnyValue:StringEquals":{
               "dynamodb:Attributes":[
                  "SSN",
                  "CreditCardNumber"
               ]
            }
         }
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "StringNotEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

## 相关主题
<a name="w2aac39c21c15c11"></a>
+  [适用于 Amazon DynamoDB 的 Identity and Access Management](security-iam.md) 
+ [DynamoDB API 权限：操作、资源和条件参考](api-permissions-reference.md)

# 使用 Web 身份联合验证
<a name="WIF"></a>

如果您在为大量用户编写应用程序，可以选择使用 *Web 联合身份验证* 进行身份验证和授权。Web 联合身份验证使您无需创建单个 用户。相反，用户可以登录到身份提供程序，然后从 AWS Security Token Service (AWS STS) 获取临时安全凭证。然后，应用程序可以使用这些证书访问 AWS 服务。

Web 联合身份验证支持以下身份提供商：
+ 以 Login with Amazon 登录
+ Facebook
+ Google

## 有关 Web 联合身份验证的其他资源
<a name="WIF.AdditionalResources"></a>

以下资源可帮助您详细了解 Web 联合身份验证：
+ AWS 开发人员博客上的文章[使用适用于 适用于 .NET 的 AWS SDK 的 Web 联合身份验证](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)分步介绍了如何对 Facebook 使用 Web 联合身份验证。其中包含 C\$1 代码片段，这些代码片段展示如何使用 Web 身份代入 IAM 角色，以及如何使用临时安全凭证访问 AWS 资源。
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/)和[适用于 Android 的 AWS Mobile SDK](https://aws.amazon.com/sdkforandroid/)包含示例应用程序。这些应用程序中包括的代码演示了如何调用身份提供商，然后如何使用这些提供商提供的信息获得和使用临时安全凭证。
+ [移动应用程序的 Web 联合身份验证](https://aws.amazon.com/articles/4617974389850313)一文讨论 Web 联合身份验证，并给出一个示例，演示如何使用 Web 联合身份验证访问 AWS 资源。

## Web 身份联合验证的示例策略
<a name="WIF.Example"></a>

要显示如何将 Web 联合身份验证与 DynamoDB 结合使用，请重新访问[使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)的 *GameScores* 表。以下是 *GameScores* 的主键：


****  

| 表名称 | 主键类型 | 分区键名称和类型 | 排序键名称和类型 | 
| --- | --- | --- | --- | 
| GameScores（UserId、GameTitle、...） | 复合键 | 属性名称：UserId 类型：字符串 | 属性名称：GameTitle 类型：字符串 | 

现在假设移动游戏应用程序使用该表，并且此应用程序需要支持数千甚至数百万用户。在这种规模下，在 *GameScores* 表中管理单个应用程序用户并保证每位用户只能访问他们自己的数据将变得十分困难。幸运的是，许多用户已有某个第三方身份提供商（如 Facebook、Google 或 Login with Amazon）的账户。因此，可以利用这些提供商之一执行身份验证任务。

使用 Web 联合身份验证执行此操作，应用程序开发人员必须向身份识别提供商注册此应用程序（如 Login with Amazon）并获取唯一应用程序 ID。然后，开发人员需要创建一个 IAM 角色。（对于本示例，此角色名为 *GameRole*。） 该角色必须有附加的 IAM 策略文档，指定应用程序可以访问 *GameScores* 表的条件。

当用户想要玩游戏时，他可从游戏应用程序登录其 Login with Amazon 账户。然后，应用程序调用 AWS Security Token Service（AWS STS）以提供 Login with Amazon 应用程序 ID 并请求 *GameRole* 中的成员身份。AWS STS 向应用程序返回临时 AWS 凭证，并支持其访问 *GameScores* 表（遵循 *GameRole* 策略文档）。

下图显示了这些部分是如何组合到一起的。

![\[游戏应用程序的工作流。该应用程序使用 Amazon ID 和 AWS STS 来获取用于访问 DynamoDB 表的临时凭证。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/wif-overview.png)


**Web 身份联合验证概述**

1. 应用程序调用第三方身份提供商对用户和应用程序进行身份验证。身份提供商会返回 Web 身份验证令牌到应用程序。

1. 应用程序调用 AWS STS 并将 Web 身份验证令牌作为输入传递。AWS STS 授权应用程序并授予其临时 AWS 访问凭证。应用程序可代入 IAM 角色 (*GameRole*) 并根据该角色的安全策略访问 AWS 资源。

1. 应用程序调用 DynamoDB 以访问 *GameScores* 表。因为应用程序已代入 *GameRole*，因此要受与该角色关联的安全策略的制约。策略文档可防止用户访问不属于自己的数据。

同样，这是 *GameRole* 的安全策略，显示在 [使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)：

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 子句决定 *GameScores* 中的哪些项目对应用程序可见。它通过比较 Login with Amazon ID 与 `UserId` 中的 `GameScores` 分区键值来实现此目的。只有属于当前用户的项目能够使用此策略中列出的某一 DynamoDB 操作处理。该表中的其他项目均不可访问 此外，只有策略中列示的特定属性方予访问。

# 准备使用 Web 身份联合验证
<a name="WIF.PreparingForUse"></a>

如果您是应用开发人员并希望为应用程序使用 Web 联合身份验证，请遵循以下步骤：

1. **向第三方身份提供商注册，获得开发人员的身份。**以下外部链接提供有关在支持的身份提供商注册的信息：
   + [Login with Amazon 开发人员中心](http://login.amazon.com/)
   + 在 Facebook 网站上[注册](https://business.facebook.com/business/loginpage)
   + 在 Google 网站上[使用 OAuth 2.0 访问 Google API](https://developers.google.com/accounts/docs/OAuth2)

1. **向身份提供商注册您的应用程序。**当您执行此操作时，提供商将提供一个 ID，归您的应用程序专用。如果您希望应用程序用于多个身份提供商，您需要获取每个提供商提供的应用程序 ID。

1. **创建一个或多个 IAM 角色。**您需要为每个应用程序的每个身份提供商创建一个角色。例如，可为应用程序创建一个角色，其中用户通过 Login with Amazon 登录，为同一应用程序再创建第二个角色，其中用户通过 Facebook 登录，为该应用程序再创建第三个角色，其中用户通过 Google 登录。

   作为角色创建过程的一部分，您需要将 IAM 策略附加到角色。您的策略文档应定义应用程序所需的 DynamoDB 资源和访问这些资源的权限。

有关 Web 联合身份的更多信息，请参阅《IAM 用户指南》**中的[关于 Web 联合身份](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)。

**注意**  
作为 AWS Security Token Service 的替代方案，您可以使用 Amazon Cognito。Amazon Cognito 是管理移动应用程序临时凭证的首选服务。有关更多信息，请参阅《Amazon Cognito 开发人员指南》**中的[获取凭证](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html)。

## 使用 DynamoDB 控制台生成 IAM 策略
<a name="WIF.PreparingForUse.DDBConsole"></a>

DynamoDB 控制台可帮助您创建用于 Web 联合身份验证的 IAM 策略。要完成此操作，您需要选择一个 DynamoDB 表并指定要包含在策略中的身份提供商、操作和属性。随后，DynamoDB 控制台将生成可附加到 IAM 角色的策略。

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1.  在导航窗格中，选择**表**。

1.  在表列表中，选择您要为其创建 IAM 策略的表。

1.  选择**操作**按钮，然后选择**创建访问控制策略**。

1.  选择策略的身份提供商、操作和属性。

    根据需要进行设置后，选择**生成策略**。生成的策略随即就会出现。

1.  选择**参阅文档**，然后按照所需的步骤将生成的策略附加到 IAM 角色。

# 使用 Web 身份联合验证编写应用程序
<a name="WIF.RunningYourApp"></a>

要使用 Web 联合身份验证，应用程序必须代入您创建的 IAM 角色。这样，应用程序将遵守您附加到该角色的访问策略。

在运行期间，如果您的应用程序使用 Web 联合身份验证，它必须遵循以下步骤：

1. **使用第三方身份提供商进行身份验证。**您的应用程序必须使用身份提供商提供的接口对其进行调用。验证用户身份的确切方式取决于提供商和运行应用程序的平台。通常，如果用户尚未登录，则身份提供商负责显示该提供商的登录页面。

   身份提供商验证用户身份后，将向应用程序返回一个 Web 身份验证令牌。此令牌格式取决于提供商，但是，一般是非常长的字符串。

1. **获取临时 AWS 安全凭证。**要完成此操作，您的应用程序要向 `AssumeRoleWithWebIdentity` (AWS Security Token Service) 发送一个 AWS STS 请求。此请求包含以下内容：
   + 从之前步骤获取的 Web 身份验证令牌
   + 从身份提供商获取的应用程序 ID。
   + 您为此应用程序身份提供商创建的 IAM 角色的 Amazon Resource Name (ARN)

   AWS STS 会返回一组在一定时间后过期的 AWS 安全凭证（默认情况下是 3600 秒后过期）。

   下面是一个示例请求和 `AssumeRoleWithWebIdentity` 中 AWS STS 操作的响应。Web 身份验证令牌是从 Login with Amazon 身份提供商获取的。

   ```
   GET / HTTP/1.1
   Host: sts.amazonaws.com
   Content-Type: application/json; charset=utf-8
   URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
   &DurationSeconds=900&Action=AssumeRoleWithWebIdentity
   &Version=2011-06-15&RoleSessionName=web-identity-federation
   &RoleArn=arn:aws:iam::123456789012:role/GameRole
   &WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters omitted)
   ```

   

   ```
   <AssumeRoleWithWebIdentityResponse
     xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
     <AssumeRoleWithWebIdentityResult>
       <SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</SubjectFromWebIdentityToken>
       <Credentials>
         <SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters omitted)</SessionToken>
         <SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
         <Expiration>2013-10-01T22:14:35Z</Expiration>
         <AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
       </Credentials>
       <AssumedRoleUser>
         <Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
         <AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
       </AssumedRoleUser>
     </AssumeRoleWithWebIdentityResult>
     <ResponseMetadata>
       <RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
     </ResponseMetadata>
   </AssumeRoleWithWebIdentityResponse>
   ```

1. **访问 AWS 资源。**AWS STS 的响应包含访问 DynamoDB 资源时您的应用程序所需的信息：
   + `AccessKeyID`、`SecretAccessKey` 和 `SessionToken` 字段包含的安全凭证仅对此用户和此应用程序有效。
   + `Expiration` 字段标明了这些凭证的时间限制，超出时间后，凭证将不再有效。
   + `AssumedRoleId` 字段包含应用程序代入的会话特定 IAM 角色的名称。应用程序将遵守 IAM 策略文档中针对会话持续期间的访问控制。
   + `SubjectFromWebIdentityToken` 字段包含显示在此特定身份提供商的 IAM 策略变量中的唯一 ID。下面是支持的提供商的 IAM 策略变量以及一些示例值：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/WIF.RunningYourApp.html)

有关使用这些策略变量的示例 IAM 策略，请参阅[策略示例：使用条件实现精细访问控制](specifying-conditions.md#FGAC_DDB.Examples)。

有关 AWS STS 如何生成临时安全凭证的更多信息，请参阅《IAM 用户指南》**中的[请求临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)。

# DynamoDB API 权限：操作、资源和条件参考
<a name="api-permissions-reference"></a>

当您设置[适用于 Amazon DynamoDB 的 Identity and Access Management](security-iam.md)以及编写可附加到 IAM 身份的权限策略（基于身份的策略），可使用*IAM 用户指南*的 [Amazon DynamoDB 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)作为参考。该页列出了每个 DynamoDB API 操作、您可为其授予执行该操作的权限的相应操作以及您可为其授予权限的 AWS 资源。您可以在策略的 `Action` 字段中指定这些操作，并在策略的 `Resource` 字段中指定资源值。

您可以在 DynamoDB 策略中使用 AWS 范围的条件键来表示条件。有关 AWS 范围键完整列表，请参阅 *IAM 用户指南*的 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)。

除 AWS 范围的条件键之外，DynamoDB 还具有其自己的特定键可供您在条件中使用。有关更多信息，请参阅 [使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)。

## 相关主题
<a name="w2aac39c21c15c15b9"></a>
+  [适用于 Amazon DynamoDB 的 Identity and Access Management](security-iam.md)
+ [使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)

# DynamoDB 的行业合规性验证
<a name="Compliance"></a>

要了解某个 AWS 服务是否在特定合规性计划范围内，请参阅[按合规性计划划分的范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)，然后选择您感兴趣的合规性计划。有关常规信息，请参阅 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)、、。

您可以使用 AWS Artifact 下载第三方审计报告。有关更多信息，请参阅[在 AWS Artifact 中下载报告](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规性责任由您的数据的敏感性、您公司的合规性目标以及适用的法律法规决定。有关您在使用 AWS 服务 时的合规责任的更多信息，请参阅 [AWS 安全性文档](https://docs.aws.amazon.com/security/)。

# Amazon DynamoDB 的弹性和灾难恢复
<a name="disaster-recovery-resiliency"></a>

AWS 全球基础设施围绕 AWS 区域和可用区构建。AWS区域提供多个在物理上独立且隔离的可用区，这些可用区通过延迟低、吞吐量高且冗余性高的网络连接在一起。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础架构相比，可用区具有更高的可用性、容错性和可扩展性。

如果需要跨更大的地理距离复制数据或应用程序，请使用 AWS 本地区域。AWS 本地区域是一个旨在补充现有 AWS 区域的数据中心。与所有 AWS 区域类似，AWS 本地区域与其他 AWS 区域完全隔离。

有关 AWS 区域和可用区的更多信息，请参阅 [AWS 全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

Amazon DynamoDB 自动跨同一个区域中的三个可用区复制数据，以提供高持久性和 99.99% 的可用性 SLA。此外，DynamoDB 还提供多种功能，帮助支持数据韧性和备份需求。

**按需备份和还原**  
DynamoDB 提供按需备份功能，支持创建表的完整备份以进行长期保留和存档。有关更多信息，请参阅 [DynamoDB 按需备份和还原](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Backup-and-Restore.html)。

**时间点恢复**  
时间点恢复有助于保护 DynamoDB 表免遭意外写入或删除操作。使用时间点恢复，不必担心创建、维护或计划按需备份。有关更多信息，请参阅 [DynamoDB 时间点恢复](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Point-in-time-recovery.html)。

**跨 AWS 区域同步的全局表**  
DynamoDB 自动将表的数据和流量分布到足够数量的服务器上，以处理客户指定的请求容量和存储的数据量，同时保持一致且快速的性能。所有数据项目均存储在固态硬盘 (SSD) 中，并自动复制到某个 AWS 区域的多个可用区，以便提供数据自身的高可用性和数据持久性。可以使用全局表保持 DynamoDB 表在 AWS 区域间同步。

# Amazon DynamoDB 中的基础设施安全性
<a name="network-isolation"></a>

作为一项托管服务，Amazon DynamoDB 受到 AWS 全局网络安全过程的保护，这些过程在 AWS Well-Architected 框架的[基础设施保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)中进行了描述。

您可以使用 AWS 发布的 API 调用通过网络访问 DynamoDB。客户端可以使用 TLS（传输层安全性协议）版本 1.2 或 1.3。客户端还必须支持具有完全向前保密 (PFS) 的密码套件，例如 Ephemeral Diffie-Hellman (DHE) 或 Elliptic Curve Diffie-Hellman Ephemeral (ECDHE)。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。此外，必须使用访问密钥 ID 和与 IAM 主体关联的秘密访问密钥来对请求进行签名。或者，您可以使用 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)（AWS STS）生成临时安全凭证来对请求进行签名。

 您还可以为 DynamoDB 使用 virtual private cloud（VPC）端点，使 VPC 中的 Amazon EC2 实例能够使用其私有 IP 地址访问 DynamoDB，而不会暴露于公共互联网。有关更多信息，请参阅 [使用 Amazon VPC 端点来访问 DynamoDB](#vpc-endpoints-dynamodb)。

## 使用 Amazon VPC 端点来访问 DynamoDB
<a name="vpc-endpoints-dynamodb"></a>

出于安全原因，许多AWS客户在 Amazon Virtual Private Cloud 环境（Amazon VPC）中运行其应用程序。利用 Amazon VPC，您可以在 Virtual Private Cloud 中启动 Amazon EC2 实例，Virtual Private Cloud 在逻辑上与其他网络（包括公共互联网）隔离。利用 Amazon VPC，您可以控制该网络的 IP 地址范围、子网、路由表、网络网关和安全设置。

**注意**  
如果您的 AWS 账户是在 2013 年 12 月 4 目之后创建的，则您在每个 AWS 区域中都已经有一个默认 VPC。默认 VPC 可供您使用，您立即开始使用该 VPC，而无需执行任何其他配置步骤。  
有关更多信息，请参阅《Amazon VPC 用户指南》**中的[默认 VPC 和默认子网](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)。

要访问公共互联网，您的 VPC 必须有一个互联网网关 — 一个将您的 VPC 连接到互联网的虚拟路由器。这允许在 VPC 中的 Amazon EC2 上运行的应用程序访问互联网资源，例如 Amazon DynamoDB。

默认情况下，与 DynamoDB 之间的通信使用 HTTPS 协议，该协议通过使用 SSL/TLS 加密来保护网络流量。下图显示了 VPC 中的一个 Amazon EC2 实例通过让 DynamoDB 使用互联网网关（而不是 VPC 端点）来访问 DynamoDB。

![\[显示通过路由器、互联网网关和互联网访问 DynamoDB 的 Amazon EC2 实例的工作流程图。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/ddb-no-vpc-endpoint.png)


许多客户对跨公共 Internet 发送和接收数据存在合理的私密性和安全性担心。客户可以利用虚拟专用网络 (VPN)，通过自己的企业网络基础设施路由所有 DynamoDB 网络流量，从而消除这些担心。不过，此方法可能会带来带宽和可用性方面的难题。

DynamoDB 的 VPC 端点可以克服这些难题。DynamoDB 的 *VPC 端点*使 VPC 中的 Amazon EC2 实例可以使用其私有 IP 地址访问 DynamoDB，而无需接触公共互联网。EC2 实例不需要公有 IP 地址，因此您的 VPC 中不需要有互联网网关、NAT 设备或虚拟专用网关。您使用端点策略控制对 DynamoDB 的访问。您的 VPC 和 AWS 服务之间的流量不会脱离 Amazon 网络。

**注意**  
 即使在使用公有 IP 地址时，AWS 中托管的实例和服务之间的所有 VPC 通信也都会在 AWS 网络中保密。来自 AWS 网络且目的地在 AWS 网络上的数据包会留在 AWS 全球网络上，但来往于 AWS 中国区域的流量除外。

在为 DynamoDB 创建 VPC 端点时，发送到区域（如 *dynamodb.us-west-2.amazonaws.com*）内的 DynamoDB 端点的任何请求都被路由到 Amazon 网络中的私有 DynamoDB 端点。您无需修改在 VPC 中的 EC2 实例上运行的应用程序。端点名称保持不变，但到 DynamoDB 的路由会完全保留在 Amazon 网络中，不会访问公共互联网。

下图说明 VPC 中的 EC2 实例如何使用 VPC 端点访问 DynamoDB。

![\[显示仅通过路由器和 VPC 端点访问 DynamoDB 的 EC2 实例的工作流程图。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/ddb-yes-vpc-endpoint.png)


有关更多信息，请参阅 [教程：将 VPC 端点用于 DynamoDB](#vpc-endpoints-dynamodb-tutorial)。

### 共享 Amazon VPC 端点和 DynamoDB
<a name="vpc-endpoints-dynamodb-sharing"></a>

要允许通过 VPC 子网的网关端点访问 DynamoDB 服务，您必须拥有该 VPC 子网的所有者账户权限。

 向 VPC 子网的网关端点授予对 DynamoDB 的访问权限后，任何有权访问该子网的 AWS 账户都可以使用 DynamoDB。这意味着 VPC 子网中的所有账户用户都可以使用他们有权访问的任何 DynamoDB 表。这包括与 VPC 子网以外的账户相关联的 DynamoDB 表。VPC 子网所有者仍然可以自行决定，限制子网内的任何特定用户通过网关端点使用 DynamoDB 服务。

### 教程：将 VPC 端点用于 DynamoDB
<a name="vpc-endpoints-dynamodb-tutorial"></a>

此部分引导您完成设置和使用 DynamoDB 的 VPC 端点的过程。

**Topics**
+ [第 1 步：启动一个 Amazon EC2 实例](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance)
+ [第 2 步：配置 Amazon EC2 实例](#vpc-endpoints-dynamodb-tutorial.configure-ec2-instance)
+ [第 3 步：为 DynamoDB 创建一个 VPC 端点](#vpc-endpoints-dynamodb-tutorial.create-endpoint)
+ [第 4 步：（可选）清除](#vpc-endpoints-dynamodb-tutorial.clean-up)

#### 第 1 步：启动一个 Amazon EC2 实例
<a name="vpc-endpoints-dynamodb-tutorial.launch-ec2-instance"></a>

在此步骤中，您将在默认 Amazon VPC 中启动 Amazon EC2 实例。然后，您可以为 DynamoDB 创建和使用 VPC 端点。

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 选择**启动实例**，然后执行以下操作：

   步骤 1：选择亚马逊机器映像（AMI）
   + 在 AMI 列表的顶部，转至 **Amazon Linux AMI**，然后选择**选择**。

   步骤 2：选择实例类型
   + 在实例类型列表的顶部，选择 **t2.micro**。
   + 选择**下一步：配置实例详细信息**。

   步骤 3：配置实例详细信息
   + 转至**网络**并选择您的默认 VPC。

     选择**下一步：添加存储**。

   步骤 4：添加存储
   + 通过选择 **Next: Tag Instance** 来跳过此步骤。

   第 5 步：为实例添加标签
   + 选择**下一步：配置安全组**，跳过此步骤。

   步骤 6：配置安全组
   + 选择**选择现有安全组**。
   + 在安全组列表中，选择**默认**。这是 VPC 的默认安全组。
   + 选择**下一步：审核和启动**。

   步骤 7：审核实例启动
   + 选择**启动**。

1. 在**选择现有密钥对或创建新密钥对**窗口中，执行下列操作之一：
   + 如果您没有 Amazon EC2 密钥对，请选择**创建新的密钥对**并遵循说明。系统将要求您下载私有密钥文件（*.pem* 文件）；您在登录 Amazon EC2 实例时需要此文件。
   + 如果已经有 Amazon EC2 密钥对，请转至**选择密钥对**，然后从列表中选择您的密钥对。必须已经有可用私有密钥文件（*.pem* 文件）才能登录 Amazon EC2 实例。

1. 在配置密钥对后，选择**启动实例**。

1. 返回 Amazon EC2 控制台主页并选择您启动的实例。在下方窗格中的**说明**选项卡上，找到实例的**公共 DNS**。例如：`ec2-00-00-00-00.us-east-1.compute.amazonaws.com`。

   记下此公共 DNS 名称，因为您需要在本教程的下一步中使用该名称 ([第 2 步：配置 Amazon EC2 实例](#vpc-endpoints-dynamodb-tutorial.configure-ec2-instance))。

**注意**  
您的 Amazon EC2 实例需要几分钟才能变为可用。在继续下一步之前，请确保**实例状态**为 `running`，并且已通过其所有**状态检查**。

#### 第 2 步：配置 Amazon EC2 实例
<a name="vpc-endpoints-dynamodb-tutorial.configure-ec2-instance"></a>

当您的 Amazon EC2 实例可用时，您将能够登录该实例并为首次使用做好准备。

**注意**  
以下步骤假设您从运行 Linux 的计算机连接到您的 Amazon EC2 实例。有关其他连接方式，请参阅《Amazon EC2 用户指南》中的[连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)。

1. 您需要授权您的 Amazon EC2 实例的入站 SSH 流量。为此，您将创建一个新的 EC2 安全组，然后将该安全组分配给您的 EC2 实例。

   1. 在导航窗格中，选择 **Security Groups**（安全组）。

   1. 选择**创建安全组**。在**创建安全组**窗口中，执行以下操作：
      + **安全组名称**—键入安全组名称。例如：`my-ssh-access`
      + **说明**—键入新安全组的描述。
      + **VPC**—选择您的默认 VPC。
      + 在**安全组规则**部分，选择**添加规则**并执行以下操作：
        + **类型**-选择 SSH。
        + **来源**—选择我的 IP。

      根据需要进行设置后，选择**创建**。

   1. 在导航窗格中，选择 **Instances (实例)**。

   1. 选择在 [第 1 步：启动一个 Amazon EC2 实例](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance) 中启动的 Amazon EC2 实例。

   1. 选择**操作** --> **联网** --> **更改安全组**。

   1. 在**更改安全组**中，选择您在此过程之前创建的安全组（例如：`my-ssh-access`）。还应选择现有 `default` 安全组。根据需要进行设置后，选择**分配安全组**。

1. 使用 `ssh` 命令登录您的 Amazon EC2 实例，如以下示例所示。

   ```
   ssh -i my-keypair.pem ec2-user@public-dns-name
   ```

   您需要指定私有密钥文件（*.pem* 文件）和实例的公有 DNS 名称。（请参阅 [第 1 步：启动一个 Amazon EC2 实例](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance)。） 

   登录 ID 为 `ec2-user`。不需要密码。

1. 配置 AWS 凭证，如以下示例所示。提示后，输入您的AWS访问密钥 ID、私有密钥和默认区域名称。

   ```
   aws configure
   ```

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-east-1
   Default output format [None]:
   ```

现在，您可以为 DynamoDB 创建 VPC 端点。

#### 第 3 步：为 DynamoDB 创建一个 VPC 端点
<a name="vpc-endpoints-dynamodb-tutorial.create-endpoint"></a>

在此步骤中，您将为 DynamoDB 创建 VPC 端点，并对其进行测试以确保其正常工作。

1. 在开始之前，请验证您是否可以使用 DynamoDB 的公共端点与 DynamoDB 进行通信。

   ```
   aws dynamodb list-tables
   ```

   输出将显示您当前拥有的 DynamoDB 表的列表。（如果您没有任何表，该列表将为空。）

1. 验证 DynamoDB 是否可用于在当前AWS区域创建 VPC 端点。（命令以粗体文本显示，后面是示例输出。）

   ```
   aws ec2 describe-vpc-endpoint-services
   ```

   ```
   {
       "ServiceNames": [
           "com.amazonaws.us-east-1.s3",
           "com.amazonaws.us-east-1.dynamodb"
       ]
   }
   ```

   在示例输出中，DynamoDB 是可用的服务之一，因此您可以继续为其创建 VPC 端点。

1. 确定您的 VPC 标识符。

   ```
   aws ec2 describe-vpcs
   ```

   ```
   {
       "Vpcs": [
           {
               "VpcId": "vpc-0bbc736e", 
               "InstanceTenancy": "default", 
               "State": "available", 
               "DhcpOptionsId": "dopt-8454b7e1", 
               "CidrBlock": "172.31.0.0/16", 
               "IsDefault": true
           }
       ]
   }
   ```

   在示例输出中，VPC ID 为 `vpc-0bbc736e`。

1. 创建 VPC 端点。对于 `--vpc-id` 参数，指定上一步中的 VPC ID。使用 `--route-table-ids` 参数将端点与路由表相关联。

   ```
   aws ec2 create-vpc-endpoint --vpc-id vpc-0bbc736e --service-name com.amazonaws.us-east-1.dynamodb --route-table-ids rtb-11aa22bb
   ```

   ```
   {
       "VpcEndpoint": {
           "PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}", 
           "VpcId": "vpc-0bbc736e", 
           "State": "available", 
           "ServiceName": "com.amazonaws.us-east-1.dynamodb", 
           "RouteTableIds": [
               "rtb-11aa22bb"
           ],
           "VpcEndpointId": "vpce-9b15e2f2", 
           "CreationTimestamp": "2017-07-26T22:00:14Z"
       }
   }
   ```

1. 验证您是否可以通过 VPC 端点访问 DynamoDB。

   ```
   aws dynamodb list-tables
   ```

   如果需要，您可以为 DynamoDB 尝试其他 AWS CLI 命令。有关更多信息，请参阅 [AWS CLI 命令参考](https://docs.aws.amazon.com/cli/latest/reference/)。

#### 第 4 步：（可选）清除
<a name="vpc-endpoints-dynamodb-tutorial.clean-up"></a>

如果要删除您在本教程中创建的资源，请按照以下步骤操作：

**删除用于 DynamoDB 的 VPC 端点**

1. 登录到您的 Amazon EC2 实例。

1. 确定 VPC 端点 ID。

   ```
   aws ec2 describe-vpc-endpoints
   ```

   ```
   {
       "VpcEndpoint": {
           "PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}", 
           "VpcId": "vpc-0bbc736e", 
           "State": "available", 
           "ServiceName": "com.amazonaws.us-east-1.dynamodb", 
           "RouteTableIds": [], 
           "VpcEndpointId": "vpce-9b15e2f2", 
           "CreationTimestamp": "2017-07-26T22:00:14Z"
       }
   }
   ```

   在示例输出中，VPC 端点 ID 为`vpce-9b15e2f2`。

1. 删除 VPC 端点。

   ```
   aws ec2 delete-vpc-endpoints --vpc-endpoint-ids vpce-9b15e2f2
   ```

   ```
   {
       "Unsuccessful": []
   }
   ```

   空数组 `[]` 表示成功（没有失败请求）。

**终止 Amazon EC2 实例**

1. 打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您的 Amazon EC2 实例。

1. 依次选择**操作**、**实例状态**和**终止**。

1. 在确认窗口中，选择**是，终止**。

# 适用于 DynamoDB 的 AWS PrivateLink
<a name="privatelink-interface-endpoints"></a>

借助适用于 DynamoDB 的 AWS PrivateLink，您可以在 Virtual Private Cloud（Amazon VPC）中预置*接口 Amazon VPC 端点*（接口端点）。这些端点可从本地（通过 VPN 及 Direct Connect）或其它 AWS 区域（通过 [Amazon VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)）中的应用程序直接访问。使用 AWS PrivateLink 和接口端点，您可以简化应用程序与 DynamoDB 之间的私有网络连接。

VPC 中的应用程序无需公有 IP 地址，即可使用 VPC 接口端点与 DynamoDB 通信来执行 DynamoDB 操作。接口端点由一个或多个弹性网络接口（ENI）表示，这些接口是从 Amazon VPC 中的子网分配的私有 IP 地址。通过接口端点向 DynamoDB 发出的请求仍留在 Amazon 网络上。您还可以通过 AWS Direct Connect 或 AWS Virtual Private Network（Site-to-Site VPN）从本地部署应用程序访问 Amazon VPC 中的接口端点。有关如何将 Amazon VPC 与本地网络连接的更多信息，请参阅 [Direct Connect 用户指南](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)和 [AWS Site-to-Site VPN 用户指南](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。

有关接口端点的一般信息，请参阅《AWS PrivateLink 指南》**中的[接口 Amazon VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)。Amazon DynamoDB Streams 端点也支持 AWS PrivateLink。有关更多信息，请参阅 [适用于 DynamoDB Streams 的 AWS PrivateLink](privatelink-streams.md)。

**Topics**
+ [适用于 Amazon DynamoDB 的 Amazon VPC 端点类型](#types-of-vpc-endpoints-for-ddb)
+ [使用适用于 Amazon DynamoDB 的 AWS PrivateLink 时的注意事项](#privatelink-considerations)
+ [创建 Amazon VPC 端点](#ddb-creating-vpc)
+ [访问 Amazon DynamoDB 接口端点](#accessing-ddb-interface-endpoints)
+ [从 DynamoDB 接口端点访问 DynamoDB 表并控制 API 操作](#accessing-tables-apis-from-interface-endpoints)
+ [更新本地 DNS 配置](#updating-on-premises-dns-config)
+ [为 DynamoDB 创建 Amazon VPC 端点策略](#creating-vpc-endpoint-policy)
+ [将 DynamoDB 端点与 AWS 管理控制台私有访问结合使用](#ddb-endpoints-private-access)
+ [适用于 DynamoDB Streams 的 AWS PrivateLink](privatelink-streams.md)
+ [使用适用于 DynamoDB Accelerator（DAX）的 AWS PrivateLink](dax-private-link.md)

## 适用于 Amazon DynamoDB 的 Amazon VPC 端点类型
<a name="types-of-vpc-endpoints-for-ddb"></a>

您可以使用两种类型的 Amazon VPC 端点访问 Amazon DynamoDB：*网关端点*和*接口端点*（使用 AWS PrivateLink）。*网关端点*是您在路由表中指定的网关，用于通过 AWS 网络从 Amazon VPC 访问 DynamoDB。*接口端点*通过私有 IP 地址将请求从您的 Amazon VPC 内部、本地或其它 AWS 区域中的 Amazon VPC，使用 Amazon VPC 对等连接或 AWS Transit Gateway 路由到 DynamoDB，从而扩展网关端点的功能。有关更多信息，请参阅 [What is Amazon VPC peering?](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 和 [Transit Gateway 与 Amazon VPC 对等连接](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/transit-gateway-vs-vpc-peering.html)。

接口端点与网关端点兼容。如果您在 Amazon VPC 中有现有网关端点，则可以在同一 Amazon VPC 中使用这两种类型的端点。


|  适用于 DynamoDB 的网关端点  |  适用于 DynamoDB 的接口端点  | 
| --- | --- | 
|  在这两种情况下，您的网络流量仍保留在 AWS 网络中。  | 
|  使用 Amazon DynamoDB 公有 IP 地址  |  使用 Amazon VPC 中的私有 IP 地址访问 Amazon DynamoDB  | 
|  不允许从本地访问  |  允许从本地访问  | 
|  不允许从其他 AWS 区域访问  |  允许从另一个 AWS 区域中的 Amazon VPC 端点使用 Amazon VPC 对等连接或 AWS Transit Gateway 进行访问  | 
|  不计费  |  计费  | 

有关网关端点的更多信息，请参阅《AWS PrivateLink 指南》**中的[网关 Amazon VPC 端点](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-gateway.html)。

## 使用适用于 Amazon DynamoDB 的 AWS PrivateLink 时的注意事项
<a name="privatelink-considerations"></a>

适用于 Amazon DynamoDB 的 AWS PrivateLink 的适用 Amazon VPC 注意事项。有关更多信息，请参阅《AWS PrivateLink 指南》**中的[接口端点注意事项](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations)和 [AWS PrivateLink 限额](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)。此外，以下限制将适用：

适用于 Amazon DynamoDB 的 AWS PrivateLink 不支持以下各项：
+ 传输层安全性协议（TLS）1.1
+ 私有域名系统和混合域名系统（DNS）服务

**重要**  
请勿创建私有托管区来覆盖 DynamoDB 端点 DNS 名称（例如 `dynamodb.region.amazonaws.com` 或 `*.region.amazonaws.com`），以便将流量路由到您的接口端点。DynamoDB DNS 配置可能会随着时间推移而发生变化。  
 自定义 DNS 覆盖与这些更改不兼容，可能导致请求意外通过公有 IP 地址而不是您的接口端点进行路由。  
 要通过 AWS PrivateLink 访问 DynamoDB，请将您的客户端配置为直接使用 Amazon VPC 端点 URL（例如 `https://vpce-1a2b3c4d-5e6f.dynamodb.region.vpce.amazonaws.com`）。

对于您启用的每个 AWS PrivateLink 端点，您每秒最多可以提交 5 万个请求。

**注意**  
AWS PrivateLink 端点的网络连接超时不在 DynamoDB 错误响应的范围内，需要由连接到 PrivateLink 端点的应用程序适当进行处理。

## 创建 Amazon VPC 端点
<a name="ddb-creating-vpc"></a>

要创建 Amazon VPC 接口端点，请参阅《AWS PrivateLink 指南》**中的[创建 Amazon VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

## 访问 Amazon DynamoDB 接口端点
<a name="accessing-ddb-interface-endpoints"></a>

创建接口端点时，DynamoDB 会生成两种特定于端点的 DynamoDB DNS 名称：*区域*和*可用区*。
+ *区域* DNS 名称包括唯一的 Amazon VPC 端点 ID、服务标识符、AWS 区域和以其命名的 `vpce.amazonaws.com`。例如，对于 Amazon VPC 端点 ID `vpce-1a2b3c4d`，生成的 DNS 名称可能类似于 `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`。
+ *区域* DNS 名称包括可用区 – 例如 `vpce-1a2b3c4d-5e6f-us-east-1a.dynamodb.us-east-1.vpce.amazonaws.com`。如果您的架构隔离了可用区，则可以使用此选项。例如，您可以将其用于故障控制或降低区域数据传输成本。

**注意**  
为了实现最佳可靠性，我们建议将您的服务部署在至少三个可用区中。

## 从 DynamoDB 接口端点访问 DynamoDB 表并控制 API 操作
<a name="accessing-tables-apis-from-interface-endpoints"></a>

您可以使用 AWS CLI 或 AWS SDK 通过 DynamoDB 接口端点访问 DynamoDB 表并控制 API 操作。

### AWS CLI 示例
<a name="privatelink-ddb-aws-cli-examples"></a>

要使用 AWS CLI 命令通过 DynamoDB 接口端点访问 DynamoDB 表或 DynamoDB 控制 API 操作，请使用 `--region` 和 `--endpoint-url` 参数。

**示例：创建 VPC 端点**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**示例：修改 VPC 端点**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**示例：使用端点 URL 列出表**

在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 的 DNS 名称替换为您自己的信息。

```
aws dynamodb --region us-east-1 --endpoint https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com list-tables
```

### AWS SDK 示例
<a name="privatelink-ddb-aws-sdk-examples"></a>

要在使用 AWS SDK 时通过 DynamoDB 接口端点访问 DynamoDB 表或 DynamoDB 控制 API 操作，请将 SDK 更新为最新版本。然后，将客户端配置为使用端点 URL 通过 DynamoDB 接口端点访问表或 DynamoDB 控制 API 操作。

------
#### [ SDK for Python (Boto3) ]

**示例：使用端点 URL 访问 DynamoDB 表**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
ddb_client = session.client(
service_name='dynamodb',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**示例：使用端点 URL 访问 DynamoDB 表**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
//client build with endpoint config  
final AmazonDynamoDB dynamodb = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**示例：使用端点 URL 访问 DynamoDB 表**  
在以下示例中，将区域 us-east-1 和 VPC 端点 ID https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com 替换为您自己的信息。

```
Region region = Region.US_EAST_1;
dynamoDbClient = DynamoDbClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## 更新本地 DNS 配置
<a name="updating-on-premises-dns-config"></a>

 使用特定于端点的 DNS 名称访问适用于 DynamoDB 的接口端点时，您无需更新本地 DNS 解析程序。您可以使用来自公有 DynamoDB DNS 域的接口端点的私有 IP 地址解析特定于端点的 DNS 名称。

### 使用接口端点访问 DynamoDB，无需 Amazon VPC 中的网关端点和互联网网关
<a name="using-interface-endpoints"></a>

Amazon VPC 中的接口端点可以通过 Amazon 网络将 Amazon VPC 内的应用程序和本地应用程序路由到 DynamoDB，如下图所示。

![\[数据流程图，显示了使用接口端点和 AWS PrivateLink 从本地和 Amazon VPC 内的应用程序对 DynamoDB 的访问。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/PrivateLink-interfaceEndpoints.png)


下图说明了以下内容：
+ 您的本地网络使用 Direct Connect 或者 Site-to-Site VPN 连接到 Amazon VPC A。
+ 本地和 Amazon VPC A 中的应用程序使用特定于端点的 DNS 名称通过 DynamoDB 接口端点访问 DynamoDB。
+ 本地应用程序通过 Direct Connect（或 Site-to-Site VPN）将数据发送到 Amazon VPC 中的接口端点。AWS PrivateLink 通过 AWS 网络将数据从接口端点移动到 DynamoDB。
+ Amazon VPC 中的应用程序还向接口端点发送通信。AWS PrivateLink 通过 AWS 网络将数据从接口端点移动到 DynamoDB。

### 在同一 Amazon VPC 中同时使用网关端点和接口端点来访问 DynamoDB
<a name="using-gateway-and-interface-endpoints"></a>

您可以创建接口端点并将现有网关端点保留在同一 Amazon VPC 中，如下图所示。通过这种方法，您可以允许 Amazon VPC 内的应用程序继续通过网关端点访问 DynamoDB，而无需付费。然后，只有您的本地应用程序才会使用接口端点访问 DynamoDB。要通过这种方式访问 DynamoDB，您必须更新本地应用程序，以使用适用于 DynamoDB 的特定于端点的 DNS 名称。

![\[数据流程图，显示了同时使用网关端点和接口端点访问 DynamoDB 的情况。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/PL-Image2-InterfaceAndGatewayEP.png)


下图说明了以下内容：
+ 本地应用程序使用特定于端点的 DNS 名称通过 Direct Connect（或 Site-to-Site VPN）将数据发送到 Amazon VPC 中的接口端点。AWS PrivateLink 通过 AWS 网络将数据从接口端点移动到 DynamoDB。
+ 使用默认的区域 DynamoDB 名称，Amazon VPC 内应用程序会将数据发送到通过 AWS 网络连接到 DynamoDB 的网关端点。

有关网关端点的更多信息，请参阅《Amazon VPC 用户指南》**中的[网关 Amazon VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)。

## 为 DynamoDB 创建 Amazon VPC 端点策略
<a name="creating-vpc-endpoint-policy"></a>

您可以为 Amazon VPC 端点附加控制对 DynamoDB 的访问的端点策略。该策略指定以下信息：
+ 可执行操作的 AWS Identity and Access Management (IAM) 主体 
+ 可执行的操作 
+ 可对其执行操作的资源 

**Topics**
+ [示例：限制从 Amazon VPC 端点对特定表的访问](#privatelink-example-restrict-access-to-bucket)

### 示例：限制从 Amazon VPC 端点对特定表的访问
<a name="privatelink-example-restrict-access-to-bucket"></a>

您可以创建限制只能访问特定 DynamoDB 表的端点策略。如果您的 Amazon VPC 中有使用表的其它 AWS 服务，这种策略会非常有用。以下表策略限制为仅可访问 `DOC-EXAMPLE-TABLE`。要使用此端点策略，请将 `DOC-EXAMPLE-TABLE` 替换为您的表的名称。

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

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-table-only",
      "Principal": "*",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE",
                   "arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE/*"]
    }
  ]
}
```

------

## 将 DynamoDB 端点与 AWS 管理控制台私有访问结合使用
<a name="ddb-endpoints-private-access"></a>

当您在 [AWS 管理控制台私有访问](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)中将 VPC 端点与 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb)结合使用时，必须为 DynamoDB 和 DynamoDB Streams 设置 DNS 配置。

要将 DynamoDB 配置为可在 AWS 管理控制台私有访问中访问，您必须创建以下两个 VPC 端点：
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

创建 VPC 端点时，请导航到 Route53 控制台，然后使用区域端点 `dynamodb.us-east-1.amazonaws.com` 为 DynamoDB 创建私有托管区。

在私有托管区中创建以下两个别名记录：
+ `dynamodb.<region>.amazonaws.com` 将流量路由到 VPC 端点 `com.amazonaws.<region>.dynamodb`。
+ `streams.dynamodb.<region>.amazonaws.com` 将流量路由到 VPC 端点 `com.amazonaws.<region>.dynamodb-streams`。

# 适用于 DynamoDB Streams 的 AWS PrivateLink
<a name="privatelink-streams"></a>

借助适用于 Amazon DynamoDB Streams 的 AWS PrivateLink，您可以在虚拟私有云（Amazon VPC）中预置接口 Amazon VPC 端点（接口端点）。这些端点可从位于本地（通过 VPN 及 Direct Connect）或其它 AWS 区域（通过 Amazon VPC 对等连接）中的应用程序直接访问。使用 AWS PrivateLink 和接口端点，可以简化应用程序与 DynamoDB Streams 之间的私有网络连接。

Amazon VPC 中的应用程序无需公有 IP 地址，即可使用 Amazon VPC 接口端点与 DynamoDB Streams 通信来执行 DynamoDB Streams 操作。接口端点由一个或多个弹性网络接口（ENI）表示，这些接口是从 Amazon VPC 中的子网分配的私有 IP 地址。通过接口端点向 DynamoDB Streams 发出的请求仍留在 Amazon 网络上。还可以通过 Direct Connect 或 AWS Virtual Private Network（AWS VPN）从本地应用程序访问 Amazon VPC 中的接口端点。有关如何将 AWS Virtual Private Network 与本地网络连接的更多信息，请参阅 [https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 和 [https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。

有关接口端点的一般信息，请参阅 [Interface Amazon VPC endpoints](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)（AWS PrivateLink）。

**注意**  
DynamoDB Streams 仅支持接口端点。不支持网关端点。

**Topics**
+ [使用适用于 Amazon DynamoDB Streams 的 AWS PrivateLink 时的注意事项](#privatelink-streams-considerations)
+ [创建 Amazon VPC 端点](#privatelink-streams-vpc-endpoint)
+ [访问 Amazon DynamoDB Streams 接口端点](#privatelink-streams-accessing-ddb-interface-endpoints)
+ [从 DynamoDB Streams 接口端点访问 DynamoDB Stream API 操作](#privatelink-streams-accessing-api-operations-from-interface-endpoints)
+ [AWS SDK 示例](#privatelink-streams-aws-sdk-examples)
+ [为 DynamoDB Streams 创建 Amazon VPC 端点策略](#privatelink-streams-creating-vpc-endpoint-policy)
+ [将 DynamoDB 端点与 AWS 管理控制台私有访问结合使用](#ddb-streams-endpoints-private-access)

## 使用适用于 Amazon DynamoDB Streams 的 AWS PrivateLink 时的注意事项
<a name="privatelink-streams-considerations"></a>

适用于 Amazon DynamoDB Streams 的 AWS PrivateLink 适用 Amazon VPC 注意事项。有关更多信息，请参阅 [interface endpoint considerations](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) 和 [AWS PrivateLink quotas](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)。以下限制适用。

适用于 Amazon DynamoDB Streams 的 AWS PrivateLink 不支持以下各项：
+ 传输层安全性协议（TLS）1.1
+ 私有域名系统和混合域名系统（DNS）服务

**重要**  
请勿创建私有托管区来覆盖 DynamoDB Streams 端点 DNS 名称，以便将流量路由到您的接口端点。DynamoDB DNS 配置可能会随着时间推移而发生变化，自定义 DNS 覆盖可能会导致请求意外通过公有 IP 地址而不是您的接口端点进行路由。  
 要通过 AWS PrivateLink 访问 DynamoDB Streams，请将您的客户端配置为直接使用 Amazon VPC 端点 URL（例如 `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.region.vpce.amazonaws.com`）。

**注意**  
AWS PrivateLink 端点的网络连接超时不在 DynamoDB Streams 错误响应的范围内，需要由连接到 AWS PrivateLink 端点的应用程序适当进行处理。

## 创建 Amazon VPC 端点
<a name="privatelink-streams-vpc-endpoint"></a>

要创建 Amazon VPC 接口端点，请参阅《AWS PrivateLink 指南》**中的[创建 Amazon VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

## 访问 Amazon DynamoDB Streams 接口端点
<a name="privatelink-streams-accessing-ddb-interface-endpoints"></a>

创建接口端点时，DynamoDB 会生成两种特定于端点的 DynamoDB Streams DNS 名称：*区域*和*可用区*。
+ *区域* DNS 名称包括唯一的 Amazon VPC 端点 ID、服务标识符、AWS 区域和以其命名的 `vpce.amazonaws.com`。例如，对于 Amazon VPC 端点 ID `vpce-1a2b3c4d`，生成的 DNS 名称可能类似于 `vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`。
+ *区域* DNS 名称包括可用区 – 例如 `vpce-1a2b3c4d-5e6f-us-east-1a.streams.dynamodb.us-east-1.vpce.amazonaws.com`。如果您的架构隔离了可用区，则可以使用此选项。例如，您可以将其用于故障控制或降低区域数据传输成本。

## 从 DynamoDB Streams 接口端点访问 DynamoDB Stream API 操作
<a name="privatelink-streams-accessing-api-operations-from-interface-endpoints"></a>

您可以使用 AWS CLI 或 AWS SDK，通过 DynamoDB Streams 接口端点访问 DynamoDB Streams API 操作。

### AWS CLI 示例
<a name="privatelink-streams-aws-cli-examples"></a>

要使用 AWS CLI 命令通过 DynamoDB Streams 接口端点访问 DynamoDB Streams 或 API 操作，请使用 `--region` 和 `--endpoint-url` 参数。

**示例：创建 VPC 端点**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb-streams \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**示例：修改 VPC 端点**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**示例：使用端点 URL 列出流**

在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 的 DNS 名称替换为您自己的信息。

```
aws dynamodbstreams --region us-east-1 —endpoint https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com list-streams
```

## AWS SDK 示例
<a name="privatelink-streams-aws-sdk-examples"></a>

要在使用 AWS SDK 时通过 DynamoDB Streams 接口端点访问 Amazon DynamoDB Streams API 操作，请将 SDK 更新为最新版本。然后，将客户端配置为使用端点 URL 通过 DynamoDB Streams 接口端点执行 DynamoDB Streams API 操作。

------
#### [ SDK for Python (Boto3) ]

**示例：使用端点 URL 访问 DynamoDB 流**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
ddb_streams_client = session.client(
service_name='dynamodbstreams',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**示例：使用端点 URL 访问 DynamoDB 流**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
//client build with endpoint config  
final AmazonDynamoDBStreams dynamodbstreams = AmazonDynamoDBStreamsClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**示例：使用端点 URL 访问 DynamoDB 流**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
Region region = Region.US_EAST_1;
dynamoDbStreamsClient = DynamoDbStreamsClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## 为 DynamoDB Streams 创建 Amazon VPC 端点策略
<a name="privatelink-streams-creating-vpc-endpoint-policy"></a>

您可以向 Amazon VPC 端点附加用于控制对 DynamoDB Streams 的访问的端点策略。该策略指定以下信息：
+ 可执行操作的 AWS Identity and Access Management (IAM) 主体 
+ 可执行的操作 
+ 可对其执行操作的资源 

**Topics**
+ [示例：限制从 Amazon VPC 端点对特定流的访问](#privatelink-streams-example-restrict-access-to-bucket)

### 示例：限制从 Amazon VPC 端点对特定流的访问
<a name="privatelink-streams-example-restrict-access-to-bucket"></a>

您可以创建限制只能访问特定 DynamoDB 流的端点策略。如果 Amazon VPC 中有使用 DynamoDB Streams 的其它 AWS 服务，这种策略会非常有用。以下流策略限制只能访问连接到 `DOC-EXAMPLE-TABLE` 的流 `2025-02-20T11:22:33.444`。要使用此端点策略，请将 `DOC-EXAMPLE-TABLE` 替换为表的名称，并将 `2025-02-20T11:22:33.444` 替换为流标签。

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

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-stream-only",
      "Principal": "*",
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/table-name/stream/2025-02-20T11:22:33.444"]
    }
  ]
}
```

------

**注意**  
DynamoDB Streams 不支持网关端点。

## 将 DynamoDB 端点与 AWS 管理控制台私有访问结合使用
<a name="ddb-streams-endpoints-private-access"></a>

当您在 [AWS 管理控制台私有访问](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)中将 VPC 端点与 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb)结合使用时，必须为 DynamoDB 和 DynamoDB Streams 设置 DNS 配置。

要将 DynamoDB 配置为可在 AWS 管理控制台私有访问中访问，您必须创建以下两个 VPC 端点：
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

创建 VPC 端点时，请导航到 Route53 控制台，然后使用区域端点 `dynamodb.us-east-1.amazonaws.com` 为 DynamoDB 创建私有托管区。

在私有托管区中创建以下两个别名记录：
+ `dynamodb.<region>.amazonaws.com` 将流量路由到 VPC 端点 `com.amazonaws.<region>.dynamodb`。
+ `streams.dynamodb.<region>.amazonaws.com` 将流量路由到 VPC 端点 `com.amazonaws.<region>.dynamodb-streams`。

# 使用适用于 DynamoDB Accelerator（DAX）的 AWS PrivateLink
<a name="dax-private-link"></a>

利用适用于 DynamoDB Accelerator（DAX）的 AWS PrivateLink，您可以通过虚拟私有云（VPC）中的私有 IP 地址，安全地访问 DAX 管理 API，例如 `CreateCluster`、`DescribeClusters` 和 `DeleteCluster`。此功能让您能够从应用程序私密访问 DAX 服务，而无需向公共互联网公开流量。

DAX PrivateLink 支持双栈端点（`dax.{region}.api.aws`），可同时实现 IPv4 和 IPv6 连接。借助适用于 DAX 的 AWS PrivateLink，客户可以使用私有 DNS 名称访问服务。双栈端点支持在确保透明连接的同时，维护了网络隐私。这使得您可以通过公共互联网和 VPC 端点访问 DAX，而无需对 SDK 配置进行任何更改。

## 使用适用于 DynamoDB Accelerator（DAX）的 AWS PrivateLink 时需要考虑的因素
<a name="dax-privatelink-considerations"></a>

在实施适用于 DynamoDB Accelerator（DAX）的 AWS PrivateLink 时，有几个重要的注意事项必须予以考虑。

在为 DAX 设置接口端点之前，请考虑以下事项：
+ DAX 接口端点仅支持访问同一个 AWS 区域中的 DAX 管理 API。您不能使用接口端点访问其他区域中的 DAX 管理 API。
+ 要私密访问 AWS 管理控制台以进行 DAX 管理，您可能需要为 `com.amazonaws.region.console` 等服务及相关服务创建额外的 VPC 端点。
+ 您为 DAX 创建和使用的接口端点需要付费。有关定价信息，请参阅 [AWS PrivateLink 定价](https://aws.amazon.com/vpc/pricing/)。

## AWS PrivateLink 如何与 DAX 协同工作
<a name="dax-privatelink-how-it-works"></a>

当您为 DAX 创建接口端点时：

1. AWS 将在您为接口端点启用的每个子网中创建一个端点网络接口。

1. 这些是请求者托管的网络接口，用作发往 DAX 的流量的入口点。

1. 然后，您可以通过 VPC 内的私有 IP 地址访问 DAX。

1. 此架构让您可以使用 VPC 安全组来管理对端点的访问。

1. 应用程序可以通过 VPC 内各自的接口端点访问 DynamoDB 和 DAX，同时还允许本地应用程序通过 Direct Connect 或 VPN 进行连接。

1. 这为两种服务提供了一致的连接模式，可简化架构，并通过将流量保持在 AWS 网络内来提高安全性。

## 为 DAX 创建接口端点
<a name="dax-privatelink-creating-endpoints"></a>

您可以创建接口端点以使用 AWS 管理控制台、AWS SDK、CloudFormation 或 AWS API 连接到 DAX。

**使用控制台为 DAX 创建接口端点**

1. 导航到位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中，选择**端点**。

1. 选择 **Create Endpoint**（创建端点）。

1. 在**服务类别**中，选择 **AWS 服务**，然后对于**服务名称**，搜索并选择 `com.amazonaws.region.dax`。

1. 对于 **VPC**，选择要从中访问 DAX 的 VPC；对于**子网**，选择 AWS 将在其中创建端点网络接口的子网。

1. 对于**安全组**，选择或创建要与端点网络接口关联的安全组。

1. 对于**策略**，请保留默认的**完全访问权限**或根据需要进行自定义。

1. 要为端点启用私有 DNS，请选择 **启用 DNS 名称**。保持私有 DNS 名称处于启用状态，防止在 SDK 配置中进行更改。启用后，您的应用程序可以继续使用标准服务 DNS 名称（例如：`dax.region.amazonaws.com`）。AWS 会在您的 VPC 中创建私有托管区，将此名称解析为您的端点的私有 IP 地址。
**注意**  
如果需要，请使用区域 DNS 名称。建议不要使用分区 DNS 名称。此外，您还可以从 3 个或更多可用区中选择子网，确保通过 PrivateLink 实现最高可用性。

1. 选择**创建端点**。

**使用 AWS CLI 为 DAX 创建接口端点**  
使用 `create-vpc-endpoint` 命令，并将 `vpc-endpoint-type` 参数设置为 `Interface`，将 `service-name` 参数设置为 `com.amazonaws.region.dax`。

```
aws ec2 create-vpc-endpoint \
    --vpc-id vpc-ec43eb89 \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.us-east-1.dax \
    --subnet-ids subnet-abcd1234 subnet-1a2b3c4d \
    --security-group-ids sg-1a2b3c4d \
    --private-dns-enabled
```

## 其他资源
<a name="dax-privatelink-resources"></a>

有关 AWS PrivateLink 和 VPC 端点的更多信息，请参阅以下资源：
+ [AWS PrivateLink适用于 DynamoDB 的](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/privatelink-interface-endpoints.html) 
+ [AWS PrivateLink适用于 DynamoDB Streams 的](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/privatelink-streams.html) 
+ [使用 AWS PrivateLink 将 VPC 连接到服务](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)
+ [使用 AWS PrivateLink 简化与 DynamoDB 的私有连接](https://aws.amazon.com/blogs//database/simplify-private-connectivity-to-amazon-dynamodb-with-aws-privatelink)
+ [AWS PrivateLink 白皮书](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-privatelink.html)

# Amazon DynamoDB 的配置和漏洞分析
<a name="configuration-vulnerability"></a>

AWS 负责处理基本安全任务，如来宾操作系统（OS）和数据库补丁、防火墙配置和灾难恢复等。这些流程已通过相应第三方审核和认证。有关更多详细信息，请参见以下资源：
+ [Amazon DynamoDB 的合规性验证](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Compliance.html)
+ [责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)
+ [亚马逊云科技：安全过程概述](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)（白皮书）

以下安全最佳实践还处理 Amazon DynamoDB 的配置和漏洞分析：
+ [使用 AWS Config 规则 监控 DynamoDB 合规性](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security-detective.html#rules)
+ [使用 AWS Config 监控 DynamoDB 配置](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security-detective.html#config)

# Amazon DynamoDB 的安全最佳实践
<a name="best-practices-security"></a>

Amazon DynamoDB 提供多个安全功能，供您在开发和实施自己的安全策略时考虑。以下最佳实践是一般指导原则，并不代表完整安全解决方案。这些最佳实践可能不适合您的环境或不满足您的环境要求，请将其视为有用的考虑因素而不是惯例。

**Topics**
+ [DynamoDB 预防性安全最佳实践](best-practices-security-preventative.md)
+ [DynamoDB 探测性安全最佳实践](best-practices-security-detective.md)

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

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

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

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

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

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

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

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

# DynamoDB 探测性安全最佳实践
<a name="best-practices-security-detective"></a>

以下 Amazon DynamoDB 最佳实践可以帮助发现潜在安全弱点和事件。

**利用 AWS CloudTrail 监控 AWS 托管 KMS 密钥使用**  
如果使用 [AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 进行静态加密， 将此密钥的使用记录到 AWS CloudTrail 中。CloudTrail 按照帐户上执行的记录操作，显示用户活动。CloudTrail 记录有关每个操作的重要信息，包括谁发出请求、所使用的服务、执行的操作、操作的参数以及 AWS 服务返回的响应元素。这些信息有助于跟踪 AWS 资源更改，解决运营问题。利用 CloudTrail，可以更轻松确保符合内部策略和法规标准。  
可以使用 CloudTrail 审计密钥使用情况。CloudTrail 创建日志文件，其中包含账户的 AWS API 调用和相关事件历史记录。这些日志文件包含通过 AWS 管理控制台、AWS SDK 和命令行工具，以及通过集成的 AWS 服务发出的所有 AWS KMS API 请求。可以使用这些日志文件，获取 KMS 密钥使用时间、请求的操作、请求者的身份、发出请求的 IP 地址等信息。有关更多信息，请参见[用 AWS CloudTrail 记录 AWS KMS API 调用](https://docs.aws.amazon.com/kms/latest/developerguide/logging-using-cloudtrail.html)和 [AWS CloudTrail 用户指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

**使用 CloudTrail 监控 DynamoDB 操作**  
CloudTrail 可以监控控制层面事件和数据层面事件。控制层面操作可以创建和管理 DynamoDB 表。还可以支持您使用依赖于表的索引、流和其他对象。数据层面操作支持对表的数据执行创建、读取、更新和删除（也称为 *CRUD*）操作。某些数据层面操作还可以从二级索引读取数据。要在 CloudTrail 中启用数据层面事件记录，需要在 CloudTrail 中启用数据层面 API 操作记录。请参见[记录数据事件用于跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)了解更多信息。  
在 DynamoDB 中发生操作时，操作将与事件历史记录中的其他 AWS 服务事件一起记录在 CloudTrail 事件中。有关更多信息，请参见[使用 AWS CloudTrail 记录 DynamoDB 操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/logging-using-cloudtrail.html)。可以在 AWS 账户中查看、搜索和下载最新事件。有关更多信息，请参见 *AWS CloudTrail 用户指南*中的[使用 CloudTrail 事件历史记录查看事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。  
要持续记录 AWS 账户中的事件（包括 DynamoDB 的事件），请创建[跟踪记录](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)。通过跟踪，CloudTrail 可将日志文件传送至 Amazon Simple Storage Service (Amazon S3) 存储桶。在控制台创建跟踪时，跟踪默认应用于所有 AWS 区域。跟踪记录 AWS 分区所有区域的事件，将日志文件传送至指定的 S3 存储桶。此外，可以配置其他 AWS 服务，进一步分析和应对 CloudTrail 日志中收集的事件数据。

**使用 DynamoDB Streams 监视数据平面操作**  
DynamoDB 集成 AWS Lambda，可以创建触发器—自动响应 DynamoDB Streams 事件的代码片段。利用触发器，可以创建应用程序，应对 DynamoDB 表的数据修改。  
如果在表中启用 DynamoDB Streams，可以将流 Amazon Resource Name (ARN) 与您编写的 Lambda 函数关联起来。修改表中的项目后，表的流中立刻显示一条新记录。AWS Lambda 将轮询流，并在检测到新的流记录时同步调用 Lambda 函数。Lambda 函数可以执行指定的任何操作，例如发送通知或启动工作流。  
有关示例，请参见[教程：对 Amazon DynamoDB Streams 使用 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb-example.html)。此示例接收 DynamoDB 事件输入，处理其中包含的消息，将一些传入事件数据写入 Amazon CloudWatch Logs。

** 使用 监控 DynamoDB 配置AWS Config**  
使用 [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)，可以持续监视和记录 AWS 资源的配置更改。还可以使用 AWS Config 盘点 AWS 资源。如果检测到以前状态更改，可以发送 Amazon Simple Notification Service (Amazon SNS) 通知，供您查看并采取措施。遵循[用控制台设置 AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html) 的指导，确保包含 DynamoDB 资源类型。  
可以配置 AWS Config，将配置更改和通知流式传输到 Amazon SNS 主题。例如，更新资源时，可以通过电子邮件接收通知，查看更改。也可以在 AWS Config 针对您的资源评估自定义规则或托管规则时收到通知。  
有关示例，请参阅 *AWS Config 开发人员指南*中的 [AWS Config 发送至 Amazon SNS 主题的通知](https://docs.aws.amazon.com/config/latest/developerguide/notifications-for-AWS-Config.html)。

** 监视 DynamoDB 的 AWS Config 规则合规性**  
AWS Config 持续跟踪资源中发生的配置更改，检查这些更改是否违反规则中的任何条件。如果资源违反规则，AWS Config 将该资源和规则标记为不合规。  
利用 AWS Config 来评估资源配置，您可以评测资源配置符合内部实践、行业指南和法规的情况。AWS Config 提供 [AWS 托管规则](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html)，AWS Config 利用这些预定义且可定制的规则，来评测 AWS 资源是否符合常见最佳实践。

**标记 DynamoDB 资源以进行标识和自动化**  
可以将自己的元数据以标签形式分配给 AWS 资源。每个标签都是一个标注，包含一个客户定义的密钥和一个可选值，方便管理、搜索和筛选资源。  
标签可实现分组控制。尽管没有固有类型的标签，但利用标签，可以根据用途、所有者、环境或其他条件分类资源。下面是一些示例：  
+ 安全性 – 用于确定加密等要求。
+ 机密性 – 资源支持的特定数据机密等级的标识符。
+ 环境 – 用于区分开发、测试和生产基础设施。
有关更多信息，请参阅 [AWS 标签策略](https://aws.amazon.com/answers/account-management/aws-tagging-strategies/)和 [DynamoDB 标签](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)。

**监控 Amazon DynamoDB 的使用情况，因为它与使用 AWS Security Hub CSPM 的安全最佳实践有关。**  
Security Hub CSPM 使用安全控件来评估资源配置和安全标准，以帮助您遵守各种合规框架。  
有关使用 Security Hub CSPM 评估 DynamoDB 资源的更多信息，请参阅《AWS Security Hub CSPM 用户指南》**中的 [Amazon DynamoDB 控件](https://docs.aws.amazon.com/securityhub/latest/userguide/dynamodb-controls.html)。