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安全, 上游代理, 结构化提示词, 自动笔记