giselleevita/terraform-aws-secure-vpc
GitHub: giselleevita/terraform-aws-secure-vpc
基于 Terraform 的 AWS 安全 VPC 基线模块,提供双 AZ 公私子网隔离、NAT 出口、ALB 与可选 WAF 关联以及 VPC 流日志的可审计网络基线。
Stars: 1 | Forks: 0
# terraform-aws-secure-vpc



有关设计原理和限制,请参阅 [docs/CASE_STUDY.md](docs/CASE_STUDY.md)。
本仓库展示了一个可审查的 VPC 基线,而不是一个完整的登陆区。我们有意明确指出了目前已实现的功能,以及为满足更高可用性或更严格的生产环境要求而需要添加的功能。
## 审阅者快速入门
要进行快速的技术审查:
1. 检查 `main.tf` 中的 subnet、route table、NAT、ALB 和 flow-log 资源。
2. 检查 `variables.tf` 中固定的双 AZ 输入契约和默认 ALB 入站规则。
3. 通过现有的 CI 工作流运行 `terraform fmt -check`、`terraform validate`、`tflint` 和 `tfsec`。
4. 阅读 [SECURITY.md](SECURITY.md) 了解前提假设和已知限制。
## 架构
```
flowchart TD
Internet[Internet] --> IGW[Internet Gateway]
IGW --> Public[Two public subnets]
Public --> ALB[Application Load Balancer]
Public --> NAT[Single NAT gateway]
NAT --> Private[Two private subnets]
VPC[VPC Flow Logs] --> CW[CloudWatch Logs]
```
## 创建的资源
| 区域 | 实现 |
|---|---|
| 网络基础 | 启用了 DNS 支持和主机名的一个 VPC |
| 公共层 | 与公共路由表和 Internet 关联的两个公共子网 |
| 私有层 | 与一个私有路由表关联的两个私有子网 |
| 出口 | 第一个公共子网中的一个 NAT 网关,用于私有子网的出站互联网访问 |
| 边缘安全 | 允许来自 `alb_ingress_cidrs` 的 80/443 端口流量的 ALB 安全组 |
| 负载均衡器 | 公有 Application Load Balancer,可选关联 WAFv2 Web ACL |
| 可观测性 | 将所有流量的 VPC Flow Logs 发送到 CloudWatch Logs 组 |
| 验证 | CI 中的 Terraform fmt/validate、TFLint 和 tfsec |
## 未创建的资源
此模块当前不包括:
- 隔离的数据库子网
- 每个 AZ 的 NAT 网关
- 用于 S3、DynamoDB、ECR、SSM、KMS 或 CloudWatch Logs 的 VPC endpoints
- 用于 Flow Logs 的 S3 目标端
- ALB 访问日志
- ALB 安全组之外的工作负载安全组
- VPN、Transit Gateway 或 VPC Peering
- AWS Config 规则或 GuardDuty
对于具有严格可用性要求的生产环境,请增加每个 AZ 的 NAT 或使用私有服务端点以减少对 NAT 的依赖。
## 用法
```
module "secure_vpc" {
source = "./"
name_prefix = "demo"
vpc_cidr = "10.20.0.0/16"
availability_zones = ["eu-west-1a", "eu-west-1b"]
public_subnet_cidrs = ["10.20.1.0/24", "10.20.2.0/24"]
private_subnet_cidrs = ["10.20.11.0/24", "10.20.12.0/24"]
alb_ingress_cidrs = ["203.0.113.0/24"]
flow_logs_retention_days = 90
tags = {
Environment = "dev"
Owner = "platform"
}
}
```
## 子网层
| 层 | 互联网访问 | 用例 |
|---|---|---|
| 公共 | 通过 IGW 入站以承载 ALB/NAT 资源 | ALB 和 NAT 网关 |
| 私有 | 通过 NAT 网关出站 | 不应具有公有 IP 的应用程序工作负载 |
## 安全说明
- ALB 入站 CIDR 默认为 `0.0.0.0/0`,用于面向互联网的演示;对于内部或特定客户端的部署,请对其进行限制。
- ALB 安全组的出站设置为 `0.0.0.0/0`;应单独创建具有更严格出站规则的工作负载安全组。
- 单个 NAT 网关更简单且成本更低,但在发生 AZ 故障时不具备高可用性。
- 在当前的实现中,Flow Logs 仅发送到 CloudWatch Logs。
## 要求
- Terraform >= 1.5
- AWS provider >= 5.0
- 用于 VPC、EC2 网络、Elastic Load Balancing、CloudWatch Logs、为 Flow Logs 创建 IAM role/policy 以及可选 WAF 关联的 IAM 权限
## 相关项目
- [terraform-aws-iam-baseline](https://github.com/giselleevita/terraform-aws-iam-baseline) - 专用的 IAM S3 读取角色模块
- [secure-docs-aws](https://github.com/giselleevita/secure-docs-aws) - 使用 Cognito、Lambda、S3、KMS 和审计日志的加密文档存储模式
## 下一步改进
- 添加可选的隔离子网。
- 添加 NAT-per-AZ 模式。
- 为 S3、DynamoDB、ECR、SSM、KMS 和 CloudWatch Logs 添加 VPC endpoints。
- 添加 ALB 访问日志。
- 为路由表、子网和安全组预期添加 Terraform 测试。
## 许可证
MIT
标签:ALB, AppImage, AWS, CISA项目, CloudWatch, DPI, EC2, ECS, IaC, NAT网关, Terraform, VPC, VPC流日志, WAF, Web应用防火墙, 互联网网关, 公有子网, 双可用区, 子网路由, 安全合规, 安全基线, 应用负载均衡器, 插件系统, 教学环境, 模块, 流量监控, 特权提升, 私有子网, 网络代理, 网络安全, 自动化部署, 隐私保护