angie-in-the-cloud/circleci-aws-opa-terraform-lab

GitHub: angie-in-the-cloud/circleci-aws-opa-terraform-lab

一个通过 CircleCI、OPA、AWS OIDC 和 Terraform 演示如何在 CI/CD 流水线中实现合规左移的云安全自动化实验教程。

Stars: 0 | Forks: 0

# CircleCI + AWS + OPA + Terraform 实验教程 一个演示如何使用 CircleCI、AWS OIDC、Open Policy Agent 和 Terraform 实现云安全自动化的动手实验。 ## 为什么这很重要 在大多数组织中,合规性审查发生在基础设施部署之后。审查人员手动检查资源是否符合策略,记录证据,并标记需要修复的问题。这个过程不仅缓慢、重复,而且常常会遗漏两次审查之间发生的配置漂移。 本实验将合规性检查左移。在任何 AWS 资源部署之前,流水线就会根据安全策略对其进行检查。如果资源未通过检查,流水线将阻止部署。这使得合规性成为自动化、持续的过程,并内置于部署流程中,而不是事后修补。 ## 本实验演示的内容 | 内容 | 方式 | |---|---| | 策略即代码 | 使用 OPA Rego 编写安全规则,可进行版本控制和测试 | | CI/CD 自动化 | CircleCI 流水线在每次推送时运行安全检查 | | 安全的 AWS 身份验证 | 基于 OIDC 的身份验证,不在任何地方存储长期凭证 | | 基础设施即代码 | Terraform 在 AWS 中配置合规的 S3 存储桶 | | 合规关卡 | 如果任何安全检查未通过,流水线会自动停止 | ## 仓库结构 | 文件 | 用途 | | --- | --- | | `.circleci/config.yml` | 流水线定义 | | `policies/s3.rego` | OPA 安全策略 | | `policies/s3_test.rego` | OPA 策略测试 | | `terraform/main.tf` | 基础设施蓝图 | | `compliant-s3.json` | 合规的 S3 资源示例 | | `non-compliant-s3.json` | 不合规的 S3 资源示例 | | `aws-configs/circleci-trust-policy.json` | AWS 信任策略 | | `aws-configs/circleci-policy.json` | AWS 权限策略 | ## 流水线作业 流水线运行在 `.circleci/config.yml` 中定义的五个作业: | 作业 | 功能 | |---|---| | `test-aws-oidc` | 验证 CircleCI 是否可以使用 OIDC 向 AWS 进行身份验证 | | `test-opa-policies` | 运行 `s3_test.rego` 中的三个 OPA 单元测试 | | `validate-compliant-resource` | 将 `compliant-s3.json` 传递给 OPA - 期望零违规 | | `validate-non-compliant-resource` | 将 `non-compliant-s3.json` 传递给 OPA - 期望出现违规 | | `validate-terraform` | 运行 `terraform init`、`validate` 和 `apply` 来配置基础设施 | **作业执行顺序:** `test-aws-oidc` 和 `test-opa-policies` 在流水线开始时并行运行。一旦 `test-opa-policies` 通过,两个 OPA 验证作业(`validate-compliant-resource` 和 `validate-non-compliant-resource`)将并行运行。当这两个 OPA 验证作业都通过后,`validate-terraform` 将运行并配置存储桶。 ## 逐步实验设置 ### 第 1 步:创建 GitHub 仓库 创建一个名为以下名称的新 GitHub 仓库: ``` circleci-aws-opa-terraform-lab ``` 将上面仓库结构中列出的所有项目文件添加进去,并将它们提交到 `main` 分支。 ### 第 2 步:将仓库连接到 CircleCI 1. 前往 CircleCI (https://app.circleci.com/login) 2. 点击 **Log in with GitHub** 3. 前往 **Projects** 并找到你的仓库:`circleci-aws-opa-terraform-lab` 4. 点击 **Set Up Project** 5. 如果出现提示,请选择 `main` 作为默认分支 CircleCI 现在将监视此仓库,并在每次推送时触发流水线。 ### 第 2A 步:授权 CircleCI 通过 SSH 访问 GitHub 如果不执行此步骤,每个作业都会在 checkout 阶段失败,并显示 `Permission denied (publickey)` 错误。 1. 前往你的 CircleCI 项目 **Settings** 2. 点击左侧面板中的 **SSH Keys** 3. 在 **User Key** 下,点击 **Authorize with GitHub** 4. 点击 **Add User Key** 5. 点击 **Confirm User** ### 第 3 步:获取你的 CircleCI ID 你将需要你的 **Organization ID** 和 **Project ID**,用于 AWS 信任策略。 **Organization ID:** 1. 在 CircleCI 中,点击左侧面板中的 **Org** 2. 从此页面复制 Organization ID **Project ID:** 1. 返回主页选项卡 2. 在你的项目卡片上,点击 **Overview**,然后点击 **Settings** 3. 从此页面复制 Project ID ### 第 4 步:创建 AWS OIDC 身份提供商 这会告诉 AWS 信任由 CircleCI 颁发的 token。 1. 前往 **AWS IAM → Identity providers** 2. 点击 **Add provider** 3. 对于 Provider type,选择 **OpenID Connect** 4. 对于 Provider URL,输入:`https://oidc.circleci.com/org/` 5. 对于 Audience,输入你的 **Organization ID**(必须完全匹配) 6. 点击 **Add provider** ### 第 5 步:创建 CircleCI 将要扮演的 IAM 角色 1. 前往 **AWS IAM → Roles → Create role** 2. 选择 **Web identity** 作为受信任的实体类型 3. 选择你刚刚创建的 OIDC 提供商 4. 选择你的 **Organization ID** 作为 Audience 5. 点击 **Next** 6. 搜索并附加 **AmazonS3FullAccess** 7. 命名角色:`CircleCI-OIDC-Lab-Role` 8. 点击 **Create role** ### 第 6 步:更新信任策略 信任策略限制了哪些 CircleCI 组织和项目可以扮演该角色。 打开 `aws-configs/circleci-trust-policy.json`,确认你的 **AWS Account ID**、**Org ID** 和 **Project ID** 在所有出现的位置都已正确设置: - **Federated ARN** - 包含你的 AWS 账户 ID 和组织 ID - **Condition key names** - 包含你的组织 ID - **`aud` value** - 你的组织 ID - **`sub` value** - 同时包含你的组织 ID 和项目 ID 然后前往 **AWS IAM → Roles → CircleCI-OIDC-Lab-Role → Trust relationships → Edit trust policy**,粘贴 `circleci-trust-policy.json` 的内容并保存。 ### 第 7 步:将角色 ARN 添加到 CircleCI 从你的 IAM 角色中复制 ARN。它看起来像这样: ``` arn:aws:iam::123456789012:role/CircleCI-OIDC-Lab-Role ``` 然后在 CircleCI 中: 1. 前往你的项目 **Settings → Environment Variables** 2. 点击 **Add Variable** 3. Name:`AWS_ROLE_ARN` - Value:你的角色 ARN ### 第 8 步:查看关键文件 **`policies/s3.rego`** OPA 策略文件。包含两条规则:S3 存储桶必须启用服务器端加密,以及 S3 存储桶不得使用 `public-read` ACL。 **`policies/s3_test.rego`** 在自动化运行之前测试策略逻辑。确认该策略能够正确允许合规的存储桶并捕获违规情况。 **`terraform/main.tf`** 基础设施蓝图。定义了一个启用了加密、版本控制和公共访问屏蔽的合规 S3 存储桶。 **`aws-configs/circleci-trust-policy.json`** 控制谁被允许扮演 IAM 角色 - 限定为你特定的 CircleCI 组织和项目。 **`aws-configs/circleci-policy.json`** 控制 CircleCI 在扮演该角色后在 AWS 中被允许执行的操作。 ### 第 9 步:触发流水线 向 GitHub 推送一次提交 - CircleCI 会检测到并自动触发流水线。 或者在 CircleCI 中手动触发: 1. 点击右上角的 **Trigger Pipeline** 2. 从 Config source 下拉菜单中选择 **main** 3. 点击 **Run Pipeline** ### 第 10 步:观察流水线运行 在 CircleCI 中你会看到全部五个作业。点击任何作业可查看其日志。 **需要注意的内容:** - **`test-aws-oidc`** - 查看显示为绿色的 `Test AWS authentication with OIDC` 步骤。这确认了 CircleCI 和 AWS 之间的秘密握手成功。 - **`test-opa-policies`** - 确认所有三个 OPA 单元测试均已通过。 - **`validate-compliant-resource`** - OPA 发现零违规。好的存储桶通过了检查。 - **`validate-non-compliant-resource`** - OPA 发现了违规。坏的存储桶被成功阻止。 - **`validate-terraform`** - Terraform 已初始化、验证并应用。一个真实的 S3 存储桶已在 AWS 中创建。 ### 第 11 步:清理 每次成功的 `terraform apply` 都会创建一个带有随机后缀的新 S3 存储桶。为了避免累积存储桶并产生存储费用,请在完成实验后销毁资源。 **方式 1:使用 Terraform 销毁(推荐)** 在 `terraform/` 文件夹中运行: ``` terraform destroy -auto-approve ``` 这将移除 Terraform 上次创建的存储桶并更新状态文件。 **方式 2:使用 AWS CLI 手动删除存储桶** 如果你多次运行流水线,Terraform 仅跟踪最新的存储桶。要查找并删除较旧的存储桶: ``` # 列出所有 lab bucket aws s3 ls --profile | grep circleci-lab-compliant # 删除特定 bucket(替换为实际的 bucket 名称) aws s3 rb s3://circleci-lab-compliant-xxxxxxxx --force --profile ``` ## 关于流水线设计的说明 `test-aws-oidc` 与流水线的其余部分并行运行,但它实际上并不阻止任何其他作业运行。这意味着,如果 AWS 身份验证失败,OPA 作业仍然会运行,并且流水线只会在最后当 Terraform 尝试部署时才会失败。 如果我要重新构建此流水线,我会将 `test-aws-oidc` 设为 `validate-terraform` 的必要依赖项。这样,身份验证失败会及早显示出来,而不是在几分钟的不必要工作之后才出现。 ## 这如何与 GRC 产生关联 本实验以代码形式实现了多项云治理概念: | GRC 概念 | 实施方式 | |---|---| | 安全控制 | `s3.rego` 中的 OPA 策略规则 | | 持续控制监控 | 流水线在每次提交时运行 | | 证据收集 | 带有时间戳的 CircleCI 作业日志 | | 漂移预防 | 不合规的资源在部署前被阻止 | | 审计跟踪 | Git 中的完整变更历史 | | 最小权限访问 | OIDC 临时凭证,限定范围的 IAM 角色 | **演示的控制模式:** 本实验实现了两个特定的 S3 控制(静态加密、公共访问屏蔽)。它们映射到常见框架中的以下控制领域: * **SOC 2**:CC6.1(逻辑访问与静态数据保护) * **NIST 800-53**:SC-28(静态信息保护),AC-3(访问执行/公共访问屏蔽) * **CIS AWS Benchmark**:2.1.2(S3 加密),2.1.4(S3 公共访问屏蔽) * **ISO 27001:2022**:A.8.24(密码学/静态加密),A.8.22(网络安全/技术性公共访问屏蔽) 生产环境的 GRC 计划将扩展此模式,以涵盖更多的资源类型和控制措施。 ## 视频系列 本实验配有 4 部分的 YouTube 系列:**Cloud Security Automation Series** | 视频 | 标题 | |---|---| | [第 1 部分](https://youtu.be/LkgudHL7gHg) | OPA 与策略即代码 - 数字化规则手册 | | [第 2 部分](https://youtu.be/duBk5lrBO2s) | CI/CD 流水线 - 自动化装配线 | | [第 3 部分](https://youtu.be/WlZjKe66MR0) | 使用 OIDC 进行 AWS 身份验证 - 秘密握手 | | [第 4 部分](https://youtu.be/Bfz62T2S6b4) | Terraform 配置 - 蓝图检查 |
标签:AWS, CI/CD 安全, CI/CD 流水线, CircleCI, DevSecOps, DPI, EC2, ECS, Groq API, IaC, Modbus, OIDC, OPA, Rego, S3 存储桶安全, Terraform, 上游代理, 云基础设施, 亚马逊云, 合规自动化, 合规门禁, 安全左移, 安全策略测试, 安全认证, 持续合规, 数据投毒防御, 无长期凭证, 漏洞利用检测, 漏洞探索, 策略即代码, 结构化提示词, 聊天机器人安全, 靶场