JadenRazo/aws-supply-chain-security
GitHub: JadenRazo/aws-supply-chain-security
这是一个在AWS上实现容器供应链安全的自动化项目,通过SBOM、漏洞扫描和签名验证来保障镜像完整性并强制部署门禁。
Stars: 0 | Forks: 0
# AWS 供应链安全
AWS 上的容器供应链安全 — 每个离开 CI 的镜像在部署前都必须经过 **SBOM 清单编制、漏洞扫描和密码学签名**。签名验证是部署路径中的强制环节;缺失或不匹配的签名会导致构建失败。
## 本项目证明的能力
| 技能 | 演示方式 |
|---|---|
| **SBOM 生成** | `supply-chain.yml` 中的 `syft` 步骤;以工作流产物形式上传 SPDX JSON |
| **漏洞扫描** | 使用 `grype` 并设置 `severity-cutoff: high` — 管道在推送前遇到高危及以上漏洞时使构建失败 |
| **无密钥签名** | 使用 GitHub OIDC 进行 `cosign sign` → 通过 Sigstore Fulcio 短期证书 + Rekor 透明日志;无需长期签名密钥 |
| **签名验证** | 同一工作流在推送后运行 `cosign verify`,断言证书身份与工作流 URL 匹配 |
| **ECR 推送扫描** | 存储库配置为 `image_scanning_configuration { scan_on_push = true }` |
| **事件驱动告警** | EventBridge 规则将 `ECR Image Scan` 事件路由至 Lambda;Lambda 对高危及以上严重性进行门控并发布至 SNS → 邮件 |
| **跨账户 IaC** | Terraform 通过链式 mgmt OIDC 角色部署至 workloads-dev 的 `OrganizationAccountAccessRole` |
| **不可变标签 + 生命周期** | ECR 存储库设置为 `IMMUTABLE`,未标记镜像 1 天后过期,保留最近 10 个带标签镜像 |
## 架构

构建 → SBOM → 扫描 → 签名 → 推送 → 验证,全部在一个工作流中完成。扫描结果反馈至与构建解耦的告警路径:
| 工作流结果 | 查看位置 |
|---|---|
| 端到端管道运行(签名 + 验证)— 供应链运行 #6 | `screenshots/01-workflow-success.png` |
| 部署门禁触发(grype 高危+ 阻止推送)— 供应链运行 #2 | `screenshots/01b-workflow-gate-fail.png` |
| `cosign verify` 输出,在本地针对已推送镜像运行 | `screenshots/02-cosign-verify-cli.txt` |
| `cosign tree` 显示附加至镜像的 Sigstore Rekor 条目 | `screenshots/02b-cosign-tree.txt` |
| ECR 扫描 + 镜像产物(镜像 + 并置签名标签) | `screenshots/03-ecr-scan-cli.txt` |
| Syft SBOM 元数据、包数量、许可证摘要 | `screenshots/05-syft-sbom-excerpt.txt` |
| 合成 Lambda 调用脚本(确认 SNS 订阅后使用) | `screenshots/04-trigger-sns-test.sh` |
```
GitHub Actions (build/scan/sign) ──► Sigstore Fulcio + Rekor (signing + log)
──► ECR (push image + .sig)
ECR scan-on-push ──► EventBridge ──► Lambda ──► SNS ──► Email
```
## 成本
| 资源 | 驱动因素 | 预估月费(美元) |
|---|---|---|
| ECR 存储库(≤500MB 镜像) | 免费套餐 | $0 |
| ECR 推送扫描 | 免费套餐(基础扫描) | $0 |
| EventBridge 规则 | 首 1400 万事件免费 | $0 |
| Lambda(每次镜像推送调用 1 次) | 免费套餐(每月 100 万次请求) | $0 |
| SNS 主题 + 邮件 | 免费套餐(每月 100 封邮件至邮箱订阅者) | $0 |
| CloudWatch Logs(7 天保留期) | 可忽略 | <$0.10 |
| **总计** | | **约 $0** |
## 运行模式
供应链工作流接受 `mode` 输入以控制部署门禁:
- `gate`(默认):grype 使用 `severity-cutoff: high, only-fixed: true, fail-build: true`。存在可用修复程序的高危及以上漏洞会在推送前中断构建。**此为生产环境设置。**
- `demo`:相同扫描、相同 SARIF 上传,但 `fail-build: false`,因此即使源代码存在已知可修复漏洞,管道仍会继续签名 + 验证。用于演示完整签名验证流程,或在截止日期前有意识接受风险时使用。
模式记录在每次运行的 `$GITHUB_STEP_SUMMARY` 中。
## 冒烟测试
应用 `infra/` 并至少推送一次供应链工作流后:
```
# 1. 镜像存在于 ECR 中
aws ecr describe-images --repository-name supply-chain-demo \
--profile workloads_dev --region us-west-2
# 2. 签名与之并存
ECR_URI=$(aws ecr describe-repositories --repository-names supply-chain-demo \
--profile workloads_dev --region us-west-2 \
--query 'repositories[0].repositoryUri' --output text)
DIGEST=$(aws ecr describe-images --repository-name supply-chain-demo \
--profile workloads_dev --region us-west-2 \
--query 'sort_by(imageDetails,&imagePushedAt)[-1].imageDigest' --output text)
# 3. 签名验证(此为关键步骤)
cosign verify "${ECR_URI}@${DIGEST}" \
--certificate-identity-regexp "https://github.com/JadenRazo/aws-supply-chain-security/\.github/workflows/supply-chain\.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
# 4. 公共 Rekor 条目
cosign tree "${ECR_URI}@${DIGEST}"
```
签名不匹配 — 例如由分叉工作流推送的镜像 — 会导致 `cosign verify` 以非零状态退出。这就是部署门禁。
## 仓库布局
```
.
├── infra/ # Terraform stack (ECR + EventBridge + Lambda + SNS)
│ ├── ecr.tf # repo, lifecycle, repo policy
│ ├── eventbridge.tf # rule + target + permission
│ ├── lambda.tf # role, function, log group
│ ├── sns.tf # topic, email subscription
│ ├── data.tf # SSM lookups for landing-zone foundation
│ ├── lambda/
│ │ └── scan_findings_handler.py
│ └── README.md # apply + verify + teardown
├── .github/workflows/
│ ├── plan.yml # PR-triggered terraform plan, posts to PR
│ ├── apply.yml # workflow_dispatch terraform apply
│ └── supply-chain.yml # build → SBOM → scan → sign → push → verify
├── docs/
│ ├── architecture.png
│ ├── sbom-vs-vuln-scan.md
│ ├── cosign-keyless-signing.md
│ └── what-id-do-differently.md
└── screenshots/ # workflow run, cosign verify, ECR scan, SNS email, syft SBOM
```
## 基础设施复用
本仓库不重新发明 OIDC 信任、账户映射或自动停止策略 — 这些均位于 [`sre-landing-zone`](https://github.com/JadenRazo/sre-landing-zone)。具体而言:
- 工作流假设 `arn:aws:iam::569239324174:role/GitHubActionsTerraformRunner` (mgmt),然后链式调用至 `workloads-dev` 的 `OrganizationAccountAccessRole`
- 账户 ID 从 SSM `/sre-landing-zone/account-map` 读取(无硬编码 ID)
- 资源标记为 `Environment=dev`,以便在疏忽时,landing-zone 自动停止 Lambda 会在夜间将这些资源缩放至零
## 证书映射
- **CCSP 领域 4** — 云应用安全(镜像加固、签名、SBOM、供应链证明)
- **AWS 安全专业认证** — 围绕 ECR 扫描结果的自动化,EventBridge 驱动响应
- **相关技能**:SLSA 框架概念、Sigstore 生态系统、AWS Lambda + EventBridge 模式
## 源镜像
被签名的镜像构建自 [`sre-reference-app`](https://github.com/JadenRazo/sre-reference-app) 的 `app/Dockerfile`(Python 3.12-slim、gunicorn、端口 8080、非 root 用户)。供应链工作流 `actions/checkout` 该仓库的固定引用并在本地构建 — 除 Docker Hub 的 `python:3.12-slim` 外无外部基础镜像依赖。
## 许可证
MIT — 参见 `LICENSE`。
标签:Amazon ECR, AWS, CI/CD安全, cosign, DPI, ECR, ECS, EventBridge, Fulcio, GitHub Actions, grype, Lambda, Llama, OIDC, Rekor, SBOM, Sigstore, SNS, syft, Terraform, Web截图, 不可变标签, 事件驱动, 供应链攻击防护, 安全扫描, 容器安全, 数字签名验证, 无密钥签名, 时序注入, 活动识别, 生命周期管理, 硬件无关, 自动笔记, 警报, 跌倒检测, 跨账户部署, 软件物料清单, 逆向工具, 镜像扫描, 镜像签名