供应链¶
从 1.0.0 版本起,Turbo EA 发布到 GHCR 的容器镜像包含可验证的供应链元数据,操作员在将镜像拉入生产环境之前可以确认该镜像来自本项目的 CI。
本页介绍签名内容、验证方法、SBOM 所在位置,以及(目前仅供参考的)Trivy 扫描的作用。
签名内容¶
由 .github/workflows/docker-publish.yml 构建并推送到 ghcr.io/vincentmakes/turbo-ea/<镜像> 的每个镜像均使用 cosign 通过无密钥 OIDC 签名:没有长期有效的签名密钥。证书由 Sigstore 的 Fulcio 为工作流标识颁发,记录在公共 Rekor 透明日志中,并在签名创建后立即丢弃。
已签名的镜像:
ghcr.io/vincentmakes/turbo-ea/dbghcr.io/vincentmakes/turbo-ea/backendghcr.io/vincentmakes/turbo-ea/frontendghcr.io/vincentmakes/turbo-ea/nginxghcr.io/vincentmakes/turbo-ea/mcp-server
ollama 镜像在矩阵之外手动重建,目前未签名。如果您依赖捆绑的 Ollama 配置文件并需要验证,请从源码构建。
签名适用于 OCI 清单列表摘要,因此单个签名可透明地涵盖 linux/amd64 和 linux/arm64。
验证镜像¶
安装 cosign,然后运行:
cosign verify \
--certificate-identity-regexp 'https://github.com/vincentmakes/turbo-ea/.+' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
ghcr.io/vincentmakes/turbo-ea/backend:1.0.0
参数说明:
--certificate-identity-regexp— 接受此仓库中的任何工作流路径。如需更严格验证,请替换为--certificate-identity 'https://github.com/vincentmakes/turbo-ea/.github/workflows/docker-publish.yml@refs/tags/v1.0.0'。--certificate-oidc-issuer— 将 OIDC 颁发者固定为 GitHub 的令牌端点。由任何其他颁发者(如 fork 的 CI)颁发的签名将验证失败。
验证成功后会打印已签名的载荷和 Rekor 透明日志条目 URL。失败时以非零代码退出——请让您的部署在此处失败。
您也可以按摘要验证,这是最严格的形式(不受标签重新映射影响):
DIGEST=$(docker buildx imagetools inspect ghcr.io/vincentmakes/turbo-ea/backend:1.0.0 --format '{{ .Manifest.Digest }}')
cosign verify \
--certificate-identity-regexp 'https://github.com/vincentmakes/turbo-ea/.+' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
ghcr.io/vincentmakes/turbo-ea/backend@${DIGEST}
SBOM¶
SPDX 软件物料清单由 buildkit 自动生成(构建步骤中设置 sbom: true),并作为 OCI 引用者附加到每个镜像。无需额外安装。
使用以下命令获取:
docker buildx imagetools inspect --format '{{ json .SBOM }}' \
ghcr.io/vincentmakes/turbo-ea/backend:1.0.0 | jq .
SBOM 列出了 buildkit 在最终镜像中观察到的所有软件包(apk 包、Python wheel、Node 模块等),包含版本和来源 URL。
漏洞扫描(Trivy)¶
发布工作流对每个构建的镜像运行 Trivy 扫描 HIGH 和 CRITICAL 级别的 CVE,并将结果作为 SARIF 上传到仓库的 Security 选项卡。
扫描目前不阻塞(exit-code: 0)。如果 Trivy 结果对您的部署环境很重要,请对拉取的镜像运行自己的扫描器。已发布的 SBOM 是一个干净的输入源。
对于贡献者: 如果您发现真正可利用的漏洞,请通过私人安全公告而非公开 issue 进行报告。
Action SHA 固定¶
发布工作流使用的每个 GitHub Action 都固定在 40 字符的提交 SHA,而非浮动的主要版本标签。更新通过 github-actions 生态系统的 Dependabot 按月进行。