Kyverno CLI镜像bundle验证通过但策略执行失败,求排查原因
我正尝试配置Kyverno ClusterPolicy以阻止无attestation的镜像,代码托管于github仓库whoissqr/cg-test-keyless-sign。
我的ClusterPolicy配置
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: check-image-keyless spec: validationFailureAction: Enforce failurePolicy: Fail background: false webhookTimeoutSeconds: 30 rules: - name: check-image-keyless match: any: - resources: kinds: - Pod verifyImages: - verifyDigest: false imageReferences: - "ghcr.io/whoissqr/cg-test-keyless-sign:latest" attestors: - entries: - keyless: subject: "https://github.com/whoissqr/cg-test-keyless-sign/.github/workflows/main.yml@refs/heads/main" issuer: "https://token.actions.githubusercontent.com" rekor: url: https://rekor.sigstore.dev
执行命令及现象
执行命令:kubectl get clusterpolicies -o yaml | kyverno apply - --resource ./k3s/pod.yaml -v 5
输出显示cosign已验证镜像(bundleVerified=true)、镜像证明者验证成功,但结果仍显示fail:1,单独使用cosign验证该镜像可通过,请问这个失败项具体是什么原因?
可能的原因及解决方法
未指定要验证的Attestation类型:
默认情况下Kyverno的verifyImages仅验证镜像签名,若要验证attestation(证明),必须显式添加attestations字段指定对应的predicate类型。GitHub Actions生成的SLSA证明通常使用https://slsa.dev/provenance/v0.2,补充该配置后Kyverno才能正确识别并验证attestation:verifyImages: - verifyDigest: false imageReferences: - "ghcr.io/whoissqr/cg-test-keyless-sign:latest" attestors: - entries: - keyless: subject: "https://github.com/whoissqr/cg-test-keyless-sign/.github/workflows/main.yml@refs/heads/main" issuer: "https://token.actions.githubusercontent.com" rekor: url: https://rekor.sigstore.dev # 添加以下attestations配置 attestations: - predicateType: "https://slsa.dev/provenance/v0.2"镜像引用匹配异常:
确认pod.yaml中的镜像地址与policy里imageReferences的内容完全一致(包括tag、域名拼写)。若pod使用了镜像摘要而非tag,即使verifyDigest: false,也可能导致Kyverno无法正确关联验证规则,可尝试将policy中的镜像引用改为带摘要的形式,或统一使用tag。Kyverno版本兼容性问题:
部分旧版本Kyverno对cosign keyless验证、attestation处理存在bug,建议升级到最新稳定版,同时查看对应版本的官方文档确认特性支持情况。日志细节遗漏:
虽然启用了-v 5日志,可重点排查Kyverno在镜像验证后的规则评估阶段输出,确认是否有其他隐含的规则约束触发失败,比如是否存在其他未注意到的验证条件。
内容的提问来源于stack exchange,提问作者sqr

