

# 加密 Amazon ECS Service Connect 流量
<a name="service-connect-tls"></a>

Amazon ECS Service Connect 支持使用传输层安全性协议（TLS）证书对 Amazon ECS 服务进行自动流量加密。当您将 Amazon ECS 服务指向 [AWS 私有证书颁发机构（AWS 私有 CA）](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)时，Amazon ECS 会自动预调配 TLS 证书，以加密您的 Amazon ECS Service Connect 服务之间的流量。Amazon ECS 生成、轮换和分发用于流量加密的 TLS 证书。

通过 Service Connect 进行自动流量加密将使用业界领先的加密功能来保护您的服务间通信，从而帮助您满足安全要求。它支持使用 `256-bit ECDSA` 和 `2048-bit RSA` 加密的 AWS 私有证书颁发机构 TLS 证书。您还可以完全控制私有证书和签名密钥，从而帮助您满足合规性要求。默认情况下，支持 TLS 1.3，但不支持 TLS 1.0：1.2。Service Connect 支持具有以下密码的 TLS 1.3：
+ `TLS_AES_128_GCM_SHA256`
+ `TLS_AES_256_GCM_SHA384`
+ `TLS_CHACHA20_POLY1305_SHA256`

**注意**  
要使用 TLS 1.3，您必须在目标上的侦听器上启用它。  
只有通过 Amazon ECS 代理的入站和出站流量才会被加密。

## Service Connect 和应用程序负载均衡器运行状况检查
<a name="service-connect-tls-alb-healthchecks"></a>

您可以将 Service Connect 与应用程序负载均衡器运行状况检查和 TLS 1.3 加密一起使用。

### 应用程序负载均衡器配置
<a name="service-connect-tls-alb-config"></a>

使用以下设置来配置应用程序负载均衡器：
+ 配置一个具有 TLS 1.3 安全策略（例如“ELBSecurityPolicy-TLS13-1-2-2021-06”）的 TLS 侦听器。有关更多信息，请参阅[应用程序负载均衡器的安全策略](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/describe-ssl-policies.html)。
+ 创建一个具有以下设置的目标组：
  + 将协议设置为 HTTPS
  + 将该目标组连接到该 TLS 侦听器
  + 配置运行状况检查端口，使其与 Service Connect 服务的容器端口匹配

### Service Connect 配置
<a name="service-connect-tls-sc-config"></a>

配置一个具有以下设置的服务：
+ 将该服务配置为使用 `awsvpc` 网络模式，因为不支持 `bridge` 网络模式。
+ 为该服务启用 Service Connect。
+ 使用以下设置设置负载均衡器配置：
  + 指定您为应用程序负载均衡器配置的目标组
  + 设置容器端口，使其与 Service Connect TLS 服务的容器端口匹配
+ 不要为该服务设置 `ingressPortOverride`。有关更多信息，请参阅《Amazon Elastic Container Service API 参考》**中的 [ServiceConnectService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)。

### 注意事项
<a name="service-connect-tls-alb-considerations"></a>

在使用应用程序负载均衡器、TLS 和 Service Connect 时请注意以下事项：
+ 将 Service Connect 与 TLS 加密结合使用时，应使用 `awsvpc` 网络模式进行 HTTPS 运行状况检查，而不是 `bridge` 网络模式。HTTP 运行状况检查将继续支持 `bridge` 模式。
+ 配置目标组的运行状况检查端口，使其与 Service Connect 服务的容器端口匹配，而不是使用默认的 HTTPS 端口（443）。

## AWS 私有证书颁发机构 证书和 Service Connect
<a name="service-connect-tls-certificates"></a>

您需要拥有基础设施 IAM 角色。有关此角色的更多信息，请参阅 [Amazon ECS 基础设施 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html                     )。

**Service Connect 的 AWS 私有证书颁发机构 模式**

AWS 私有证书颁发机构 可以在两种模式下运行：通用模式和短暂模式。
+ 通用 – 可配置为任何到期日期的证书。
+ 短期 – 最长有效期为七天的证书。

虽然 Amazon ECS 对这两种模式都支持，但建议使用短期证书。默认情况下，证书每五天轮换一次，与通用型相比，在短期模式下运行可以节省大量成本。

Service Connect 不支持证书吊销，而是利用进行频繁的证书轮换的短期证书。您有权在 [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 中使用[托管轮换](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_managed.html)修改轮换频率、禁用或删除密钥，但这样做可能会带来以下可能的后果。
+ 较短的轮换频率 – 较短的轮换频率会因 AWS 私有 CA、AWS KMS 和 Secrets Manager 以及轮换工作负载增加的自动扩缩而导致更高的成本。
+ 更长的轮换频率 – 如果轮换频率超过**七**天，应用程序的通信就会失败。
+ 删除密钥 – 删除密钥会导致轮换失败并影响客户应用程序通信。

如果您的密钥轮换失败，则会在 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 中发布 `RotationFailed` 事件。您也可以为 `RotationFailed` 设置 [CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

**重要**  
不要将副本区域添加到密钥中。这样做可以防止 Amazon ECS 删除密钥，因为 Amazon ECS 无权从复制中移除区域。如果您已经添加了复制，请运行以下命令。  

```
aws secretsmanager remove-regions-from-replication \
 --secret-id {{SecretId}} \
 --remove-replica-regions {{region-name}}
```

**从属证书颁发机构**  
您可以将任何 AWS 私有 CA（根或从属）带到 Service Connect TLS，从而为服务颁发终端实体证书。所提供的颁发者在任何地方都被视为签名者和可信根。您可以从不同的从属 CA 为应用程序的不同部分颁发终端实体证书。使用 AWS CLI 时，请提供用于建立信任链的 CA 的 Amazon 资源名称（ARN）。

**本地证书颁发机构**  
要使用您的本地 CA，请在 AWS 私有证书颁发机构 中创建和配置从属 CA。这样可以确保为您的 Amazon ECS 工作负载颁发的所有 TLS 证书都与您在本地运行的工作负载共享信任链，并且能够安全连接。

**重要**  
请在您的 AWS 私有 CA 中添加**所需的**标签 `AmazonECSManaged : true`。

**基础设施即代码**  
将 Service Connect TLS 与基础设施即代码（IaC）工具配合使用时，请务必正确配置依赖项，以避免出现服务停滞在耗尽状态等问题。使用完您的 Amazon ECS 服务后应将您的 AWS KMS 密钥（如果提供）、IAM 角色和 AWS 私有 CA 依赖项删除。

如果用于 Service Connect 的命名空间是共享命名空间，则可以选择使用共享的 AWS 私有 CA 资源。有关更多信息，请参阅《AWS 私有证书颁发机构 用户指南》**中的[附加跨账户访问策略](https://docs.aws.amazon.com/privateca/latest/userguide/pca-ram.html)。

## Service Connect 和 Secrets Manager
<a name="service-connect-asm"></a>

**使用采用 TLS 加密的 Amazon ECS Service Connect 时，服务通过以下方式与 Secrets Manager 进行交互：**  
Service Connect 利用提供的基础设施角色在 Secrets Manager 中创建密钥。这些密钥用于存储 TLS 证书的关联私钥，用于加密 Service Connect 服务之间的流量。

**警告**  
Service Connect 会自动创建和管理这些密钥，简化了为您的服务实施 TLS 加密的过程。但是，请务必注意潜在的安全影响。对 Secrets Manager 具有读取权限的其他 IAM 角色可能能够访问这些自动创建的密钥。如果访问控制配置不当，这可能会将敏感的加密材料暴露给未经授权的各方。  
要降低这种风险，请遵循以下最佳实践：  
谨慎管理和限制对 Secrets Manager 的访问，尤其是对 Service Connect 创建的密钥的访问。
定期审计 IAM 角色及其权限，以确保最低权限原则得到遵循。

在授予对 Secrets Manager 的读取权限时，请考虑排除由 Service Connect 创建的 TLS 私钥。为此，您可以在 IAM 策略中使用一个条件来排除采用与模式匹配的 ARN 的密钥：

```
"arn:aws:secretsmanager:::secret:ecs-sc!"
```

拒绝对所有带有 `ecs-sc!` 前缀的密钥执行 `GetSecretValue` 操作的 IAM 策略示例：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:*:*:secret:ecs-sc!*"
        }
    ]
}
```

------

**注意**  
这是一个一般示例，可能需要根据您的特定使用案例和 AWS 账户配置进行调整。请始终彻底测试您的 IAM 策略，确保它们在保证安全的同时提供预期访问权限。

通过了解 Service Connect 与 Secrets Manager 的交互方式，您可以更好地管理 Amazon ECS 服务的安全，同时利用自动 TLS 加密的优势。

## Service Connect 和 AWS Key Management Service
<a name="service-connect-kms"></a>

您可以使用 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 来加密和解密您的 Service Connect 资源。AWS KMS 是 AWS 管理的一项服务，可以通过该服务创建和管理用于保护数据的加密密钥。

将 AWS KMS 与 Service Connect 结合使用时，您可以选择使用 AWS 为您管理的 AWS 拥有的密钥，也可以选择现有的 AWS KMS 密钥。您也可以[创建新的 AWS KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)以供使用。

**提供您自己的加密密钥**  
您可以提供自己的密钥材料，也可以通过 AWS Key Management Service 使用外部密钥存储，将自己的密钥导入 AWS KMS，然后在 Amazon ECS Service Connect 中指定该密钥的 Amazon 资源名称（ARN）。

以下是示例 AWS KMS 策略。将所有 {{user input}} 值替换为您自己的值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "{{id}}",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{111122223333}}:role/{{role-name}}"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:GenerateDataKeyPair"
      ],
      "Resource": "*"
    }
  ]
}
```

------

有关密钥策略的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)。

**注意**  
Service Connect 仅支持对称加密 AWS KMS 密钥。您不能使用任何其他类型的 AWS KMS 密钥来加密您的 Service Connect 资源。有关确定 AWS KMS 密钥是否为对称加密密钥的帮助，请参阅 [Identify asymmetric KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/identify-key-types.html#identify-asymm-keys)。

有关 AWS Key Management Service 对称加密密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[对称加密 AWS KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。