

# Amazon ECS 的网络安全最佳实践
<a name="security-network"></a>

网络安全是一个包含多个子主题的广泛主题。其中包括传输中加密、网络分段和隔离、防火墙、流量路由和可观测性。

## 传输中加密
<a name="security-network-encryption"></a>

加密网络流量可防止未经授权的用户在通过网络传输数据时拦截和读取数据。使用 Amazon ECS，可以通过以下任何方式实施网络加密。
+ **使用 Nitro 实例：**

  默认情况下，以下 Nitro 实例类型之间的流量会自动加密：C5n、G4、I3en、M5dn、M5n、P3dn、R5dn 和 R5n。当流量通过中转网关、负载均衡器或类似中介进行路由时，不会对其进行加密。
  + [传输中加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/data-protection.html#encryption-transit)
  + [2019 年以来的新公告](https://aws.amazon.com/about-aws/whats-new/2019/10/introducing-amazon-ec2-m5n-m5dn-r5n-and-r5dn-instances-featuring-100-gbps-of-network-bandwidth/)
  + [此演讲来自 re:Inforce 2019](https://youtu.be/oqHLLbOoxDg?si=Us1YhSiY4deXLFA7)
+ **将服务器名称指示（SNI）协议与应用程序负载均衡器一起使用：**

  应用程序负载均衡器（ALB）和网络负载均衡器（NLB）支持服务器名称指示（SNI）。通过使用 SNI，您可以将多个安全应用程序放在一个侦听器后面。为此，每个侦听器都有自己的 TLS 证书。建议您使用 AWS Certificate Manager（ACM）为负载均衡器预调配证书，然后将其添加到侦听器的证书列表中。AWS 负载均衡器将智能证书选择算法与 SNI 结合使用。如果客户端提供的主机名与证书列表中的一个证书匹配，则负载均衡器将选择此证书。如果客户端提供的主机名与证书列表中的多个证书匹配，则负载均衡器将选择客户端可支持的证书。示例包括自签名证书或通过 ACM 生成的证书。
  + [使用应用程序负载均衡器的 SNI](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html#https-listener-certificates)
  + [使用网络负载均衡器的 SNI](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-listener.html)
+ **使用 TLS 证书的端到端加密：**

  这涉及使用任务部署 TLS 证书。这可以是自签名证书，也可以是来自可信证书颁发机构的证书。您可以通过引用证书的密钥来获取证书。否则，您可以选择运行一个容器，该容器向 ACM 发出证书签名请求（CSR），然后将生成的密钥挂载到共享卷中。
  + [使用搭载 Amazon ECS 的网络负载均衡器维护整个容器的传输层安全（第 1 部分）](https://aws.amazon.com/blogs//compute/maintaining-transport-layer-security-all-the-way-to-your-container-using-the-network-load-balancer-with-amazon-ecs/)
  + [维护整个容器的传输层安全性协议（TLS）第 2 部分：使用 AWS 私有证书颁发机构](https://aws.amazon.com/blogs//compute/maintaining-transport-layer-security-all-the-way-to-your-container-part-2-using-aws-certificate-manager-private-certificate-authority/)

## 任务联网
<a name="security-network-task-networking"></a>

以下建议考虑了 Amazon ECS 的工作原理。Amazon ECS 不使用叠加网络。相反，任务配置为在不同的网络模式下运行。例如，配置为使用 `bridge` 模式的任务会从每台主机上运行的 Docker 网络获取不可路由的 IP 地址。配置为使用 `awsvpc` 网络模式的任务会从主机的子网获取 IP 地址。配置了 `host` 联网功能的任务使用主机的网络接口。`awsvpc` 是首选的网络模式。这是因为它是您可以用来为任务分配安全组的唯一模式。它也是唯一可用于在 Amazon ECS 上的 AWS Fargate 任务的模式。

### 任务的安全组
<a name="security-network-task-networking-security-group"></a>

建议您配置任务以使用 `awsvpc` 网络模式。将任务配置为使用此模式后，Amazon ECS 代理会自动预调配弹性网络接口（ENI）并将其附加到该任务。预调配 ENI 后，任务将注册到 AWS 安全组中。安全组充当 VPC 的虚拟防火墙，您可以使用该防火墙控制入站和出站流量。

如果为任务或服务使用自定义防火墙，请添加一条出站规则以允许 Amazon ECS 代理管理端点（“`ecs-a-*.region.amazonaws.com`”）、遥测端点（“`ecs-t-*.region.amazonaws.com`”）和 Service Connect Envoy 管理端点（“`ecs-sc.region.api.aws`”）的流量。

## AWS PrivateLink 和 Amazon ECS
<a name="security-network-privatelink"></a>

AWS PrivateLink 是一种网络技术，使您能够为包括 Amazon ECS 在内的不同 AWS 服务创建私有端点。在没有连接到 Amazon VPC 的互联网网关（IGW），也没有通往互联网的备用路由的沙盒环境中，需要端点。使用 AWS PrivateLink 可确保对 Amazon ECS 服务的调用保持在 Amazon VPC 内且不会产生互联网流量。有关如何为 Amazon ECS 和其他相关服务创建 AWS PrivateLink 端点的说明，请参阅 [Amazon ECS 接口 Amazon VPC 端点](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/vpc-endpoints.html)。

**重要**  
AWS Fargate 任务不需要使用 Amazon ECS 的 AWS PrivateLink 端点。

Amazon ECR 和 Amazon ECS 都支持端点策略。这些策略使您能够完善对服务 API 的访问权限。例如，您可以为 Amazon ECR 创建端点策略，该策略仅允许将映像推送到特定 AWS 账户的注册表。这样的策略可以用来防止数据通过容器映像泄露，同时仍然允许用户推送到授权的 Amazon ECR 注册表。有关更多信息，请参阅[使用 VPC 端点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies)。

以下策略仅允许您账户中的所有 AWS 主体对您的 Amazon ECR 存储库执行所有操作：

```
{
  "Statement": [
    {
      "Sid": "LimitECRAccess",
      "Principal": "*",
      "Action": "*",
      "Effect": "Allow",
      "Resource": "arn:aws:ecr:region:account_id:repository/*"
    },
  ]
}
```

您可以通过设置使用新 `PrincipalOrgID` 属性的条件来进一步增强这一点。这样可以防止不属于您的 AWS Organizations 的 IAM 主体推送和拉取映像。有关更多信息，请参阅 [aws:PrincipalOrgID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)。

建议对 `com.amazonaws.region.ecr.dkr` 和 `com.amazonaws.region.ecr.api` 端点应用相同的策略。

## 容器代理设置
<a name="security-network-ecs-agent-settings"></a>

Amazon ECS 容器代理配置文件包含多个与网络安全相关的环境变量。`ECS_AWSVPC_BLOCK_IMDS` 和 `ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST` 用于阻止任务访问 Amazon EC2 元数据。`HTTP_PROXY` 用于将代理配置为通过 HTTP 代理进行路由以连接到互联网。有关将代理和 Docker 运行时系统配置为通过代理进行路由的说明，请参阅 [HTTP 代理配置](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/http_proxy_config.html)。

**重要**  
当您使用 AWS Fargate 时，这些设置不可用。

## 网络安全建议
<a name="security-network-recommendations"></a>

建议您在设置 Amazon VPC、负载均衡器和网络时执行以下操作。

### 在适用的情况下将网络加密与 Amazon ECS 结合使用
<a name="security-network-recommendations-network-encryption"></a>

您应该在适用的情况下使用网络加密。某些合规计划（例如 PCI DSS）要求您对传输中数据进行加密，前提是这些数据包含持卡人数据。如果您的工作负载有类似的要求，请配置网络加密。

当用户连接到不安全的网站时，现代浏览器会发出警告。如果您的服务前面有面向公众的负载均衡器，请使用 TLS/SSL 加密从客户端浏览器到负载均衡器的流量，并在必要时重新加密到后端。

### 使用 `awsvpc` 网络模式和安全组控制任务与 Amazon ECS 中的其他资源之间的流量
<a name="security-network-recommendations-awsvpc-networking-mode"></a>

当您需要控制任务之间和任务与其他网络资源之间的流量时，您应该使用 `awsvpc` 网络模式和安全组。如果服务位于 ALB 之后，请使用安全组，以仅允许来自所用安全组与您的 ALB 相同的其他网络资源的入站流量。如果您的应用程序位于 NLB 之后，请将任务的安全组配置为仅允许来自 Amazon VPC CIDR 范围的入站流量以及分配给 NLB 的静态 IP 地址。

还应使用安全组来控制任务与 Amazon VPC 内其他资源（例如 Amazon RDS 数据库）之间的流量。

### 当需要严格隔离网络流量时，在单独的 Amazon VPC 中创建 Amazon ECS 集群
<a name="security-network-recommendations-separate-vpcs-for-isolated-traffic"></a>

当需要严格隔离网络流量时，您需要在单独的 Amazon VPC 中创建集群。避免在集群上使用不必遵守严格安全要求的工作负载运行具有严格安全要求的工作负载。当必须进行严格的网络隔离时，请在单独的 Amazon VPC 中创建集群，并有选择地使用 Amazon VPC 端点向其他 Amazon VPC 公开服务。有关更多信息，请参阅 [VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/concepts.html#concepts-vpc-endpoints)。

### 在必要时为 Amazon ECS 配置 AWS PrivateLink 端点
<a name="security-network-privatelink-endpoints"></a>

您应在必要时配置 AWS PrivateLink 端点。如果您的安全策略防止您将互联网网关（IGW）连接到 Amazon VPC，请为 Amazon ECS 以及 Amazon ECR、AWS Secrets Manager 和 Amazon CloudWatch 等其他服务配置 AWS PrivateLink 端点。

### 使用 Amazon VPC 流日志分析 Amazon ECS 中的长时间运行任务的进出流量
<a name="security-network-vpc-flow-logs"></a>

您应该使用 Amazon VPC 流日志分析长时间运行的任务的进出流量。使用 `awsvpc` 网络模式的任务会获得自己的 ENI。为此，您可以使用 Amazon VPC 流日志监控进出单个任务的流量。Amazon VPC 流日志（v3）的最新更新使用流量元数据丰富了日志，包括 vpc ID、子网 ID 和实例 ID。此元数据可用于帮助缩小调查范围。有关更多信息，请参阅 [Amazon VPC 流日志](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-logs-basics)。

**注意**  
由于容器的临时性质，流日志可能并不总是分析不同容器或容器与其他网络资源之间的流量模式的有效方法。