Loodsarpong/iac-security-pipeline

GitHub: Loodsarpong/iac-security-pipeline

一个即插即用的 GitHub Actions 安全工作流,通过集成多种开源扫描工具在 PR 阶段自动拦截 IaC、容器和依赖中的高危安全问题。

Stars: 0 | Forks: 0

# iac-security-pipeline **作者:** Louis Oduro-Sarpong, CISA, Security+, AWS SAA **技术栈:** GitHub Actions, tfsec, Checkov, Trivy, Gitleaks, OPA/Conftest 一个即插即用的 GitHub Actions 工作流,可在每次发起 pull request 时扫描 Terraform、容器镜像和依赖项中的安全问题,并阻止引入 CRITICAL 或 HIGH 级别发现的合并。安全左移即代码,五分钟内即可添加到任何代码库。 ## 为什么会有这个项目 在 pull request 阶段修复配置错误比在生产环境中修复成本更低。2024 年的一项行业研究发现,在 PR 阶段捕获到的 Terraform 配置错误,其修复成本约为部署后才发现时的 1/100。本流水线是最小可行性的左移实现:免费工具,无 SaaS 依赖,仅需一个工作流文件。 ## 扫描内容 | 层级 | 工具 | 捕获内容 | |---|---|---| | Terraform | **tfsec** | AWS/Azure/GCP 配置错误:未加密的 S3、完全开放的安全组 (SG)、缺少 MFA 条件 | | Terraform | **Checkov** | 与 tfsec 相同,外加 CIS Benchmark、NIST、PCI 策略包 | | 依赖项 | **Trivy fs** | `requirements.txt`、`package.json`、`go.mod` 中的 CVE | | 容器镜像 | **Trivy image** | 代码库中构建的任何 Dockerfile 中的 CVE | | 密钥 | **Gitleaks** | 硬编码的 API key、AWS 凭据、私钥 | | 策略即代码 | **Conftest** | OPA/Rego 中的自定义规则(例如,“禁止创建没有 Owner 标签的资源”) | ## 如何拦截合并 该工作流在每次 PR 时运行。默认情况下: - CRITICAL 级别发现:**阻止合并** - HIGH 级别发现:**阻止合并** - MEDIUM 级别发现:在 PR 中评论,不阻止合并 - LOW 级别发现:在 PR 中评论,不阻止合并 所有阈值均可通过 `severity-threshold` 输入项进行配置。代码库所有者可以在 `.github/workflows/security.yml` 中调整它们。 每次 PR 都会收到来自机器人的一条汇总评论,将所有扫描器的结果集中在一处,这样审查者就不必点击进入 Actions 查看。 ## 覆盖范围演示 `examples/` 文件夹中包含了两个 Terraform 文件,它们旨在以已知且可预测的方式触发流水线失败: - `examples/vulnerable.tf` — 一个没有加密、没有公共访问阻止,并且配置了 `0.0.0.0/0` 安全组的 S3 存储桶。用于证明扫描器能捕获实际问题。 - `examples/compliant.tf` — 相同的工作负载,但已安全加固。用于证明流水线可以放行干净的代码。 这使得该项目在面试中非常容易演示:“这是失败的 PR,这是通过的 PR,都是真实的。” ## 快速入门,添加到现有代码库 ``` mkdir -p .github/workflows curl -o .github/workflows/security.yml \ https://raw.githubusercontent.com/Loodsarpong/iac-security-pipeline/main/.github/workflows/security.yml git add .github/workflows/security.yml git commit -m "Add IaC security scanning to CI" git push ``` 就是这样。发起一个包含故意配置错误的资源的 PR,看着它被拦截。 ## 输出示例 来自机器人的真实 PR 评论: ``` Security Scan Summary, PR #42 | Scanner | Critical | High | Medium | Low | |-----------|----------|------|--------|-----| | tfsec | 0 | 2 | 1 | 0 | | Checkov | 0 | 3 | 4 | 1 | | Trivy | 1 | 0 | 0 | 0 | | Gitleaks | 0 | 0 | 0 | 0 | ❌ Merge blocked: 1 CRITICAL, 5 HIGH findings. Top issues: - CKV_AWS_19 S3 bucket does not have encryption enabled (modules/storage/main.tf:14) - AVD-AWS-0107 SG allows ingress from 0.0.0.0/0 on port 22 (modules/net/sg.tf:8) - CVE-2024-3094 liblzma backdoor in xz-utils (Dockerfile:3) Run locally to debug: tfsec modules/ checkov -d modules/ trivy fs . ``` ## 代码库布局 ``` .github/workflows/ security.yml # the pipeline itself, copy this into any repo pr-comment.yml # composite action: aggregate findings into one PR comment docs/ configuring-thresholds.md custom-rego-rules.md troubleshooting.md examples/ vulnerable.tf # known-bad Terraform, for demos compliant.tf # known-good Terraform, for demos terraform/ # optional: provision the GitHub repo + branch protection ``` ## 自定义策略 (Rego) 流水线包含一个 `conftest` 步骤,用于运行来自 `policies/` 目录下的自定义 OPA/Rego 策略。示例: ``` # policies/require_owner_tag.rego package main deny[msg] { resource := input.resource_changes[_] resource.type == "aws_s3_bucket" not resource.change.after.tags.Owner msg := sprintf("S3 bucket '%s' is missing required 'Owner' tag", [resource.address]) } ``` 这里是存放你组织特定规则的地方:标签规范、必需的加密密钥、命名标准。扫描器涵盖了通用的公开基准;而 Rego 负责涵盖你的特定规则。 ## 为什么选择 GitHub Actions 而不是 Jenkins/GitLab 本脚本目标求职市场上的大多数安全候选人,面试的都是使用 GitHub 的公司。GitHub Actions 拥有最快的设置时间(仅需一个文件)、最低的成本(对公开代码库和大多数私有代码库免费),以及在云原生领域最广泛的认同度。该流水线是可移植的,相同的扫描器也能在 GitLab CI 或 Jenkins 中运行,但演示流程要设在受众所在的地方。 ## 局限性 / 未来工作 - 不执行动态分析。这是静态的、IaC 阶段的安全防护。运行时检测位于 `cloudtrail-detection-pipeline` 伴随项目中。 - Trivy 镜像扫描要求代码库中包含 Dockerfile。如果你的团队在其他地方构建,请替换为你的镜像仓库端扫描。 - PR 评论聚合使用了一个小型的 Python 脚本;对于超大型代码库,出于性能考虑,应将其替换为 Aqua 或 Snyk 等托管型解决方案。 ## 许可证 MIT。
标签:DevSecOps, GitHub Actions, IaC安全, 上游代理, 结构化提示词, 自动笔记