

# 强制执行传输中 VPC 加密
<a name="vpc-encryption-controls"></a>

VPC 加密控制是一项安全与合规功能，可让您通过集中式的权威控制来监控流量加密状态，帮助您识别允许明文通信的资源，并最终提供了在区域中的 VPC 之内以及跨 VPC 强制执行传输中加密的机制

VPC 加密控制同时使用应用层加密和 AWS nitro 系统硬件的内置传输加密功能，来确保强制加密。此功能还将原生硬件层加密功能从现代 Nitro 实例扩展到其他 AWS 服务，包括 Fargate、应用程序负载均衡器、中转网关等。

此功能专为任何需要确保所有流量的加密状态可见性和控制权的用户而设计。在数据加密对于满足 HIPAA、FedRAMP 和 PCI DSS 等合规性标准至关重要的行业中，此功能尤为实用。安全管理员和云架构师可以使用此功能在整个 AWS 环境中集中执行传输中加密策略

此功能可在监控模式和强制模式这两种模式下使用。

## 加密控制模式
<a name="encryption-controls-modes"></a>

**监控模式**  
在监控模式下，加密控制让您可以在 VPC 之内以及跨 VPC 了解 AWS 资源之间流量加密状态。此外还可帮助您识别未强制执行传输中加密的 VPC 资源。您可以配置 VPC 流日志，以发出将告诉您流量是否加密的富字段 `encryption-status`。您可以使用控制台或 `GetVpcResourcesBlockingEncryptionEnforcement` 命令识别未强制执行传输中加密的资源。

**注意**  
现有的 VPC 只能首先以监控模式启用。这让您可以了解允许或可能允许明文流量的资源。只有在这些资源开始强制加密（或者您为其创建了排除项）后，才能在 VPC 上启用强制模式。

**强制模式**  
在强制模式下，VPC 加密控制会阻止您使用任何在 VPC 边界内允许未加密流量的功能或服务。不能直接在现有 VPC 上以强制模式启用加密控制。必须首先以监控模式启用加密控制，识别不合规的资源并将其修改为强制执行传输中加密，然后才能启用强制模式。但您可以在创建新 VPC 过程中，以强制模式启用加密控制。

启用此功能后，强制模式将阻止您创建或附加未加密的 VPC 资源，例如不支持原生内置加密的旧 EC2 实例或互联网网关等。如果要在启用强制加密的 VPC 中运行不合规的资源，则必须为该资源创建排除项。

## 监控流量的加密状态
<a name="monitoring-encryption-status"></a>

您可以使用 VPC 流日志中的 `encryption-status` 字段来审计 VPC 内部流量的加密状态。可为以下值：
+ `0` = 未加密
+ `1` = nitro 加密（由 VPC 加密控制功能管理）
+ `2` = 应用程序加密 
  +  接口端点通过 TCP 端口 443 流向 AWS 服务的流量\$1 
  +  网关端点通过 TCP 端口 443 的流量\$1 
  +  通过 VPC 端点流向加密 Redshift 集群的流量\$1\$1 
+ `3` = 同时启用了 nitro 加密和应用程序
+ `(-)` = 加密状态未知或 VPC 加密控制功能已关闭

**注意：**

\$1 对于接口端点和网关端点，AWS 不会检查数据包数据以确定加密状态，而是依赖用于假定加密状态的端口。

\$1\$1 对于指定的 AWS 托管式端点，AWS 根据服务配置中的 TLS 要求来确定加密状态。

**VPC 流日志限制**
+ 要为 VPC 加密控制启用流日志，您需要手动创建包含 encryption-status 字段的新流日志。encryption-status 字段不会自动添加到现有的流日志中。
+ 建议在流日志中添加 \$1\$1traffic-path\$1 和 \$1\$1flow-direction\$1 字段，以在流日志中获取更多详细信息。

  示例：

  ```
  aws ec2 create-flow-logs \
  --resource-type VPC \
  --resource-ids vpc-12345678901234567 \
  --traffic-type ALL \
  --log-group-name my-flow-logs \
  --deliver-logs-permission-arn arn:aws:iam::123456789101:role/publishFlowLogs
  --log-format '${encryption-status} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${traffic-path} ${flow-direction} ${reject-reason}'
  ```

## VPC 加密控制排除项
<a name="vpc-encryption-controls-exclusions"></a>

VPC 加密控制的强制模式要求您在 VPC 中的所有资源都强制加密。这样可以在一个区域中确保在 AWS 范围内执行加密。但您可能会拥有允许连接到 AWS 网络之外的互联网网关、NAT 网关或虚拟专用网关等资源，这些资源的端到端加密均由您负责配置和维护。要在强制加密的 VPC 中运行这些资源，您可以创建资源排除项。排除项用于为客户负责维护加密（通常在应用程序层）的资源创建可审计的例外。

VPC 加密控制仅支持 8 种排除项。如果您的 VPC 中存在此类资源并且需要切换到强制模式，则在从监控模式切换到强制模式时，必须添加这些排除项。所有其他资源均不可排除。您可以通过为这些资源创建排除项，从而将您的 VPC 迁移到强制模式。流入和流出这些资源的流量由您负责加密
+ 互联网网关
+ NAT 网关
+ 仅出口互联网网关
+ 与未强制加密的 VPC 的 VPC 对等连接（有关详细场景，请参阅 VPC 对等连接支持部分）
+ 虚拟专用网关
+ VPC 之内的 Lambda 函数
+ VPC Lattice
+ Elastic File System

## 实现工作流程
<a name="implementation-workflow"></a>

1. **启用监控**：在监控模式下创建 VPC 加密控制

1. **分析流量**：检查流日志以监控流量的加密状态

1. **分析资源**：使用控制台或 `GetVpcResourcesBlockingEncryptionEnforcement` 命令识别未强制执行传输中加密的资源。

1. **准备 [可选]**：在想要开启强制模式时计划资源迁移和所需的排除项

1. **强制 [可选]**：切换到强制模式并配置所需的排除项

1. **审计**：通过流日志持续监控合规性

有关详细设置说明，请参阅博客文章 [Introducing VPC encryption controls: enforce encryption in transit within and across VPCs in a region](https://aws.amazon.com/blogs/aws/introducing-vpc-encryption-controls-enforce-encryption-in-transit-within-and-across-vpcs-in-a-region)。

## VPC 加密控制状态
<a name="vpc-encryption-controls-states"></a>

VPC 加密控制的可能状态如下：

**创建**  
正在 VPC 上创建 VPC 加密控制。

**正在修改**  
正在 VPC 上修改 VPC 加密控制

**删除**  
正在 VPC 上删除 VPC 加密控制

**available**  
已成功在 VPC 上以监控模式或强制模式实施 VPC 加密控制

## AWS 服务支持和兼容性
<a name="aws-service-support-compatibility"></a>

为确保加密合规，资源必须始终强制执行传输中加密，无论是在硬件层还是在应用程序层。对于大多数资源，您无需执行任何操作。

### 具有自动合规性的服务
<a name="services-automatic-compliance"></a>

PrivateLink（包括跨区域 PrivateLink）支持的大多数 AWS 服务都将接受在应用程序层执行流量加密。您无需对现有应用程序进行任何更改。AWS 会自动丢弃所有未执行应用程序层加密的流量。一些例外情况包括 Redshift 集群（包括预调配集群和无服务器，您需要手动迁移底层资源）

### 会自动迁移的资源
<a name="resources-migrate-automatically"></a>

开启监控模式后，网络负载均衡器、应用程序负载均衡器、Fargate 集群、EKS 控制面板将自动迁移到原生支持加密的硬件。您无需对现有应用程序进行任何更改。AWS 会自动处理迁移。

### 需要手动迁移的资源
<a name="resources-requiring-manual-migration"></a>

某些 VPC 资源和服务需要您选择底层实例类型。所有现代 EC2 实例都支持传输中加密。如果您的服务已经在使用现代 EC2 实例，则无需进行任何更改。您可以使用控制台或 GetVpcResourcesBlockingEncryptionEnforcement 命令来识别其中的任何服务是否在使用较早版本的实例。如果您发现了此类资源，则必须将其升级到任何支持 nitro 系统硬件原生加密的现代 EC2 实例。这些服务包括 EC2 实例、自动扩缩组、RDS（所有数据库和 Document-DB）、Elasticache 预调配集群、Amazon Redshift 预调配集群、EKS、ECS-EC2、OpenSearch 预调配集群和 EMR。

**兼容的资源：**  
以下资源与 VPC 加密控制兼容：
+ [基于 Nitro 的 EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/data-protection.html#encryption-transit)
+ 网络负载均衡器（存在限制）
+ 应用程序负载均衡器
+ AWS Fargate 集群
+ Amazon Elastic Kubernetes Service（EKS）
+ Amazon EC2 Auto Scaling Groups
+ Amazon Relational Database Service（RDS – 所有数据库）
+ 基于 Amazon ElastiCache 节点的集群
+ Amazon Redshift 预调配集群和无服务器集群
+ Amazon Elastic Container Service（ECS）– EC2 容器实例
+ Amazon OpenSearch Service
+ Amazon Elastic MapReduce（EMR）
+ Amazon Managed Streaming for Apache Kafka (Amazon MSK)
+ VPC 加密控制在应用程序层对通过 PrivateLink 访问的所有 AWS 服务强制加密。任何未在应用程序层加密的流量都会被托管在以强制模式启用加密控制的 VPC 内的 PrivateLink 端点丢弃

### 特定于服务的限制
<a name="service-specific-limitations"></a>

**网络负载均衡器的限制**  
TLS 配置：在包含相关资源的 VPC 上强制执行加密控制后，您将不能使用 TLS 侦听器将加密和解密工作移交给负载均衡器。但可以将目标配置为执行 TLS 加密和解密

**Redshift 预调配集群和无服务器**  
客户不能在包含现有集群/端点的 VPC 上切换到强制模式。要将 VPC 加密控制与 Redshift 结合使用，您必须通过快照还原集群或命名空间。对于预调配集群，请为现有 Redshift 集群创建快照，然后使用“从集群快照还原”操作，以从快照还原集群。对于无服务器，请为现有命名空间的快照，然后在无服务器工作组上使用“从快照还原”操作，以从快照还原命令空间。请注意，如果不执行快照创建和还原过程，则无法在现有集群或命名空间上启用 VPC 加密控制。有关创建快照的信息，请参阅 [Amazon Redshift 文档](https://docs.aws.amazon.com/redshift/latest/mgmt/welcome.html)。

**Amazon MSK（Managed Streaming for Apache Kafka）**  
版本 4.1 的新集群在自己的 VPC 中支持此功能。以下步骤有助您将 VPC 加密与 MSK 结合使用。
+ 客户在没有其他 MSK 集群的 VPC 上启用 VPC 加密
+ 客户使用 Kafka 版本 4.1、实例类型 M7g 创建集群

### 区域和可用区限制
<a name="regional-zone-limitations"></a>
+ **本地区域子网**：在强制模式下不支持，必须从 VPC 中将其删除

### VPC 对等连接支持
<a name="vpc-peering-support"></a>

为确保两个 VPC 之间的 VPC 对等连接使用传输中加密，这两个 VPC 必须位于同一区域，并且在强制模式下开启加密控制，且没有任何排除项。如果要将强制加密的 VPC 与位于不同区域的其他 VPC 或未在强制模式下启用加密控制（无排除项）的其他 VPC 建立对等连接，则必须创建对等连接排除项。

如果这两个 VPC 处于强制模式并相互建立对等连接，则无法将其从强制模式更改为监控模式。在修改要监控的 VPC 加密控制模式之前，您必须首先创建对等连接排除项。

### 中转网关加密支持
<a name="transit-gateway-encryption-support"></a>

必须在中转网关上显式启用加密支持，才能在已开启加密控制的 VPC 之间加密流量。在现有中转网关上启用加密不会造成现有流量中断，并且将会自动无缝地将 VPC 挂载迁移到加密通道。两个处于强制模式（无排除项）的 VPC 之间通过该中转网关的流量将遍历 100% 加密的通道。借助中转网关加密功能，您还可以连接两个处于不同加密控制模式的 VPC。如果您需要在连接到未强制加密的 VPC 的 VPC 中强制执行加密控制，则应使用此功能。在此场景中，您在强制加密的 VPC 内的所有流量（包括 VPC 间的流量）都将被加密。VPC 间流量将在强制加密的 VPC 中的资源与中转网关之间加密。除此之外，加密还取决于流量在未强制加密的 VPC 中流向的资源，并且不能保证一定会加密（因为该 VPC 未处于强制模式）。所有 VPC 必须位于同一区域。（详情请参阅[此处](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-encryption-support.html)）。

![\[具有不同加密控制状态的 VPC 之间的流量\]](http://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/images/vpc-enc-control-arch.png)

+ 在此图中，VPC 1、VPC 2 和 VPC3 的加密控制处于强制模式，并且都连接到以监控模式运行加密控制的 VPC 4。
+ VPC1、VPC2 和 VPC3 之间的所有流量都将被加密。
+ 更具体而言，在该中转网关之前，VPC 1 中资源与 VPC 4 中资源之间的任何流量都将使用 nitro 系统硬件提供的加密进行加密。除此之外，加密状态将取决于 VPC 4 中的资源，并且不保证一定会加密。

有关中转网关加密支持的更多详细信息，请参阅[中转网关文档](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-encryption-support.html)。

## 定价
<a name="pricing"></a>

有关定价信息，请参阅 [Amazon VPC 定价](https://aws.amazon.com/vpc/pricing/)。

## AWS CLI 命令参考
<a name="cli-commands-reference"></a>

### 设置和配置
<a name="setup-configuration"></a>
+ [aws ec2 create-vpc-encryption-control](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-vpc-encryption-control.html)
+ [aws ec2 modify-vpc-encryption-control](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-vpc-encryption-control.html)
+ [aws ec2 tgw modify-transit-gateway](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-transit-gateway.html)

### 监控和排查
<a name="monitoring-troubleshooting"></a>
+ [aws ec2 describe-vpc-encryption-controls](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-encryption-controls.html)
+ [aws ec2 get-vpc-resources-blocking-encryption-enforcement](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-vpc-resources-blocking-encryption-enforcement.html)
+ [aws ec2 create-flow-logs](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-flow-logs.html)
+ [aws ec2 describe-flow-logs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-flow-logs.html)
+ [aws 日志查询](https://docs.aws.amazon.com/cli/latest/reference/logs/query.html)

### 清理
<a name="cleanup"></a>
+ [aws ec2 delete-vpc-encryption-control](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-vpc-encryption-control.html)

## 其他资源
<a name="additional-resources"></a>

有关详细设置说明，请参阅博客文章 [Introducing VPC encryption controls: enforce encryption in transit within and across VPCs in a region](https://aws.amazon.com/blogs/aws/introducing-vpc-encryption-controls-enforce-encryption-in-transit-within-and-across-vpcs-in-a-region)。

有关更多 API 详细信息，请参阅 [EC2 API 参考指南](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Welcome.html)。