

# 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. 在确认窗口中，选择**是，终止**。