容器安全与构建溯源
本文档介绍 Fystack 如何通过符合 SLSA 的溯源信息、无密钥加密签名和公开透明日志,确保容器构建可验证且防篡改。 这使我们能够证明每一个生产容器镜像都源自特定的 Git commit,且未被篡改。
1. 概述
每个生产镜像都使用 Docker BuildKit 构建,并内嵌 SLSA Level 3 溯源信息和 SPDX SBOM 元数据。 所有构建产物都使用 Sigstore Cosign 进行无密钥签名,并记录在 Rekor 透明日志中,形成不可篡改的审计记录。
完整性链:
完整性链
Git Commit → SLSA Provenance → Cosign Signature → Rekor Transparency Log
Distroless 基础镜像
Fystack 使用 distroless 镜像来尽量减少来自操作系统的攻击途径。Distroless 镜像只包含应用程序及其运行时依赖,去除了可能被利用的包管理器、shell 及其他工具。

Distroless Dockerfile
FROM golang:1.25 AS builder
ARG TARGETOS=linux
ARG TARGETARCH=amd64
WORKDIR /src
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY . .
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \
go build -o /out/mpcium ./cmd/mpcium
FROM gcr.io/distroless/base-debian12:latest
USER nonroot:nonroot
WORKDIR /app
COPY --from=builder /out/mpcium /app/mpcium
ENTRYPOINT ["/app/mpcium"]
这种方式:
- 通过去除不必要的操作系统软件包缩小攻击面
- 以非 root 用户运行,进一步提升安全性
- 使用 BuildKit 缓存挂载,使构建更快、更高效
- 生成极小的最终镜像(Go 二进制通常 <20MB)
2. 构建溯源与签名

安全 CI/CD 流水线:带无密钥签名和透明日志的 SLSA Level 3 溯源
SLSA Level 3 溯源
Workflow: .github/workflows/docker-push.yml
触发条件: push: tags: ['v*.*.*']
权限: id-token: write
每次带标签的构建都会生成:
- SLSA 溯源信息: 包含源 URI 和 commit SHA。
- SBOM(SPDX 2.3): 列出依赖项和软件包元数据。
- 不可变标签:
docker.io/fystack/apex/{service}:{version}和{version}-{sha}。
校验溯源信息
docker buildx imagetools inspect docker.io/fystack/apex/api:v1.0.0 \
--format '{{ json .Provenance.SLSA }}' | jq -r '.predicate.buildDefinition.resolvedDependencies[0].uri'
# Expected: https://github.com/fystack/apex/commit/<sha>
加密签名(Cosign Keyless)
每个镜像和证明都由 GitHub Actions 的 OIDC 身份签名,从而消除了私钥管理风险。 签名存储在 Rekor 中,这是一个公开的、仅追加的透明日志。
签名生成(在 CI 中):
签名镜像
cosign sign \
--identity-token "https://token.actions.githubusercontent.com" \
docker.io/fystack/apex/api@sha256:<digest>
签名校验:
校验签名
cosign verify \
--certificate-identity-regexp="github.com/fystack/apex/.github/workflows/docker-push.yml@*" \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
docker.io/fystack/apex/api:v1.0.0
这证明了:
- 镜像由受信任的 GitHub workflow 构建。
- 签名有效,并在 Rekor 中带有时间戳。
- 不存在可能被窃取或滥用的手动签名密钥。
3. 事件校验与恢复
如果怀疑发生了入侵、镜像篡改或内部攻击,请按照以下校验步骤证明其真实性:
第 1 步:获取溯源信息
获取溯源信息
cosign verify-attestation --type slsaprovenance docker.io/fystack/apex/api:v1.0.0 | jq .
显示源 commit URI、仓库以及 workflow 身份。
第 2 步:校验签名和透明记录
校验签名与 Rekor 日志
cosign verify \
--certificate-identity-regexp="github.com/fystack/apex/.github/workflows/docker-push.yml@*" \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
docker.io/fystack/apex/api:v1.0.0
rekor-cli search --artifact docker.io/fystack/apex/api:v1.0.0
确认镜像签名有效,且其记录带时间戳存在于 Rekor 的公开日志中。
第 3 步:校验 Git Commit 完整性
校验 Commit
git show <commit-sha>
确认溯源信息中引用的 commit 仍然存在且未被改写。
第 4 步:交叉核对 SBOM
校验 SBOM
docker buildx imagetools inspect docker.io/fystack/apex/api:v1.0.0 | jq '.SBOM'
确认依赖项与已校验的源仓库和 SBOM 元数据一致。
最终证明链:
证明链
Rekor Timestamp → Cosign Signature → Provenance Commit URI → Git Commit Hash
如果这四项全部一致,即可证明该镜像源自一个受信任且未被篡改的 commit。
校验清单
步骤 | 命令 | 预期输出 |
|---|---|---|
| cosign verify ... | 显示 GitHub OIDC 身份的成功消息 |
| rekor-cli search --artifact <image> | 带时间戳的日志条目 |
| cosign verify-attestation --type slsaprovenance ... | Commit URI 和 workflow ID |
| git show <sha> | Commit 元数据与溯源信息一致 |
| docker buildx imagetools inspect ... | 存在 SPDX 2.3 元数据 |
4. 加固与最佳实践
控制措施 | 目的 |
|---|---|
按 digest 固定基础镜像 | 防止供应链漂移和标签被改写。 |
不可变版本标签 | 禁止覆盖已有的版本标签。 |
在 GitHub 中要求签名 commit | 确保源 commit 经过认证。 |
镜像仓库内容信任 | 强制 OCI 镜像仓库标签不可变。 |
内嵌 SBOM | 确保依赖项可追溯。 |
强制执行不可变策略 | 防止向已有标签推送镜像。 |
使用 immudb 审计 | 将校验结果(镜像 digest + commit SHA)存储在防篡改日志中。 |
5. 总结
这条构建流水线为 Fystack 提供了从 Git commit 到已部署容器的可证明、可通过密码学验证的谱系。
它确保:
- 供应链溯源透明且可审计。
- 不依赖任何私密密钥。
- 抵御内部或外部篡改。
- 与 SLSA Level 3 和 Sigstore 最佳实践保持合规一致。
简而言之: 每个 Fystack 容器不仅可复现,而且可证明是真实的。