在 ACP(Alauda Container Platform)中,您可以使用 Tekton Pipeline 来构建镜像并扫描漏洞。
具体来说,使用 trivy
任务生成漏洞扫描结果,然后使用 cosign
上传漏洞扫描结果的证明,最后使用 kyverno
验证漏洞扫描结果的证明。
此方法使用类似 trivy 的工具扫描镜像漏洞,然后使用 Kyverno 验证漏洞扫描结果:
trivy
Tekton 任务扫描镜像漏洞。cosign
Tekton 任务上传漏洞扫描结果到镜像。以下场景需要参考本文档的指导:
kubectl
CLIcosign
CLI 工具jq
CLI 工具步骤 | 操作 | 说明 |
---|---|---|
1 | 生成签名密钥 | 使用 cosign 创建用于签名工件的密钥对 |
2 | 设置认证 | 配置镜像推送的仓库凭证 |
3 | 配置 Tekton Chains | 设置 Chains 使用 OCI 存储并配置签名,禁用 TaskRun SLSA Provenance |
4 | 创建示例流水线 | 创建包含 trivy 扫描器和 cosign 上传任务的流水线定义 |
5 | 运行示例流水线 | 创建并运行配置正确的 PipelineRun |
6 | 等待签名 | 等待 PipelineRun 被 Chains 签名 |
7 | 获取镜像信息 | 从 PipelineRun 中提取镜像 URI 和摘要 |
8 | (可选)获取漏洞证明 | 获取并验证漏洞扫描证明 |
9 | 使用 Kyverno 验证 | 创建并应用 Kyverno 策略验证漏洞扫描结果 |
10 | (可选)要求扫描时效 | 添加条件要求漏洞扫描结果必须在 168 小时内 |
11 | 清理资源 | 删除测试资源和策略 |
这些步骤与快速开始:签名溯源指南相同。请按照该指南中的说明操作:
这是一个 Pipeline 资源,用于构建镜像并生成 cosign 漏洞证明。
本教程通过在流水线内联生成 Dockerfile
和 git-clone
任务输出,演示了简化的工作流程。
在生产环境中,通常会:
git-clone
任务从代码仓库拉取源代码workspaces
:
signkey
:用于镜像签名的私钥和密码的工作空间。tasks
:
trivy-scanner
:扫描镜像漏洞的任务。cosign-uploads
:上传漏洞扫描结果证明的任务。保存为 chains-demo-4.yaml
文件,并执行:
这是一个 PipelineRun 资源,用于运行流水线。
workspaces
signkey
:签名密钥的 Secret 名称。
secret.secretName
:前一步获取签名密钥 Secret中准备的签名 Secret,但需要在 PipelineRun 所在命名空间创建新的 Secret。保存为 chains-demo-4.pipelinerun.yaml
文件,并执行:
等待 PipelineRun 完成。
等待 PipelineRun 拥有 chains.tekton.dev/signed: "true"
注解。
当 PipelineRun 拥有该注解时,表示镜像已被签名。
该镜像将用于验证漏洞扫描结果。
如果您对 cosign 漏洞证明内容感兴趣,可以继续阅读以下内容。
更多关于 cosign 漏洞证明的详情,请参考 cosign vuln attestation
根据获取签名公钥章节获取签名公钥。
输出类似如下,包含漏洞扫描结果。
predicateType
:谓词类型。predicate.scanner
:
uri
:扫描器的 URI。version
:扫描器版本。result
:漏洞扫描结果。
CreatedAt
:漏洞扫描完成时间。Metadata
:
OS
:
Family
:操作系统家族。Name
:操作系统名称。Results
:漏洞扫描结果。
Class
:
os-pkgs
:操作系统包。lang-pkgs
:语言包。Packages
:镜像中的包。Vulnerabilities
:镜像中的漏洞。
Severity
:漏洞严重等级。PkgID
:漏洞对应的包 ID。PkgName
:漏洞对应的包名。CVSS
:漏洞的 CVSS 评分。
nvd
:NVD 评分。redhat
:Red Hat 评分。此步骤需要集群管理员权限。
更多关于 Kyverno ClusterPolicy,请参考 Kyverno ClusterPolicy
策略如下:
spec.rules[0].verifyImages[].attestations[0].conditions
type
:cosign 漏洞证明类型为 https://cosign.sigstore.dev/attestation/vuln/v1
attestors
:同上conditions
:需要验证的条件
all
:所有条件必须满足
key: "{{ scanner.result.Results[].Vulnerabilities[].Severity }}"
:漏洞严重等级不能为 HIGH
或 CRITICAL
key: "{{ scanner.result.Results[].Vulnerabilities[?CVSS.redhat.V3Score >
1.0][] | length(@) }}"
:CVSS 分数大于 1.0 的漏洞数量必须为 0将策略保存为 kyverno.reject-high-risk-image.yaml
,并执行:
在定义策略的 policy
命名空间中,创建 Pod 以验证策略。
使用构建好的镜像创建 Pod。
如果镜像存在高风险漏洞,Pod 会被策略阻止。 输出类似如下:
将 ClusterPolicy
中的条件修改为允许存在高风险漏洞,但 CVSS 分数小于 10.0 的镜像。
然后再次创建 Pod 验证策略。
Pod 将成功创建。
如果您想为策略添加更多条件,可以继续阅读以下内容。
由于Cosign 漏洞扫描记录证明包含 scanFinishedOn
字段,
且 trivy
符合该规范,我们可以使用该字段判断漏洞扫描结果是否在 168 小时内。
只需在 ClusterPolicy
中添加条件,检查 scanFinishedOn
字段是否在 168 小时内。
此处不做演示,有兴趣的读者可自行尝试。
删除前面步骤创建的 Pod。
删除策略。
完成本指南后:
本指南为在 CI/CD 流水线中实现供应链安全提供了基础。在生产环境中,您应当: