镜像签名验证
在 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 集群
- 已启用镜像推送的 registry
- 已安装并配置好可访问集群的
kubectlCLI - 已安装
cosignCLI 工具 - 已安装
jqCLI 工具
流程概览
分步说明
步骤 1-7:基础设置
这些步骤与 快速开始:已签名 Provenance 指南完全相同。请按照该指南中的说明完成以下步骤:
- 步骤 1:生成签名密钥
- 步骤 2:设置认证
- 步骤 3:配置 Tekton Chains
- 步骤 4:创建示例 Pipeline
- 步骤 5:运行示例 Pipeline
- 步骤 6:等待 PipelineRun 完成签名
- 步骤 7:从 PipelineRun 获取镜像
步骤 8:使用 Kyverno 验证签名
在 步骤 8:验证镜像和 Attestation 中,我们使用 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>/testregistry 中的镜像引用。
skipImageReferences:要跳过的镜像引用。ghcr.io/trusted/*:仅跳过ghcr.io/trustedregistry 中的镜像引用。
imageRegistryCredentials:allowInsecureRegistry:是否允许不安全的 registry。secrets:用于镜像 registry 凭证的 secrets。registry-credentials:secret 的名称。该 secret 需要存在于部署 kyverno 的命名空间中。
attestors:用于镜像验证的 attestors。count:需要匹配的 attestors 数量。entries:attestors 的条目。keys:attestors 的密钥。publicKeys:attestors 的公钥。- 此公钥与
signing-secretssecret 中的公钥cosign.pub相同。
- 此公钥与
ctlog:attestors 的 ctlog。ignoreSCT:是否忽略 SCT。- 在隔离网络环境中,首先忽略 SCT。
rekor:attestors 的 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 来验证该策略。
使用 pipeline 创建的已签名镜像来创建 Pod。
Pod 将成功创建。
使用未签名镜像创建 Pod。
如果收到如下输出,则表示 Pod 被策略阻止。
步骤 9:清理资源
删除前面步骤创建的 Pod。
删除策略。
预期结果
完成本指南后:
- 你已经配置好用于镜像签名的 Tekton Chains 和用于签名验证的 Kyverno
- 容器镜像会在构建过程中自动签名
- 只有已签名的镜像才能在指定命名空间中部署
- 未签名的镜像会被 Kyverno 策略自动阻止
- 你已经为容器镜像实现了基础的供应链安全控制
本指南为在 CI/CD 流水线中实现供应链安全提供了基础。在生产环境中,你应该:
- 配置适当的命名空间隔离和访问控制
- 为签名密钥实现安全的密钥管理
- 为策略违规设置监控和告警
- 定期轮换签名密钥并更新安全策略
- 考虑实现额外的安全控制,例如漏洞扫描