构建系统来源验证
在 SLSA provenance 中,有一个 builder.id 字段,用于指示镜像的构建环境。
在本文档中,我们将使用此 builder.id 字段验证镜像。
由于 Tekton Chains 已在准备阶段完成镜像签名和 SLSA provenance 生成,我们可以直接复用 快速入门:签名来源 中的流程和镜像。
本文档将重点介绍如何验证 SLSA provenance。
目录
功能概述使用场景前提条件流程概述分步说明步骤 1-7:(可选)基本设置步骤 8:(可选)使用 cosign 验证构建器信息方式 1:使用 CUE 进行验证方式 2:使用 Rego 进行验证步骤 9:使用 Kyverno 验证签名步骤 9.1:创建 Kyverno 策略,仅允许部署在指定构建环境中构建的镜像步骤 9.2:验证策略步骤 10:清理资源预期结果参考功能概述
此方法使用 Chains 自动为构建的镜像生成 SLSA Provenance,然后使用 Kyverno 验证该 provenance:
- 配置 Tekton Chains,自动为构建的镜像生成 SLSA Provenance。
- 使用
buildahTekton Task 构建镜像。 - (可选)使用
cosignCLI 验证证明。 - 配置 Kyverno 规则以验证证明。
- 使用该镜像创建 Pod,以验证证明。
使用场景
以下场景需要参考本文档中的指导:
- 使用 SLSA provenance 验证容器镜像的构建环境
- 使用 CUE 或 Rego 策略实现构建系统来源验证
- 强制执行安全策略,仅允许部署在特定构建环境中构建的镜像
- 在 CI/CD 流水线中设置自动化构建系统来源验证
- 确保生产环境中构建系统来源的完整性和真实性
前提条件
- 已安装 Tekton Pipelines、Tekton Chains 和 Kyverno 的 Kubernetes 集群
- 已启用镜像推送功能的 registry
- 已安装并配置
kubectlCLI,可访问您的集群 - 已安装
cosignCLI 工具 - 已安装
jqCLI 工具
流程概述
分步说明
步骤 1-7:(可选)基本设置
如果更改 builder.id 字段,则需要重新运行流水线以生成镜像。
因为旧镜像未使用新的 builder.id 进行签名,所以会被策略阻止。
否则,可以跳过此步骤,使用旧镜像验证策略。
这些步骤与快速入门:签名的来源证明指南完全相同。请按照该指南中的说明完成以下操作:
-
如果要更改默认的
builder.id,可以调整TektonConfig中config的builder.id字段。TIP此过程需要平台管理员权限才能进行配置。
步骤 8:(可选)使用 cosign 验证构建器信息
此步骤为可选步骤,在需要使用 cosign 验证镜像构建器的真实性时执行。
如果您对如何使用 CUE 或 Rego 验证构建器信息感兴趣,可以继续阅读以下内容。
根据获取签名公钥部分获取签名公钥。
Cosign 提供了两种验证证明的方式:
下面将介绍这两种方式的验证方法。
方式 1:使用 CUE 进行验证
生成用于验证构建器信息的 CUE 文件。
将 CUE 文件保存到 builder.cue
使用 cosign 验证构建器信息。
如果收到如下输出,则表示构建器信息验证成功。
将 builder.cue 文件中的构建器 ID 更改为其他值 https://alauda.io/builders/tekton/v2,然后再次进行验证。
如果收到如下输出,则表示构建器信息验证失败。
方式 2:使用 Rego 进行验证
生成用于验证构建器信息的 Rego 文件。
将 Rego 文件保存到 builder.rego
使用 cosign 验证构建器信息。
如果收到如下输出,则表示构建器信息验证成功。
将 builder.rego 文件中的构建器 ID 更改为其他值 https://alauda.io/builders/tekton/v2,然后再次进行验证。
如果收到如下输出,则表示构建器信息验证失败。
步骤 9:使用 Kyverno 验证签名
此步骤需要集群管理员权限。
来源证明的内容大致如下,我们将使用 builder.id 字段验证构建环境。
步骤 9.1:创建 Kyverno 策略,仅允许部署在指定构建环境中构建的镜像
有关 Kyverno ClusterPolicy 的更多详细信息,请参阅 Kyverno ClusterPolicy
策略如下:
Explanation of YAML fields
- 该策略与镜像签名验证中的策略基本一致。下面仅介绍其中的差异。
spec.rules[0].verifyImages[].attestations[0].conditionstype:SLSA 来源证明类型为https://slsa.dev/provenance/v0.2或https://slsa.dev/provenance/v1。attestors:与上述相同。conditions:要验证的条件。all:必须满足所有条件。key: "{{ builder.id }}":检查证明中的builder.id字段是否等于https://alauda.io/builders/tekton/v1
需要调整的配置
spec.rules[].attestors[].entries[].keys.publicKeys:签名者的公钥。- 此公钥与
signing-secretssecret 中的公钥cosign.pub相同。 - 可以从获取签名公钥部分获取公钥。
- 此公钥与
将策略保存到名为 kyverno.verify-tekton-built-images.yaml 的 yaml 文件中,并使用以下命令应用:
步骤 9.2:验证策略
在定义策略的 policy 命名空间中创建 Pod,以验证策略。
使用构建的镜像创建 Pod。
Pod 将成功创建。
将 ClusterPolicy 中的构建器 ID 更改为其他值 https://alauda.io/builders/tekton/v2,然后再次进行验证。
如果收到如下输出,则表示 Pod 已被策略阻止。
步骤 10:清理资源
删除前面步骤中创建的 Pod。
删除策略。
预期结果
完成本指南后:
- 您将拥有一个可正常运行的 Tekton Chains 设置,用于生成 SLSA provenance
- 您的容器镜像将在构建过程中自动使用 build system provenance 进行签名
- 您可以使用 CUE 或 Rego 策略验证镜像的构建环境
- 只有在指定构建环境中构建的镜像才能部署到指定命名空间
- 在未经授权的构建环境中构建的镜像将被 Kyverno 策略自动阻止
- 您已为容器镜像实施基本的 build system provenance verification 控制
本指南为在 CI/CD 流水线中实施 build system provenance verification 奠定了基础。在生产环境中,您应:
- 配置适当的命名空间隔离和访问控制
- 为签名密钥实施安全的密钥管理
- 设置策略违规的监控和告警
- 定期轮换签名密钥并更新安全策略
- 考虑实施其他安全控制,例如漏洞扫描