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, 上游代理, 会话管理器, 合规监控, 域名收集, 安全基础设施, 安全态势管理, 安全测试实验室, 攻击模拟, 数据隐私, 无密钥认证, 无线安全, 智能代码审计, 漂移检测, 跨账户管理, 身份与访问管理, 防御测试, 驱动签名利用