ryuyunseong/aws-secure-service-lab
GitHub: ryuyunseong/aws-secure-service-lab
基于 AWS CDK 和 Python 的云安全架构作品集,通过 IaC 方式设计容器服务安全边界,并在部署前完成安全验证与审批治理。
Stars: 0 | Forks: 0
# AWS 安全服务 Lab
这是一个云安全作品集项目,旨在使用 AWS CDK 和 Python 设计容器服务的安全架构,并确保在实际部署前能够进行安全控制和验证审计。它将 FastAPI 示例服务连接到了 ALB、WAF、ECS Fargate、VPC Endpoints、基于 KMS 的日志存储以及检测服务。
本项目的核心不在于应用程序功能开发,而在于**云基础设施安全设计、IaC 实现、自动化验证和部署审批控制**。示例 API 是一个提供容器状态和健康检查的最小工作负载,并未实际创建任何 AWS 资源。
您可以直接在[作品集摘要](docs/portfolio-summary.md)中查看用于申请的概述。
## 核心能力
- 基于 AWS CDK Python 的 Infrastructure as Code 设计
- public/private subnet 隔离与基于 VPC Endpoints 的 private egress
- 使用 ALB、WAF 和 ECS Fargate 构建的容器服务安全边界
- IAM 角色分离、S3 Public Access Block 和 KMS 加密
- 基于 CloudTrail、VPC Flow Logs、GuardDuty、Security Hub 和 AWS Config 的检测与审计
- 使用 pytest、cdk-nag、Checkov、gitleaks 和模板验证脚本进行安全验证
- 将成本、权限、证书、DNS 和审批人信息分离的部署治理
## 架构概览
```
flowchart LR
User["사용자"] --> WAF["AWS WAF"]
WAF --> ALB["Application Load Balancer
HTTPS secure mode"] ALB --> ECS["ECS Fargate
private subnet"] ECS --> VPCE["VPC Endpoints
ECR / S3 / CloudWatch Logs"] ALB --> ALBLogs["ALB Access Logs
S3"] ECS --> AppLogs["Application Logs
CloudWatch Logs"] CloudTrail["CloudTrail"] --> SecurityLogs["Security Log Bucket
S3 + KMS"] FlowLogs["VPC Flow Logs"] --> SecurityLogs GuardDuty["GuardDuty"] --> SecurityHub["Security Hub"] SecurityHub --> EventBridge["EventBridge"] EventBridge --> FindingLogs["Finding Logs"] ``` 详细设计和安全边界可在[架构文档](docs/architecture.md)中查看。 ## 验证结果 | 验证项目 | 结果 | 确认内容 | | --- | --- | --- | | 单元测试 | PASS | `python -m pytest`, 18 tests passed | | CDK secure mode synth | PASS | 验证 HTTPS listener 和 TLS policy 路径 | | cdk-nag | PASS | 通过 secure mode 静态安全检查 | | Checkov | EXPECTED RESIDUAL | 109 passed, `CKV_AWS_18` 1项为已记录的例外 | | gitleaks | PASS | 未检测到 secret | | 模板验证脚本 | PASS | S3, KMS, CloudTrail, GuardDuty, Security Hub, IAM, logs, endpoints | `CKV_AWS_18` 是为了防止在将 server access logging 再次应用于最终的 S3 access log bucket 时可能出现的递归日志、成本增加和分析噪声而留下的残余风险。判断依据和后续审查条件已记录在[安全控制文档](docs/security-controls.md)中。 ## 实现结构 - 基于 AWS CDK Python 的多 Stack 结构 - FastAPI 示例 API 和 Dockerfile - lab mode 的 HTTP listener 和 secure mode 的基于 ACM 的 HTTPS listener - 从 ALB 安全组到 ECS 安全组仅允许 TCP 8000 路径 - 用于 ECR image pull、S3 image layer 和 CloudWatch Logs 的 VPC Endpoints - 用于 CloudTrail 和 VPC Flow Logs 的 SSE-KMS 安全日志存储桶 - 根据 AWS 服务限制,使用 SSE-S3 的 ALB access log 存储桶 - 基于 GuardDuty、Security Hub、AWS Config 和 EventBridge 的检测流程 - 应用了 AWS Managed Rules 和基于 IP 的 rate limit 的 WAF ## 本地运行准备 创建 Python 虚拟环境并安装依赖项。 ``` python -m venv .venv . .venv/bin/activate python -m pip install -r requirements.txt ``` 如果没有 AWS CDK CLI,请单独安装。 ``` npm install -g aws-cdk ``` 单元测试不需要 AWS credential。`cdk synth` 可以检查特定环境的 context,但未经审批,绝对不应部署实际的 AWS 资源。 ## 本地验证 运行基本验证。 ``` python -m pytest python scripts/generate_report.py cdk synth ``` 如果已安装相关工具,请额外运行安全验证。 ``` cdk synth -c enableCdkNag=true checkov -d cdk.out gitleaks detect --no-git ``` 使用 ACM 证书占位符验证 secure mode。 ``` cdk synth -c certificateArn=
checkov -d cdk.out
```
可以使用以下脚本验证生成的 CloudFormation 模板,而无需调用 AWS API。
```
bash scripts/verify_s3.sh --template cdk.out/AwsSecureServiceLab-SecurityLogging.template.json
bash scripts/verify_kms.sh --template cdk.out/AwsSecureServiceLab-SecurityLogging.template.json
bash scripts/verify_cloudtrail.sh --template cdk.out/AwsSecureServiceLab-Detection.template.json
bash scripts/verify_guardduty.sh --template cdk.out/AwsSecureServiceLab-Detection.template.json
bash scripts/verify_securityhub.sh --template cdk.out/AwsSecureServiceLab-Detection.template.json
bash scripts/verify_iam.sh --template cdk.out/AwsSecureServiceLab-App.template.json
bash scripts/verify_logs.sh --template cdk.out
bash scripts/verify_endpoints.sh --template cdk.out
```
## CDK context 设置
默认值保守地限制了成本和实际部署的影响。
| Flag | 默认值 | 目的 |
| --- | --- | --- |
| `environmentName` | `dev` | 区分资源名称和报告环境 |
| `enableNatGateway` | `false` | 启用用于 private egress 的 NAT,默认禁用 |
| `enableWafLogging` | `false` | 仅在显式设置时生成 WAF logging |
| `enableSecurityHubStandards` | `false` | 仅在显式设置时订阅 Security Hub standards |
| `enableCdkNag` | `false` | 在 synth 期间运行 cdk-nag |
| `retainLogs` | `false` | 设置保留日志资源 |
| `logRetentionDays` | `90` | 日志保留和 S3 lifecycle 周期 |
| `vpcFlowLogsDestination` | `s3` | VPC Flow Logs 目的地,可选择 `cloudwatch` |
| `egressMode` | `endpoints` | 创建 ECR API/Docker、S3、CloudWatch Logs endpoints |
| `enableEcsControlPlaneEndpoints` | `false` | 添加 ECS control plane endpoints |
| `certificateArn` | empty | 设置 ACM ARN 时启用 secure mode |
| `wafRateLimit` | `1000` | 5分钟内基于 IP 的 WAF 请求限制 |
示例:
```
cdk synth -c enableNatGateway=true -c enableWafLogging=true
```
## 公开与部署边界
- 不包含实际的 AWS account ID、ARN、domain、profile 或 secret。
- 不生成、存储或输出任何 AWS credential。
- 未执行实际的 AWS 部署。
- 在部署批准前,不执行 `cdk bootstrap`、`cdk diff`、`cdk deploy` 和 `cdk destroy`。
- S3 log bucket 使用 Public Access Block。
- 不创建 SSH 或 RDP ingress rule。
- 不允许 IAM wildcard action。如果是由于 AWS 限制而需要 wildcard resource 的情况,会在[安全控制文档](docs/security-controls.md)中留下相关依据。
- lab mode 的 HTTP listener 仅供本地合成。部署审查的对象是设置了 `certificateArn` 的 secure mode。
- 在实际部署前,必须确定 account、Region、Profile/Role、ACM certificate ARN、domain、DNS provider、成本负责人和部署审批人。
## 主要文档
- [作品集摘要](docs/portfolio-summary.md)
- [架构](docs/architecture.md)
- [威胁模型](docs/threat-model.md)
- [安全控制](docs/security-controls.md)
- [验证指南](docs/verification-guide.md)
- [部署前检查清单](docs/pre-deployment-checklist.md)
- [egress 设计](docs/egress-design.md)
- [部署审批摘要](docs/deployment-approval-summary.md)
- [运行时部署审批包](docs/runtime-deployment-approval.md)
- [部署前 dry-run 程序](docs/pre-deployment-dry-run.md)
- [dry-run 验证证据](docs/dry-run-evidence.md)
- [审查摘要](docs/review-summary.md)
- [最终报告](docs/final-report.md)
HTTPS secure mode"] ALB --> ECS["ECS Fargate
private subnet"] ECS --> VPCE["VPC Endpoints
ECR / S3 / CloudWatch Logs"] ALB --> ALBLogs["ALB Access Logs
S3"] ECS --> AppLogs["Application Logs
CloudWatch Logs"] CloudTrail["CloudTrail"] --> SecurityLogs["Security Log Bucket
S3 + KMS"] FlowLogs["VPC Flow Logs"] --> SecurityLogs GuardDuty["GuardDuty"] --> SecurityHub["Security Hub"] SecurityHub --> EventBridge["EventBridge"] EventBridge --> FindingLogs["Finding Logs"] ``` 详细设计和安全边界可在[架构文档](docs/architecture.md)中查看。 ## 验证结果 | 验证项目 | 结果 | 确认内容 | | --- | --- | --- | | 单元测试 | PASS | `python -m pytest`, 18 tests passed | | CDK secure mode synth | PASS | 验证 HTTPS listener 和 TLS policy 路径 | | cdk-nag | PASS | 通过 secure mode 静态安全检查 | | Checkov | EXPECTED RESIDUAL | 109 passed, `CKV_AWS_18` 1项为已记录的例外 | | gitleaks | PASS | 未检测到 secret | | 模板验证脚本 | PASS | S3, KMS, CloudTrail, GuardDuty, Security Hub, IAM, logs, endpoints | `CKV_AWS_18` 是为了防止在将 server access logging 再次应用于最终的 S3 access log bucket 时可能出现的递归日志、成本增加和分析噪声而留下的残余风险。判断依据和后续审查条件已记录在[安全控制文档](docs/security-controls.md)中。 ## 实现结构 - 基于 AWS CDK Python 的多 Stack 结构 - FastAPI 示例 API 和 Dockerfile - lab mode 的 HTTP listener 和 secure mode 的基于 ACM 的 HTTPS listener - 从 ALB 安全组到 ECS 安全组仅允许 TCP 8000 路径 - 用于 ECR image pull、S3 image layer 和 CloudWatch Logs 的 VPC Endpoints - 用于 CloudTrail 和 VPC Flow Logs 的 SSE-KMS 安全日志存储桶 - 根据 AWS 服务限制,使用 SSE-S3 的 ALB access log 存储桶 - 基于 GuardDuty、Security Hub、AWS Config 和 EventBridge 的检测流程 - 应用了 AWS Managed Rules 和基于 IP 的 rate limit 的 WAF ## 本地运行准备 创建 Python 虚拟环境并安装依赖项。 ``` python -m venv .venv . .venv/bin/activate python -m pip install -r requirements.txt ``` 如果没有 AWS CDK CLI,请单独安装。 ``` npm install -g aws-cdk ``` 单元测试不需要 AWS credential。`cdk synth` 可以检查特定环境的 context,但未经审批,绝对不应部署实际的 AWS 资源。 ## 本地验证 运行基本验证。 ``` python -m pytest python scripts/generate_report.py cdk synth ``` 如果已安装相关工具,请额外运行安全验证。 ``` cdk synth -c enableCdkNag=true checkov -d cdk.out gitleaks detect --no-git ``` 使用 ACM 证书占位符验证 secure mode。 ``` cdk synth -c certificateArn=
标签:AWS CDK, DevSecOps, 上游代理, 云原生架构, 安全合规, 安全规则引擎, 网络代理, 请求拦截, 逆向工具