第25章|容器基础 2:镜像仓库、签名与供应链安全

镜像是交付的“硬币”,镜像仓库是你的“央行”。如果央行管理混乱:谁都能发币、发了币也没人知道真假—— 那交付速度越快,风险就越大。 这一章把容器交付的可信链路讲清楚:Registry 组织与权限tag/digest 治理签名与验证、以及把 SBOM + provenance 串起来的“可验证制品”。

Governance

仓库不是存储,是权限与流程

  • 命名空间(org/project)= 治理边界
  • 写权限最小化:只允许 CI 身份推送
  • 拉取权限分层:public / internal / prod-only
Integrity

签名让“真假”可验证

  • 构建后对 digest 签名(如 Sigstore/cosign)
  • 部署前验证签名 + 策略(policy-as-code)
  • 拒绝未签名或不符合策略的制品
Traceability

SBOM + provenance = 可追溯的证据链

  • SBOM:里面有什么依赖
  • Provenance:怎么构建出来的
  • 组合起来:可审计、可合规、可止损

1. 镜像仓库的本质:内容分发 + 权限边界 + 审计中心

Registry 不只是“放镜像的地方”,它至少承担四个角色:

  1. 分发:把镜像层分发给构建与运行环境(pull)。
  2. 命名与组织:把镜像按团队/系统/环境组织(namespace)。
  3. 权限与策略:谁能 push、谁能 pull、能不能覆盖 tag、能不能删。
  4. 审计与保留:谁在什么时候推了什么 digest、是否被签名、是否被部署。
现实建议:把“生产可用镜像”的入口收敛到一个受控命名空间,并且默认只允许 CI 身份写入,禁止个人账号直接 push。

2. 组织与权限:命名空间是你的治理边界

一个好用的镜像仓库层级通常像这样:

Registry 组织与权限:命名空间 = 治理边界 目标:写权限收敛到 CI 身份;读权限分层;prod 镜像入口强门禁 org acme/ project payments/ repos: api, worker, cron repo api tags: 1.2.3, prod, canary digest: sha256:… retention + immutability policies RBAC model CI identity push to project/* · cannot delete Deploy system pull prod-only namespace · verify signature Human users read-only by default · break-glass audited govern
图 1:Registry 的治理模型。命名空间是边界,写权限收敛到 CI 身份,prod 拉取需要更强的验证与策略。

3. 签名与验证:让“部署”变成“验证后部署”

供应链攻击最爱钻的空子是:你以为你部署的是你构建的东西,但中途有人替换了内容(或替换了 tag 指向)。 解决方法是:对 digest 签名,并在部署时验证签名与策略。

一句话:签名让“你说你是谁、你构建了什么”变成可验证事实;策略让“什么东西允许进生产”变成可执行规则。
签名与验证链路(Sigstore/cosign 思路):签名 digest,部署前验证 目标:拒绝未签名/不合规制品,把风险挡在生产门外 CI build produce image@digest OIDC identity sign digest Registry image@sha256:… stores signature + attestations immutability (recommended) Verifier policy checks signature verified allow / deny Policy-as-code (examples) - allow only signed images - require provenance from trusted builder - block CVE severity above threshold (optional gate) - enforce allowed registries/namespaces enforce
图 2:签名与验证链路。把“可部署”升级为“验证后才可部署”,并用策略把规则固化为默认正确。

4. SBOM + provenance:把“里面有什么”和“怎么来的”都交代清楚

供应链安全常见两个问题:

当你把 SBOM 与 provenance 作为 attestation 绑定到镜像 digest 上,就形成了可审计的证据链:某次部署用的 digest, 能反查到其依赖清单、构建来源与签名者。

实战价值:当爆出某个高危 CVE,你可以快速回答:“哪些生产镜像包含它?是否被部署?部署在什么环境?能否阻断继续部署?”
可信交付链:digest 绑定 SBOM + provenance + 签名 目标:交付对象可验证、可审计、可快速止损(阻断不可信制品) Digest sha256:… immutable identity deployed by CD SBOM what's inside? deps · versions · licenses CVE mapping policy: block high severity or allow with exception Provenance how was it built? source commit · builder build steps · parameters trusted build environment Verification at deploy time verify signature → verify provenance → check SBOM policy → allow/deny evidence: deploy record links to digest + attestations incident: quickly find affected digests and block further rollout
图 3:SBOM + provenance 的可信交付链。把“里面有什么”和“怎么来的”绑定到 digest 上,部署时验证,出事时可快速定位与止损。

5. 最小落地清单(让镜像从“能用”变成“可信”)

  1. 命名空间治理:按 org/project/repo 组织;prod 镜像入口受控。
  2. 权限收敛:CI 身份 push;人类默认只读;break-glass 必须审计。
  3. 不可变策略:关键 tags 禁止覆盖;交付引用 digest。
  4. 签名与验证:对 digest 签名;部署前验证;策略即代码拒绝不合规制品。
  5. SBOM/Provenance:生成并绑定到 digest;建立漏洞响应与阻断机制。
你现在应该能回答:
1) Registry 的治理边界是什么?写权限收敛到谁?prod 拉取怎么控?
2) 为什么签名必须签 digest 而不是 tag?验证在哪里做最有效?
3) SBOM 与 provenance 各回答什么问题?如何用于漏洞响应与阻断发布?
← 上一章:容器基础 1 下一章:Docker 实战(compose、本地交付与缓存) →