使用策略验证构建输入
使用 Docker 进行构建通常涉及下载远程资源。这些外部依赖(例如 Docker 镜像、Git 仓库、远程文件以及其他制品)被称为构建输入(build inputs)。
例如:
- 从镜像仓库拉取镜像
- 克隆源代码仓库
- 通过 HTTPS 从服务器获取文件
在消费构建输入时,验证内容是否符合预期是一个好主意。一种方法是为 ADD Dockerfile 指令使用 --checksum 选项。这让你可以在将远程资源拉入构建时验证其 SHA256 校验和:
ADD --checksum=sha256:c0ff3312345… https://example.com/archive.tar.gz /如果远程的 archive.tar.gz 文件与 Dockerfile 期望的校验和不匹配,构建将失败。
校验和可以验证内容是否符合预期,但仅限于 ADD 指令。它们无法告诉你内容的来源或生成方式。你无法使用校验和来强制执行"镜像必须已签名"或"依赖项必须来自已批准的来源"之类的约束。
构建策略(build policies)解决了这个问题。它们让你能够定义规则,用于验证所有的构建输入,并在整个构建过程中强制执行诸如来源证明(provenance attestations)、已批准的镜像仓库以及已签名的 Git 标签等要求。
先决条件
构建策略目前是一项实验性功能。要试用它,你需要:
- Buildx 0.31.0 或更高版本 - 检查你的版本:
docker buildx version - BuildKit 0.27.0 或更高版本 - 通过以下命令验证:
docker buildx inspect --bootstrap
如果你使用的是 Docker Desktop,请确保你使用的版本包含这些更新。
构建策略(Build policies)
Buildx 0.31.0 版本新增了对构建策略的支持。构建策略是用于保障 Docker 构建供应链安全的规则,有助于防范上游被入侵、恶意依赖项以及构建输入被未授权篡改。
构建策略让你能够在用于构建项目的输入上强制执行扩展验证,例如:
- Docker 镜像必须使用摘要引用(不能仅使用标签)
- 镜像必须具有来源证明和 cosign 签名
- Git 标签由维护者使用 PGP 公钥签名
- 所有远程制品必须使用 HTTPS 并包含用于验证的校验和
构建策略使用一种声明式策略语言(称为 Rego)定义,该语言为 Open Policy Agent (OPA) 而创建。以下示例展示了一个最小的 Rego 构建策略。
package docker
default allow := false
# 允许此构建的任何本地输入
# 例如:本地构建上下文,或本地 Dockerfile
allow if input.local
# 允许镜像,但仅当它们具有来源证明时
allow if {
input.image.hasProvenance
}
decision := {"allow": allow}如果与此策略关联的 Dockerfile 在 FROM 指令中引用了没有来源证明的镜像,该策略就会被违反,构建将失败。
策略工作原理(How policies work)
当你运行 docker buildx build 时,Buildx 会:
- 解析所有构建输入(镜像、Git 仓库、HTTP 下载)
- 查找与你的 Dockerfile 名称匹配的策略文件(例如
Dockerfile.rego) - 在构建开始之前,针对策略对每个输入进行评估
- 仅当所有输入都通过策略时才允许构建继续
策略使用 Rego(Open Policy Agent 的策略语言)编写。你不需要是 Rego 专家——简介 教程会教你所需的一切。
策略文件与你的 Dockerfile 放在一起:
project/
├── Dockerfile
├── Dockerfile.rego
└── src/无需额外配置——Buildx 在构建时会自动查找并加载策略。
使用场景(Use cases)
构建策略可帮助你针对 Docker 构建强制执行安全和合规要求。策略能提供价值的常见场景:
强制执行基础镜像标准
要求所有生产 Dockerfile 使用特定的、已批准的基础镜像(带摘要引用)。防止开发者使用未经安全团队审查的任意镜像。
验证第三方依赖项
当你的构建从互联网下载文件、库或工具时,验证它们来自受信任的来源,并与预期的校验和或签名相匹配。这可以防止上游依赖项被入侵的供应链攻击。
确保签名的发布版本
要求所有依赖项具有来自受信任方的有效签名。
- 检查你在构建中克隆的 Git 仓库的 GPG 签名
- 使用 Sigstore 验证来源证明签名
满足合规要求
某些监管框架要求提供你验证构建输入的证明。构建策略为你提供了一种可审计的、声明式的方式来证明你正在根据安全标准检查依赖项。
区分开发与生产规则
对生产构建应用更严格的验证,同时在开发期间允许更大的灵活性。同一个策略文件可以根据构建上下文或目标包含条件规则。
开始使用(Get started)
准备好开始编写策略了吗?简介 教程将引导你创建第一个策略,并教授你所需的 Rego 基础知识。
有关实际使用指南,请参阅 使用构建策略。
有关可供复制和改编的实用示例,请参阅 示例策略 库。