hmbldv/aws-sec
GitHub: hmbldv/aws-sec
基于 Terraform 构建的生产级 AWS 安全基础设施底座,集成了组织级合规监控和攻防测试实验环境。
Stars: 0 | Forks: 0
# AWS 安全基础设施
使用 Terraform 构建的安全 AWS 基础设施底座,具有 AWS Config 聚合器功能,用于组织范围的合规性监控和安全测试实验环境。
## 概述
本项目运用基础设施即代码 原则,建立了一个生产级的 AWS 安全基础设施底座。它通过 AWS Config、IAM 安全角色和实操安全测试实验室,实现了全面的安全监控。
**核心功能**:
- **AWS Config 聚合器**:跨所有 AWS 账户和区域进行组织范围的合规性监控
- **安全测试实验室**:Ubuntu 靶机 + 预装 Kali 工具的攻击者实例,用于攻防测试
- **多账户管理**:用于通过 IAM Identity Center 进行跨账户访问的 IAM 角色
- **配置记录**:持续跟踪所有 AWS 资源配置
- **安全监控**:AWS Config recorder、Config 聚合器与 Macie 集成
- **本地状态管理**:简化的 Terraform 状态管理,便于快速迭代
- **安全第一**:强制使用 IMDSv2,加密 EBS,屏蔽 S3 存储桶的公有访问
## 为什么采用此架构
大多数 AWS 安全 IaC 都是被动式的——即在事后添加控制措施。本底座从安全态势出发:通过 Config 聚合进行配置漂移检测,通过 OIDC 实现无凭证的 CI/CD(流水线中无长期密钥),以及集成的安全实验室,可用于针对您正在防御的相同基础设施进行对抗测试。
## 技术栈
- **Terraform** - 用于 AWS 资源配置的基础设施即代码
- **AWS Config** - 资源配置记录和组织级聚合
- **AWS EC2** - 安全实验室实例(Ubuntu 靶机 + 预装 Kali 工具的攻击者实例)
- **AWS S3** - 用于 AWS Config 快照和 Macie 发现结果的加密存储
- **AWS IAM** - 安全分析师角色、Config recorder 角色、跨账户访问
- **AWS SSM** - 用于安全实例访问的 Session Manager
- **AWS Macie** - 敏感数据发现和分类
## 架构
### 安全实验室架构
```
┌─────────────────┐
│ Your Admin │
│ Workstation │
└────────┬────────┘
│ SSH/RDP/SSM
▼
┌────────────────────────────────────────────────────────────┐
│ AWS VPC (172.31.0.0/16) │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ Attacker Box │ │ Ubuntu Target │ │
│ │ (Ubuntu + Kali) │────▶│ (t3.medium) │ │
│ │ │ │ │ │
│ │ - Metasploit │ ALL │ - Ubuntu Desktop │ │
│ │ - Nmap, Hydra │PORTS│ - Apache, MySQL │ │
│ │ - Impacket, CrackME │ │ - XRDP for remote │ │
│ │ - SecLists, PEASS │ │ - Vulnerable services │ │
│ └─────────────────────┘ └─────────────────────────┘ │
│ SG: kali-attacker SG: ubuntu-target │
└────────────────────────────────────────────────────────────┘
```
**安全特性:**
- 强制使用 IMDSv2(防止 SSRF 凭证窃取)
- 加密的 EBS 卷
- 启用 SSM Session Manager
- CloudWatch 详细监控
### AWS Config 架构
```
┌────────────────────────────────────────────────────────────────┐
│ AWS Organization │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Account │ │ Account │ │ Account │ │
│ │ (squinks) │ │ (sec-tools) │ │(log-archive) │ ... │
│ │ │ │ │ │ │ │
│ │ Config │ │ Config │ │ Config │ │
│ │ Recorder │ │ Recorder │ │ Recorder │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └─────────────────┼─────────────────┘ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ Config Aggregator │ │
│ │ (organization-wide) │ │
│ │ All Regions │ │
│ └────────┬───────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ S3 Bucket │ │
│ │ (Config Data) │ │
│ │ Encrypted │ │
│ └─────────────────┘ │
└────────────────────────────────────────────────────────────────┘
```
**Config 特性:**
- **持续记录**:跟踪所有资源配置变更
- **组织聚合**:跨所有 AWS 账户的集中视图
- **所有区域**:监控每个 AWS 区域中的资源
- **合规性监控**:启用合规规则和审计
- **7 年留存期**:根据合规要求保留 Config 快照
### 安全架构
- **静态加密**:用于 Config 数据的 S3 服务端加密 (AES256)
- **访问控制**:具有最小权限的 IAM 服务角色
- **公有访问**:通过 S3 存储桶策略完全屏蔽
- **审计追踪**:用于 Config 快照的 S3 版本控制和生命周期策略
- **合规性**:持续监控资源配置
## 前置条件
### 所需工具
- **Terraform** >= 1.0
- 配置了 SSO 的 **AWS CLI** v2
- 用于 EC2 实例访问的 **SSH 密钥**
### AWS 账户要求
- 建议使用具有多个账户的 AWS Organizations
- 具有以下创建权限的 IAM 权限:
- EC2 实例和安全组
- IAM 角色和策略
- AWS Config recorder 和聚合器
- 用于 Config 和 Macie 的 S3 存储桶
- AWS IAM Identity Center (SSO) 访问权限
## 安装
### 第 1 步:克隆仓库
```
git clone https://github.com/hmbldv/aws-sec.git
cd aws-sec
```
### 第 2 步:配置变量
编辑 Terraform 变量文件:
```
cd terraform/infrastructure
cp terraform.tfvars.example terraform.tfvars
# 使用你的值编辑 terraform.tfvars
```
示例 `terraform.tfvars`:
```
aws_account_id = "123456789012" # Your AWS account ID
aws_region = "us-west-1"
environment = "production"
ssh_public_key = "ssh-ed25519 AAAA..." # Your SSH public key
admin_cidr_blocks = ["YOUR_IP/32"] # Restrict to your IP
```
### 第 3 步:部署基础设施
```
# 认证到 AWS
aws sso login --profile default
# 初始化 Terraform
terraform init
# Review 计划
terraform plan
# Apply 以创建所有资源
terraform apply
```
## 配置
### GitLab CI/CD 流水线
`.gitlab-ci.yml` 流水线:
1. 使用 OIDC 向 AWS 进行身份验证(无存储凭证)
2. 代入 `devops-operator` IAM 角色
3. 使用临时凭证运行 Terraform 命令
**当前流水线阶段**:
- `test` - 验证 AWS 身份验证
**未来流水线阶段**(待实现):
- `validate` - Terraform fmt 和 validate
- `plan` - 在合并请求上执行 Terraform plan
- `apply` - 在 main 分支上执行 Terraform apply
- `security` - tfsec 安全扫描
### IAM 角色配置
`devops-operator` 角色需要以下信任策略:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/gitlab.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"gitlab.com:aud": "https://gitlab.com"
},
"StringLike": {
"gitlab.com:sub": "project_path:/:*"
}
}
}
]
}
```
**安全提示**:`project_path` 条件将此角色限制为仅限此 GitLab 项目使用。
## 使用方法
### 本地 Terraform 操作
```
# 认证到 AWS
aws sso login --profile
# Navigate 到 infrastructure 目录
cd terraform/infrastructure
# 使用 local backend 初始化
terraform init
# Plan 变更
terraform plan
# Apply 变更
terraform apply
```
### GitLab CI/CD 操作
**自动执行**:
- 推送到 `main` 分支会触发流水线
- OIDC 身份验证自动进行
- 无需手动管理 AWS 凭证
**手动触发流水线**:
1. 进入 GitLab 项目 → CI/CD → Pipelines
2. 点击 "Run Pipeline"
3. 选择分支并运行
## 部署
### 当前状态
- ✅ AWS Config 聚合器已部署(组织范围)
- ✅ AWS Config recorder 运行中(持续监控)
- ✅ 安全实验室已部署(Ubuntu 靶机 + 预装 Kali 工具的攻击者实例)
- ✅ IAM 角色已创建(SecurityAnalyst、OrganizationAdmin)
- ✅ S3 存储桶已管理(AWS Config、Macie)
- ✅ GitLab OIDC 身份验证正常工作
- ⏳ 多账户扫描(Log Archive 访问待处理)
### 安全实验室访问
**SSH 访问:**
```
# Attacker box (Ubuntu + Kali tools)
ssh -i ~/.ssh/id_ed25519 ubuntu@
# Target box
ssh -i ~/.ssh/id_ed25519 ubuntu@
```
**RDP 访问(在 user-data 完成后):**
- 攻击者实例:`:3389`(用户名:`pentester` / 密码:`KaliPentester123!`)
- 靶机实例:`:3389`(用户名:`labuser` / 密码:`LabPassword123!`)
**SSM Session Manager:**
```
aws ssm start-session --target
```
### 后续步骤
1. 在其他组织账户中部署 Config recorder
2. 使用 Terraform 阶段扩展 GitLab CI/CD 流水线
3. 实施安全扫描(tfsec、checkov)
4. 添加 GuardDuty、Security Hub、CloudTrail
## 安全注意事项
### 基础设施安全
- **加密**:所有 S3 存储桶均使用 AES256 服务端加密
- **访问控制**:S3 存储桶为私有,并带有显式拒绝策略
- **IMDSv2**:所有 EC2 实例上均强制使用,以防止 SSRF 攻击
- **EBS 加密**:所有卷均进行静态加密
- **网络安全**:遵循最小权限原则的安全组
### 凭证安全
- **无存储凭证**:OIDC 联合身份验证消除了长期有效的访问密钥
- **临时凭证**:STS 提供短期凭证(1 小时)
- **最小权限**:IAM 角色被限制为特定的 GitLab 项目路径
- **审计追踪**:CloudTrail 记录由角色发出的所有 API 调用
### 操作安全最佳实践
1. **绝不向 Git 提交凭证**(使用 `.gitignore`)
2. **在应用前审查 Terraform 计划**
3. **为 AWS 控制台访问启用 MFA**
4. **监控成本**以检测意外的资源创建
5. **在不使用时停止 EC2 实例**(最大的成本节约)
6. **将 CIDR 块限制**为您实际的 IP 地址
## 项目结构
```
aws-sec/
├── terraform/
│ └── infrastructure/ # Main infrastructure code
│ ├── config-aggregator.tf # AWS Config aggregator
│ ├── config-recorder.tf # AWS Config recorder
│ ├── security-lab.tf # EC2 instances (target + attacker)
│ ├── iam-policies.tf # SecurityAnalyst, OrganizationAdmin roles
│ ├── s3-buckets.tf # AWS Config and Macie bucket management
│ ├── oidc.tf # GitLab OIDC provider and devops role
│ ├── variables.tf # Input variables
│ └── providers.tf # AWS provider configuration
│
├── docs/ # Additional documentation
│ └── config-aggregator-setup.md # Config aggregator deployment guide
│
├── scripts/ # Automation scripts
├── .gitlab-ci.yml # GitLab CI/CD pipeline
├── .gitignore # Excludes sensitive files
└── README.md # This file
```
## 故障排除
### 问题:GitLab CI/CD 失败并提示 "AccessDenied"
**可能的原因**:
1. AWS 中未配置 OIDC 身份提供商
2. IAM 角色信任策略不正确
3. 信任策略中的项目路径不匹配
**解决方案**:
- 验证 OIDC 提供商是否存在:`aws iam list-open-id-connect-providers`
- 检查 IAM 角色信任策略是否与您的 GitLab 项目路径匹配
- 确保角色具有必要的权限
### 问题:Config recorder 未记录
**解决方案**:
```
# Check recorder 状态
aws configservice describe-configuration-recorder-status
# Check delivery channel
aws configservice describe-delivery-channels
# Verify S3 bucket 权限
aws s3api get-bucket-policy --bucket config-bucket-
```
### 问题:EC2 实例无法访问
**可能的原因**:
1. 安全组不允许您的 IP
2. User data 脚本仍在运行
3. SSH 密钥不匹配
**解决方案**:
- 使用您的实际 IP 更新 `terraform.tfvars` 中的 `admin_cidr_blocks`
- 等待 5-10 分钟让 user data 完成
- 验证 SSH 密钥是否与 `terraform.tfvars` 中配置的相匹配
## 未来增强
### 已完成
- [x] AWS Config 聚合器(组织范围)
- [x] AWS Config recorder(持续监控)
- [x] 安全测试实验室(Ubuntu 靶机 + 攻击者实例)
- [x] 安全分析师的 IAM 角色
- [x] S3 存储桶管理(Config、Macie)
- [x] GitLab OIDC 集成
- [x] EC2 上强制实施 IMDSv2
### 规划中的基础设施
- [ ] 在所有组织账户中部署 Config recorder
- [ ] 具有公有/私有子网的 VPC(专用的安全实验室 VPC)
- [ ] 用于威胁检测的 AWS GuardDuty
- [ ] 用于集中管理发现结果的 Security Hub
- [ ] 用于审计日志的 CloudTrail
- [ ] 用于合规性监控的 Config 规则
- [ ] 用于加密的 KMS 密钥
### 流水线增强
- [ ] 在合并请求上执行 Terraform plan
- [ ] 自动化安全扫描(tfsec、checkov)
- [ ] 成本估算
- [ ] 自动化测试
- [ ] Slack/SNS 通知
### 安全增强
- [ ] 用于 S3 加密的客户托管 KMS 密钥
- [ ] S3 存储桶的 MFA 删除
- [ ] S3 存储桶日志记录
- [ ] 用于 S3 访问的 VPC 终端节点
- [ ] 使用 AWS Secrets Manager 进行密钥管理
## 成本优化
**当前成本**(预估):
- **EC2 (t3.medium x2)**:约 $60/月(如果每周 7 天每天 24 小时运行)- **不使用时请务必停止!**
- **EBS 存储 (90GB)**:约 $7/月
- **AWS Config**:约 $2/月/recorder + 每个配置项 $0.003
- **S3 存储**:约 $0.023/GB/月(标准层)
- **S3 请求**:极少(Config 写入)
- **数据传输**:在同一区域内免费
**节省成本的提示**:
- **停止 EC2 实例**,当不进行主动测试时(最大的节省!)
- Config 数据在 90 天后移至 STANDARD_IA(便宜约 50%)
- 旧的 Config 数据在 365 天后移至 Glacier(便宜约 80%)
- 无 KMS 费用(使用 AWS 托管密钥)
- 使用 SSM Session Manager 而不是 SSH,以避免 NAT 网关费用
**预估每月成本**:
- EC2 运行时:约 $75/月
- EC2 停止时:约 $15/月(仅 S3 + Config + EBS 存储)
## 许可证
MIT
## 作者
Johnny Endrihs
- GitHub: [hmbldv](https://github.com/hmbldv)
- GitLab: 用于 CI/CD 部署的私有 GitLab
**作为 DevSecOps 作品集的一部分构建**,展示了:
- 基础设施即代码
- AWS 安全最佳实践
- 用于合规性监控的 AWS Config
- CI/CD 自动化
- OIDC 联合身份验证
- 成本优化
- 安全测试实验室环境
*正在准备 AWS Certified Security - Specialty 认证*
标签:AWS, AWS Config, AWS IAM, AWS Macie, AWS SSM, CI/CD安全, DevSecOps, DPI, EBS加密, EC2, ECS, GitLab CI/CD, IaC, Llama, OIDC, S3加密, Terraform, 上游代理, 会话管理器, 合规监控, 域名收集, 安全基础设施, 安全态势管理, 安全测试实验室, 攻击模拟, 数据隐私, 无密钥认证, 无线安全, 智能代码审计, 漂移检测, 跨账户管理, 身份与访问管理, 防御测试, 驱动签名利用