容器安全与构建溯源

本文档介绍 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 容器架构
Click to open the full-size diagram

Distroless Dockerfile

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 溯源
Click to open the full-size diagram

安全 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}。

校验溯源信息

bash
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 中):

签名镜像

bash
cosign sign \
  --identity-token "https://token.actions.githubusercontent.com" \
  docker.io/fystack/apex/api@sha256:<digest>

签名校验:

校验签名

bash
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 步:获取溯源信息

获取溯源信息

bash
cosign verify-attestation --type slsaprovenance docker.io/fystack/apex/api:v1.0.0 | jq .

显示源 commit URI、仓库以及 workflow 身份。

第 2 步:校验签名和透明记录

校验签名与 Rekor 日志

bash
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

bash
git show <commit-sha>

确认溯源信息中引用的 commit 仍然存在且未被改写。

第 4 步:交叉核对 SBOM

校验 SBOM

bash
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。

校验清单

步骤

命令

预期输出

  1. 校验签名
cosign verify ...

显示 GitHub OIDC 身份的成功消息

  1. 检查 Rekor 日志
rekor-cli search --artifact <image>

带时间戳的日志条目

  1. 检查溯源信息
cosign verify-attestation --type slsaprovenance ...

Commit URI 和 workflow ID

  1. 确认 Commit 存在
git show <sha>

Commit 元数据与溯源信息一致

  1. 验证 SBOM
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 容器不仅可复现,而且可证明是真实的。