在 Tekton Chains 中,可以自动为构建的镜像生成签名,并将签名记录在 SLSA Provenance 中。
该方法使用 Tekton Chains 自动为构建的镜像生成签名,然后使用 cosign 或 Kyverno 验证签名:
buildah
Tekton Task 构建镜像。cosign
CLI 验证签名。相比于 Quick Start: Signed Provenance,此方法仅增加了更多的验证步骤。
以下场景需要参考本文档的指导:
kubectl
CLIcosign
CLI 工具jq
CLI 工具步骤 | 操作 | 说明 |
---|---|---|
1 | 生成签名密钥 | 使用 cosign 创建用于签名工件的密钥对 |
2 | 设置认证 | 配置镜像推送的仓库凭证 |
3 | 配置 Tekton Chains | 设置 Chains 使用 OCI 存储并配置签名 |
4 | 创建示例流水线 | 创建包含必要任务和工作空间的流水线定义 |
5 | 运行示例流水线 | 创建并运行配置正确的 PipelineRun |
6 | 等待签名 | 等待 PipelineRun 被 Chains 签名 |
7 | 获取镜像信息 | 从 PipelineRun 中提取镜像 URI 和摘要 |
8 | 使用 Kyverno 验证签名 | 配置并使用 Kyverno 策略验证镜像签名 |
9 | 清理资源 | 删除测试 Pod 和策略 |
这些步骤与 Quick Start: Signed Provenance 指南完全相同。请按照该指南中的说明完成:
在 步骤 8:验证镜像和证明 中,我们使用 cosign
CLI 验证签名。
这里我们改用 Kyverno 来验证签名。
此步骤需要集群管理员权限。
关于 Kyverno ClusterPolicy 的更多详情,请参考 Kyverno ClusterPolicy
策略内容如下:
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-secrets
Secret 中的 cosign.pub
公钥相同。ctlog
:验证者的 ctlog。
ignoreSCT
:是否忽略 SCT。
rekor
:验证者的 rekor。
ignoreTlog
:是否忽略 Tlog。
需调整的配置
spec.rules[].attestors[].entries[].keys.publicKeys
:签名者的公钥。
signing-secrets
Secret 中的 cosign.pub
公钥相同。保存为名为 kyverno.only-cosign-image-deploy.yaml
的 yaml 文件,并通过以下命令应用:
在定义策略的 policy
命名空间中,创建一个 Pod 来验证该策略。
使用流水线创建的已签名镜像创建 Pod。
Pod 会成功创建。
使用未签名镜像创建 Pod。
收到如下输出,表示 Pod 被策略阻止。
删除前面步骤中创建的 Pods。
删除策略。
完成本指南后:
本指南为在 CI/CD 流水线中实现供应链安全提供了基础。在生产环境中,您应当: