Image Signature Verification
在 Tekton Chains 中,可以自动为构建的镜像生成签名,并将签名记录在 SLSA Provenance 中。
目录
功能概述使用场景前提条件流程概览逐步操作说明步骤 1-7:基础设置步骤 8:使用 Kyverno 验证签名步骤 8.1:创建 Kyverno 策略,仅允许已签名镜像部署步骤 8.2:验证策略步骤 9:清理资源预期结果参考资料功能概述
该方法使用 Tekton Chains 自动为构建的镜像生成签名,然后使用 cosign 或 Kyverno 来验证签名:
- 配置 Tekton Chains 自动为构建的镜像生成签名。
- 使用
buildahTekton Task 构建镜像。 - (可选)使用
cosignCLI 验证签名。 - 配置 Kyverno 规则,仅允许已签名的镜像。
- 使用该镜像创建 Pod 以验证签名。
TIP
相比于快速入门:签名的 Provenance,该方法仅增加了更多的验证步骤。
使用场景
以下场景需要参考本文档中的指导:
- 在 Kubernetes 集群中使用 Kyverno 实现镜像签名验证
- 强制安全策略,仅允许部署已签名的镜像
- 在 CI/CD 流水线中设置自动化的镜像签名验证
- 确保生产环境中镜像的完整性和真实性
- 为容器镜像实施供应链安全控制
前提条件
- 已安装 Tekton Pipelines、Tekton Chains 和 Kyverno 的 Kubernetes 集群
- 支持镜像推送的镜像仓库
- 已安装并配置好访问集群的
kubectlCLI - 已安装
cosignCLI 工具 - 已安装
jqCLI 工具
流程概览
逐步操作说明
步骤 1-7:基础设置
这些步骤与快速入门:签名的 Provenance指南完全相同。请按照该指南中的说明完成:
- 步骤 1:生成签名密钥
- 步骤 2:设置认证
- 步骤 3:配置 Tekton Chains
- 步骤 4:创建示例流水线
- 步骤 5:运行示例流水线
- 步骤 6:等待 PipelineRun 被签名
- 步骤 7:从 PipelineRun 获取镜像
步骤 8:使用 Kyverno 验证签名
在步骤 8:验证镜像和证明中,我们使用 cosign CLI 验证签名。
这里我们使用 Kyverno 来验证签名。
步骤 8.1:创建 Kyverno 策略,仅允许已签名镜像部署
TIP
此步骤需要集群管理员权限。
有关 Kyverno ClusterPolicy 的更多详情,请参见 Kyverno ClusterPolicy
策略如下:
:::details {title="YAML 字段说明"}
spec.rules[].match.any[].resources:匹配并验证的资源。kinds:匹配并验证的资源类型。Pod:Pod 资源。
namespaces:匹配并验证的资源所在命名空间。policy:匹配并验证policy命名空间中的资源。
spec.rules[].verifyImages:需要验证的镜像imageReferences:需要验证的镜像引用。*:验证所有镜像引用。<registry>/test/*:仅验证<registry>/test仓库中的镜像引用。
skipImageReferences:跳过验证的镜像引用。ghcr.io/trusted/*:跳过ghcr.io/trusted仓库中的镜像引用。
imageRegistryCredentials:allowInsecureRegistry:是否允许不安全的仓库。secrets:用于镜像仓库凭证的 Secret。registry-credentials:Secret 名称,需存在于 Kyverno 部署的命名空间中。
attestors:用于镜像验证的验证者。count:需要匹配的验证者数量。entries:验证者条目。keys:验证者的密钥。publicKeys:验证者的公钥。- 该公钥与
signing-secretsSecret 中的公钥cosign.pub相同。
- 该公钥与
ctlog:验证者的 ctlog。ignoreSCT:是否忽略 SCT。- 在隔离网络环境中,先忽略 SCT。
rekor:验证者的 rekor。ignoreTlog:是否忽略 Tlog。- 在隔离网络环境中,先忽略 Tlog。 :::
需要调整配置
spec.rules[].attestors[].entries[].keys.publicKeys:签名者的公钥。- 该公钥与
signing-secretsSecret 中的公钥cosign.pub相同。 - 公钥可从获取签名公钥部分获得。
- 该公钥与
保存为名为 kyverno.only-cosign-image-deploy.yaml 的 yaml 文件,并使用以下命令应用:
步骤 8.2:验证策略
在定义策略的 policy 命名空间中,创建一个 Pod 来验证该策略。
使用流水线创建的已签名镜像创建 Pod。
Pod 会成功创建。
使用未签名镜像创建 Pod。
收到如下输出,表示 Pod 被策略阻止。
步骤 9:清理资源
删除前面步骤中创建的 Pods。
删除策略。
预期结果
完成本指南后:
- 您已成功搭建了使用 Tekton Chains 进行镜像签名和 Kyverno 进行签名验证的环境
- 容器镜像在构建过程中会自动签名
- 仅允许已签名的镜像在指定命名空间中部署
- 未签名镜像会被 Kyverno 策略自动阻止
- 您已实现了容器镜像的基础供应链安全控制
本指南为在 CI/CD 流水线中实施供应链安全提供了基础。在生产环境中,您应当:
- 配置合适的命名空间隔离和访问控制
- 实施安全的签名密钥管理
- 设置策略违规的监控和告警
- 定期轮换签名密钥并更新安全策略
- 考虑实施额外的安全控制,如漏洞扫描