aws-samples/sample-PQC-Readiness-using-AWS-Config
GitHub: aws-samples/sample-PQC-Readiness-using-AWS-Config
基于 AWS Config 和 Lambda 的后量子密码学就绪状态自动化扫描器,用于持续监控 AWS 边缘服务的 PQC 启用情况和旧版 TLS 使用情况。
Stars: 3 | Forks: 2
# 使用 AWS Config 的 PQC 就绪状态扫描器
针对 AWS 边缘服务(ALB、NLB 和 API Gateway)的自动化 PQC(后量子密码学)就绪状态监控,提供简化的二元检查:
**是否已启用后量子密码学 (PQC)?**
**端点是否允许旧版 TLS 1.0 或 TLS 1.1?**
使用带有 Lambda 函数的 AWS Config 自定义规则,提供清晰且可操作的检查结果。
**重要提示:** 这是一个示例应用程序,使用了多种 AWS 服务,在超出免费套餐使用量后会产生相关费用 - 请参阅 [AWS 定价页面](https://aws.amazon.com/config/pricing/)了解详细信息。您需要对产生的任何 AWS 费用负责。本示例代码不附带任何保证。
## 目录
1. [快速开始(单账户)](#quick-start-single-account)
2. [多账户部署(组织)](#multi-account-deployment-organizations)
3. [查看结果(组织)](#viewing-results-organizations)
4. [架构](#architecture)
5. [解读指南](#interpretation-guide)
6. [故障排除](#troubleshooting)
7. [清理](#cleanup)
8. [许可证](#license)
## 快速开始(单账户)
### 前置条件
在部署之前,请确保您具备以下条件:
- 已配置凭证的 **AWS CLI**
aws configure
aws sts get-caller-identity # 验证
- 已安装的 **AWS SAM CLI**([安装指南](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html))
# macOS
brew install aws-sam-cli
# 验证
sam --version
- **Python 3.12**(Lambda 运行时要求)
python3 --version # 应显示 3.12.x
- 在您的目标账户和区域中已启用 **AWS Config**,并且正在记录以下资源类型:
- `AWS::ElasticLoadBalancingV2::LoadBalancer`
- `AWS::ApiGateway::RestApi`
- `AWS::ApiGatewayV2::Api`
通过 [AWS Config 控制台](https://console.aws.amazon.com/config)启用 → 记录器 → 记录策略 → [选择特定资源类型](https://docs.aws.amazon.com/config/latest/developerguide/manual-setup.title.html)(按照手动设置中的步骤配置 AWS Config 记录策略以记录特定资源类型)
### 部署步骤
#### 步骤 1:克隆并构建
```
git clone https://github.com/aws-samples/sample-PQC-Readiness-using-AWS-Config.git
cd PQC-validation-using-config
sam build
```
#### 步骤 2:部署到一个或多个区域
```
cd PQC-validation-using-config/installation
# 使脚本可执行(仅首次)
chmod +x deploy-per-regions.sh
# 部署到单个区域
./deploy-per-regions.sh us-east-1
# 部署到多个区域
./deploy-per-regions.sh us-east-1 us-west-2 eu-west-1
```
该脚本会自动执行以下操作:
- 通过 SAM 部署 Lambda 函数
- 部署合规包(创建 Config 规则)
- 验证部署是否成功
- 提供清晰的状态消息
**大功告成!** 扫描器现在正在监控您所有已部署区域中的 ELB 和 API Gateway 资源。
## 多账户部署(组织)
对于跨多个 AWS 账户的组织级部署,请使用 CloudFormation StackSets 将 Lambda 函数部署到每个账户。
**重要限制:** AWS Config `CUSTOM_LAMBDA` 规则要求 Lambda 函数与 Config 规则位于**同一账户**中。您不能使用一个账户中的集中式 Lambda 来评估其他账户中的资源。
### 前置条件:共享的 S3 存储桶
在打包之前,请创建一个可供您组织中所有目标账户访问的 S3 存储桶。此存储桶将托管 CloudFormation StackSets 拉取到每个成员账户中的 Lambda 部署构件。
```
# 创建共享 S3 存储桶(从管理/中央账号运行)
aws s3 mb s3:// --region us-east-1
```
授予存储桶拥有者完全管理访问权限以及目标账户的读取访问权限:
```
aws s3api put-bucket-policy \
--bucket \
--policy '{
"Statement": [
{
"Sid": "BucketOwnerFullAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:::root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::",
"arn:aws:s3:::/*"
]
},
{
"Sid": "CrossAccountReadAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam:::root",
"arn:aws:iam:::root"
]
},
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::",
"arn:aws:s3:::/*"
]
}
]
}'
```
将 ``、`` 替换为 StackSets 将部署 Lambda 函数的 AWS 账户 ID。
### 步骤 1:构建 Lambda 包并上传至 S3
从 `installation/` 目录运行打包脚本:
```
cd installation
# 使脚本可执行(仅首次)
chmod +x deploy-stacksets.sh
# 构建、打包、上传至 S3,并生成已解析的模板
./deploy-stacksets.sh
```
此脚本会自动执行以下操作:
- 使用 SAM 构建 Lambda 函数
- 创建 ZIP 包
- 将 ZIP 包上传到共享的 S3 存储桶
- 生成内含 S3 值的 `packaged-template.yaml`(部署时无需任何参数)
### 步骤 2:通过 StackSets 部署 Lambda 函数
从**管理账户**(或委托管理员账户)运行以下命令:
```
# 创建 StackSet(--region 用于设置管理该 StackSet 的“主区域”)
aws cloudformation create-stack-set \
--stack-set-name pqc-readiness-lambda-functions \
--template-body file://installation/packaged-template.yaml \
--capabilities CAPABILITY_IAM \
--permission-model SERVICE_MANAGED \
--auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false \
--region us-east-1
# 将 Stack 实例部署到成员账号
# --regions = 在成员账号中部署 Lambda 函数的目标区域
# --region = 必须与上述 StackSet 主区域匹配
aws cloudformation create-stack-instances \
--stack-set-name pqc-readiness-lambda-functions \
--deployment-targets OrganizationalUnitIds=ou-xxxx-xxxxxxxx \
--regions us-east-1 \
--region us-east-1
```
### 步骤 3:部署组织合规包
```
aws configservice put-organization-conformance-pack \
--organization-conformance-pack-name pqc-legacy-tls-compliance \
--template-body file://conformance-packs/pqc-legacy-tls-conformance-pack.yaml \
--region us-east-1
```
这将在所有引用其本地 Lambda 函数的成员账户中创建 Config 规则。
## 查看结果(组织)
在每个**成员账户**中,导航至已部署区域的 [AWS Config 控制台](https://console.aws.amazon.com/config/)。
### 合规包视图
转到 **AWS Config → 合规包** 并查找:
```
OrgConformsPack-pqc-legacy-tls-compliance-
```
点击合规包以查看所有 4 条规则的整体合规性摘要。
### 单个规则视图
转到 **AWS Config → 规则** 并找到带有 `pqc-` 前缀的 4 条规则:
- `pqc-elb-pqc-compliance-conformance-pack-`
- `pqc-elb-legacy-tls-conformance-pack-`
- `pqc-apigateway-pqc-compliance-conformance-pack-`
- `pqc-apigateway-legacy-tls-conformance-pack-`
点击任意规则可查看:
- 合规与不合规资源计数
- 每个资源的详细注释
- 资源 ARN 和当前安全策略配置
### AWS CLI
```
# 获取所有规则的合规性摘要
aws configservice get-compliance-summary-by-config-rule --region
# 获取特定规则的详细结果
aws configservice get-compliance-details-by-config-rule \
--config-rule-name pqc-elb-pqc-compliance-conformance-pack- \
--region
# 触发手动评估
aws configservice start-config-rules-evaluation \
--config-rule-names \
--region
```
## 架构
### 此解决方案提供的功能
**4 条 Config 规则监控 2 项关键安全检查:**
| 规则名称 | 服务 | 检查类型 | 报告内容 |
|-----------|---------|------------|---------|
| `elb-pqc-compliance` | ELB/ALB/NLB | PQC 已启用? | 如果所有监听器都使用 PQC 策略,则为 COMPLIANT |
| `elb-legacy-tls` | ELB/ALB/NLB | 允许 TLS 1.0/1.1? | 如果有任何监听器允许旧版 TLS,则为 NON_COMPLIANT |
| `apigateway-pqc-compliance` | API Gateway | PQC 已启用? | 如果所有域都使用 PQC 策略,则为 COMPLIANT |
| `apigateway-legacy-tls` | API Gateway | 允许 TLS 1.0/1.1? | 如果有任何域允许旧版 TLS,则为 NON_COMPLIANT |
**2 个由显式策略允许列表驱动的 Lambda 函数:**
- `ELBComplianceFunction` - 评估 ELB/ALB/NLB 监听器安全策略
- `APIGatewayComplianceFunction` - 评估 API Gateway 域安全策略
每个 Lambda 都接受一个 `checkType` 参数(`PQC` 或 `LEGACY_TLS`)以执行相应的检查。
### 架构图

### 策略参考列表
扫描器使用基于 AWS 官方文档的显式策略允许列表:
**ELB PQC 策略(共 10 个):**
```
ELBSecurityPolicy-TLS13-1-3-PQ-2025-09
ELBSecurityPolicy-TLS13-1-2-Res-PQ-2025-09
ELBSecurityPolicy-TLS13-1-2-PQ-2025-09
ELBSecurityPolicy-TLS13-1-2-FIPS-PQ-2025-09
... (6 more)
```
**ELB 旧版 TLS 策略(8 个允许 TLS 1.0/1.1 的策略):**
```
ELBSecurityPolicy-TLS13-1-0-2021-06
ELBSecurityPolicy-2016-08
ELBSecurityPolicy-TLS-1-1-2017-01
... (5 more)
```
**API Gateway PQC 策略(共 2 个):**
```
SecurityPolicy_TLS13_1_2_PFS_PQ_2025_09
SecurityPolicy_TLS13_1_2_PQ_2025_09
```
**API Gateway 旧版 TLS 策略(1 个策略):**
```
TLS_1_0 (allows TLS 1.0, 1.1, 1.2, 1.3)
```
### 智能范围界定
**✅ 评估范围:**
- 具有 HTTPS/TLS/TCP_SSL 的 ELB/ALB/NLB 监听器
- API Gateway 区域端点
- API Gateway 私有端点
**❌ 排除范围 (NOT_APPLICABLE):**
- CloudFront 分配(默认启用 PQC)
- API Gateway 边缘优化端点(继承 CloudFront PQC)
## 解读指南
### PQC 合规性检查
| 状态 | 含义 | 操作 |
|--------|---------|--------|
| ✅ COMPLIANT | 所有端点均使用 PQC 就绪策略 | 无需采取行动 |
| ❌ NON_COMPLIANT | 至少一个端点使用非 PQC 策略 | **严重**:立即启用 PQC |
| ⚪ NOT_APPLICABLE | 无安全监听器或为边缘优化 API | 无需采取行动 |
**示例注释:**
```
✅ "All 2 listeners use PQC-ready policies"
❌ "Listener on port 443 uses non-PQC policy: ELBSecurityPolicy-2016-08.
Recommended: ELBSecurityPolicy-TLS13-1-2-Res-PQ-2025-09"
```
### 旧版 TLS 检查
| 状态 | 含义 | 操作 |
|--------|---------|--------|
| ✅ COMPLIANT | 无端点允许 TLS 1.0 或 1.1 | 无需采取行动 |
| ❌ NON_COMPLIANT | 至少一个端点允许 TLS 1.0/1.1 | **高优先级**:升级策略 |
| ⚪ NOT_APPLICABLE | 无安全监听器或为边缘优化 API | 无需采取行动 |
**示例注释:**
```
✅ "Listener does not allow TLS 1.0/1.1. Policy: ELBSecurityPolicy-TLS13-1-2-2021-06"
❌ "Listener on port 443 allows TLS 1.0/1.1: ELBSecurityPolicy-2016-08.
HIGH PRIORITY: Upgrade to policy without TLS 1.0/1.1 support"
```
### 推荐的安全策略
**对于 ELB/ALB/NLB:**
- **均衡(推荐):** `ELBSecurityPolicy-TLS13-1-2-Res-PQ-2025-09`
- **最高安全性:** `ELBSecurityPolicy-TLS13-1-3-PQ-2025-09`
- **FIPS 合规:** `ELBSecurityPolicy-TLS13-1-2-Res-FIPS-PQ-2025-09`
**对于 API Gateway:**
- **推荐:** `SecurityPolicy_TLS13_1_2_PQ_2025_09`
- **具备完全前向保密性:** `SecurityPolicy_TLS13_1_2_PFS_PQ_2025_09`
### 修复前检查清单
- [ ] 启用 ELB 访问日志(分析客户端 TLS 使用模式)
- [ ] 审查 30 天的客户端兼容性基线
- [ ] 在非生产环境中测试策略更改
- [ ] 准备回滚程序
- [ ] 安排维护窗口
- [ ] 记录客户端通知要求
## 故障排除
### 常见问题
| 问题 | 解决方案 |
|-------|----------|
| Config 规则未评估 | 验证 AWS Config 是否正在记录该资源类型 |
| "No resources found" (未找到资源) | 启用 Config 记录后等待 10-15 分钟 |
| 脚本因 "Config not enabled" (Config 未启用) 失败 | 首先在目标区域启用 AWS Config |
| 权限被拒绝 | 确保凭证拥有 Lambda、Config、CloudFormation 的 IAM 权限 |
| "Edge-optimized API" 标记为 NOT_APPLICABLE | 属于预期情况 - 这些 API 继承 CloudFront 的 PQC |
### 查看 Lambda 日志
```
# ELB Lambda 日志
aws logs tail /aws/lambda/pqc-readiness-config-scanner-ELBComplianceFunction --follow --region
# API Gateway Lambda 日志
aws logs tail /aws/lambda/pqc-readiness-config-scanner-APIGatewayComplianceFunction --follow --region
```
### 强制重新评估
```
# 获取规则名称(它们具有唯一的后缀)
aws configservice describe-config-rules \
--query 'ConfigRules[?contains(ConfigRuleName, `pqc`)].ConfigRuleName' \
--region
# 触发所有 4 条规则的评估
aws configservice start-config-rules-evaluation \
--config-rule-names \
--region
```
### Config 记录设置
如果 Config 未发现资源,请验证记录设置:
```
# 检查当前的记录策略
aws configservice describe-configuration-recorders \
--query 'ConfigurationRecorders[0].recordingGroup' \
--region
# 应显示:
# - recordingStrategy.useOnly: "INCLUSION_BY_RESOURCE_TYPES"
# - resourceTypes: [AWS::ElasticLoadBalancingV2::LoadBalancer, AWS::ApiGateway::RestApi, AWS::ApiGatewayV2::Api]
```
## 清理
### 单账户清理
```
# 删除 conformance pack(移除 4 条 Config 规则)
aws configservice delete-conformance-pack \
--conformance-pack-name pqc-legacy-tls-compliance \
--region
# 删除 SAM 栈(移除 Lambda 函数和 IAM 角色)
aws cloudformation delete-stack \
--stack-name pqc-readiness-config-scanner \
--region
```
### 多区域清理
```
# 从多个区域删除
for REGION in us-east-1 us-west-2 eu-west-1; do
echo "Cleaning up $REGION..."
aws configservice delete-conformance-pack \
--conformance-pack-name pqc-legacy-tls-compliance \
--region $REGION
aws cloudformation delete-stack \
--stack-name pqc-readiness-config-scanner \
--region $REGION
done
```
### 多账户清理(StackSets)
```
# 从所有账号删除 Stack 实例
aws cloudformation delete-stack-instances \
--stack-set-name pqc-readiness-lambda-functions \
--deployment-targets OrganizationalUnitIds=ou-xxxx-xxxxxxxx \
--regions us-east-1 us-west-2 \
--no-retain-stacks
# 等待删除完成(约 5 分钟),然后删除 StackSet
aws cloudformation delete-stack-set \
--stack-set-name pqc-readiness-lambda-functions
# 删除组织 conformance pack
aws configservice delete-organization-conformance-pack \
--organization-conformance-pack-name pqc-legacy-tls-compliance
```
## 许可证
本库根据 MIT-0 许可证授权。请参见 LICENSE 文件。
## 参考资料
- [ELB 安全策略文档](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/describe-ssl-policies.html)
- [API Gateway 安全策略文档](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-security-policies-list.html)
- [AWS 后量子密码学](https://aws.amazon.com/security/post-quantum-cryptography/)
- [API Gateway 增强 TLS 策略博客](https://aws.amazon.com/blogs/compute/enhancing-api-security-with-amazon-api-gateway-tls-security-policies/)
- [AWS Config 自定义 Lambda 规则](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules_nodejs.html)
- [AWS SAM 开发者指南](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)
*PQC 就绪状态扫描器*
*使用 AWS SAM 构建 | 由 AWS Config 提供支持*
标签:ALB, API Gateway, AWS, AWS Config, Cutter, DPI, IP 地址批量处理, Lambda, NLB, PQC, Python, SAM, Serverless, TLS 1.0, TLS 1.1, TLS合规检查, 加密算法, 合规性监控, 后量子密码学, 多账户管理, 安全基线, 教学环境, 无后门, 无服务器, 证书管理, 边缘服务, 逆向工具, 量子安全