j-dahl7/container-sbom-signing-attestation
GitHub: j-dahl7/container-sbom-signing-attestation
该项目是一个容器供应链安全实验室,演示如何通过 GitHub Actions 实现零密钥的镜像签名、SBOM 证明与 SLSA 构建来源验证。
Stars: 0 | Forks: 0
# 容器 SBOM、签名与证明实验
这是 [保护您的容器供应链:使用 GitHub Actions 进行 SBOM、签名与证明](https://nineliveszerotrust.com/blog/container-sbom-signing-attestation/) 的配套实验。
它构建了一个小型的非 root、distroless Go 镜像,并演示了一个需要三个可独立检查的产物的消费者策略:
1. 无密钥的 Cosign 镜像签名;
2. 已签名的 SPDX SBOM 证明;以及
3. 已签名的 SLSA 构建来源。
所有 GitHub Actions 和 Docker 基础镜像均固定为不可变的 digest 或 commit SHA。Dependabot 会提交更新提案供审查,而不是静默地跟随可变的 tag。
## 信任与发布边界
- 工作流默认权限为 `contents: read`。
- Pull request 可以进行测试、构建和扫描,但不会获得 package、OIDC 或证明的写入权限。
- 仅允许从 `refs/heads/main` 或 `v*` tag 进行发布。从任何其他 ref 进行的手动触发有意设为仅验证模式。
- 只有发布作业会获得 `packages: write`、`id-token: write` 和 `attestations: write` 权限。
- 验证被绑定到该仓库确切的 `.github/workflows/supply-chain.yml` 身份以及 `main` 或 `v*` tag。来自其他 GitHub 工作流的签名不会被接受。
- 缺少签名、SBOM 或来源将视为失败,而不仅仅是警告。
## 仓库结构
```
app/ Demo Go service and tests
Dockerfile Digest-pinned multi-stage build
scripts/check-pinned-refs.sh Immutable-reference policy
scripts/local-build.sh Optional local build helper
scripts/verify-image.sh Fail-closed consumer verification
tests/ Offline security contract tests
.github/workflows/ Read-only validation and ref-gated publication
```
## 本地验证
需要 Python 3、Bash、Go 1.24.13+ 和 Docker。要进行完整的本地供应链演练,还需要 Trivy 和 Syft。
```
bash scripts/check-pinned-refs.sh
python3 -m unittest discover -s tests -v
(cd app && go test ./...)
bash scripts/local-build.sh
```
Docker 构建过程也会运行 Go 测试,因此应用程序测试失败将无法生成发布镜像。
## 验证已发布的镜像
安装 Cosign,然后传入不可变的镜像引用和预期的 GitHub 仓库:
```
bash scripts/verify-image.sh \
ghcr.io/OWNER/REPOSITORY@sha256:FULL_64_CHARACTER_DIGEST \
OWNER/REPOSITORY
```
仓库参数是安全策略,而不是用于展示的元数据。请使用拥有此工作流的仓库;不要使用通配符替换它。除非签名、SPDX SBOM 以及一个被接受的 SLSA 来源断言全都匹配完全相同的工作流身份,否则该脚本将以非零状态退出。
## 流水线
```
pull request / main / v* tag
|
v
immutable-ref guard + tests
|
v
local build + config/image scans
|
+---- PR or untrusted manual ref: stop
|
v
main or v* only: publish by digest
|
v
sign + attach SPDX SBOM + attach provenance
|
v
verify all three against exact GitHub identity
```
该示例有意设定了严格的规则:仅凭构建成功并不能证明镜像是受信任的。消费者应仅在验证策略通过后,才通过 digest 进行部署。
## 轮换与更新
审查针对 Action SHA、Docker digest 和 Go 模块的 Dependabot 提案。
`check-pinned-refs.sh` 检查器会阻止诸如 `actions/checkout@v4` 或 `FROM image:tag` 等可变替换。固定 digest 保留了可审查的输入;但这并不意味着可以不及时的进行安全更新。
## 许可证
MIT。本实验仅用于演示和教育目的。
标签:DevSecOps, SBOM, Web截图, 上游代理, 代码签名, 容器安全, 应用安全, 日志审计, 硬件无关, 请求拦截, 逆向工具