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截图, 上游代理, 代码签名, 容器安全, 应用安全, 日志审计, 硬件无关, 请求拦截, 逆向工具