---
title: "容器安全与构建溯源"
description: "Fystack 如何通过符合 SLSA 的溯源信息、无密钥加密签名和公开透明日志，确保容器构建可验证且防篡改。"
url: https://docs.fystack.io/zh/security/docker-build-hardening
last_updated: 2026-11-13
---

> ## Documentation index
> Fetch the complete documentation index at: https://docs.fystack.io/llms.txt
> Use it to discover all available pages before exploring further.

# 容器安全与构建溯源

本文档介绍 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 及其他工具。

_Diagram: Distroless 容器架构_

**Distroless Dockerfile**

```bash
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. 构建溯源与签名

_Diagram: 安全 CI/CD 流水线：带无密钥签名和透明日志的 SLSA Level 3 溯源_

安全 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 身份的成功消息 |
| 2. 检查 Rekor 日志 | `rekor-cli search --artifact <image>` | 带时间戳的日志条目 |
| 3. 检查溯源信息 | `cosign verify-attestation --type slsaprovenance ...` | Commit URI 和 workflow ID |
| 4. 确认 Commit 存在 | `git show <sha>` | Commit 元数据与溯源信息一致 |
| 5. 验证 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 容器不仅可复现，而且**可证明是真实的**。
