goreleaser/example-supply-chain
GitHub: goreleaser/example-supply-chain
这是一个展示如何利用 GoReleaser 和 GitHub Actions 实现包含无密钥签名、SBOM 生成及证明的软件供应链安全配置示例。
Stars: 60 | Forks: 11
# supply-chain-example
GoReleaser + Go Mod 代理 + Cosign 无密钥签名 + Syft SBOM 生成示例。
## 工作原理
基本上,GoReleaser 管理着整个过程。
它会:
- 使用 Go Mod 代理作为事实来源进行构建
- 调用 `syft` 来创建 SBOM
- 创建校验和文件
- 使用 `cosign` 对其进行签名
- 使用刚刚构建的二进制文件创建一个 docker 镜像(因此,docker 镜像内的二进制文件与发布的版本一致)
- 同时使用 `cosign` 对 docker 镜像进行签名
## 验证
您的用户需要知道如何验证构建产物,本节正是关于此内容的。
我们需要做的第一件事是获取当前的最新版本:
```
export VERSION="$(gh release list -L 1 -R goreleaser/example-supply-chain --json=tagName -q '.[] | .tagName')"
```
然后,我们下载 `checksums.txt` 和签名包(`checksums.txt.sigstore.json`)文件,并验证它们:
```
wget https://github.com/goreleaser/example-supply-chain/releases/download/$VERSION/checksums.txt
wget https://github.com/goreleaser/example-supply-chain/releases/download/$VERSION/checksums.txt.sigstore.json
cosign verify-blob \
--certificate-identity "https://github.com/goreleaser/example-supply-chain/.github/workflows/release.yml@refs/tags/$VERSION" \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--bundle "checksums.txt.sigstore.json" \
./checksums.txt
```
这应该会成功——这意味着从现在起我们可以使用此校验和文件验证发布中的任何构建产物!
然后,您可以从发布中下载您想要的任何文件,并使用以下命令进行验证,例如:
```
wget "https://github.com/goreleaser/example-supply-chain/releases/download/$VERSION/supply-chain-example_linux_amd64.tar.gz"
sha256sum --ignore-missing -c checksums.txt
```
理想情况下,这应该会显示 "OK"。
然后,您可以检查 SBOM 文件以查看二进制文件的完整依赖树,检查是否存在易受攻击的依赖项等。
要获取构建产物的 SBOM,您可以使用相同的下载 URL,在 URL 末尾添加 `.sbom.json`,然后我们可以使用 `grype` 对其进行检查:
```
wget "https://github.com/goreleaser/example-supply-chain/releases/download/$VERSION/supply-chain-example_linux_amd64.tar.gz.sbom.json"
sha256sum --ignore-missing -c checksums.txt
grype sbom:supply-chain-example_linux_amd64.tar.gz.sbom.json
```
最后,我们还可以使用 `gh` CLI 来验证证明:
```
gh attestation verify \
--owner goreleaser \
*.tar.gz
```
Docker 镜像稍微简单一些,您可以直接使用 cosign 和 grype 验证它们,并检查证明。
签名:
```
cosign verify \
--certificate-identity "https://github.com/goreleaser/example-supply-chain/.github/workflows/release.yml@refs/tags/$VERSION" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
"ghcr.io/goreleaser/example-supply-chain:$VERSION"
```
漏洞:
```
grype "docker:ghcr.io/goreleaser/example-supply-chain:$VERSION"
```
证明:
```
gh attestation verify \
--owner goreleaser \
"oci://ghcr.io/goreleaser/example-supply-chain:$VERSION"
```
如果所有这些检查都通过,则表明一切正常。
标签:Cosign, DNS解析, Docker, EVTX分析, GitHub Actions, Go Modules, GoReleaser, Go语言, SBOM, Syft, 代码签名, 安全防御评估, 容器镜像, 开源框架, 开源项目, 持续集成, 无密钥签名, 日志审计, 硬件无关, 程序破解, 签名验证, 自动化构建, 自动笔记, 请求拦截, 跌倒检测, 软件供应链安全, 软件物料清单, 远程方法调用