如果我们只允许部署特定类型的基础镜像, 可以在获取镜像后将该信息保存到镜像的attestation中。
在漏洞扫描与验证中,cosign-vuln
格式的attestation已经包含了基础镜像信息。
但这里我们将采用不同的方法,使用syft
为镜像生成SBOM。
SBOM信息同样包含基础镜像信息。
在ACP(Alauda Container Platform)中,可以使用Tekton Pipeline中的trivy
或syft
任务为镜像生成SBOM。
这里我们使用syft任务生成SBOM。
该方法使用类似syft的工具为镜像生成SBOM,然后使用Kyverno验证SBOM:
syft
Tekton任务为镜像生成SBOM并附加到镜像。以下场景需要参考本文档的指导:
kubectl
CLIcosign
CLI工具jq
CLI工具步骤 | 操作 | 说明 |
---|---|---|
1 | 生成签名密钥 | 使用cosign创建用于签名工件的密钥对 |
2 | 设置认证 | 配置镜像仓库凭证以支持镜像推送 |
3 | 配置Tekton Chains | 设置Chains使用OCI存储并配置签名,禁用TaskRun SLSA Provenance |
4 | 创建示例流水线 | 创建包含syft任务生成SBOM的流水线定义 |
5 | 运行示例流水线 | 创建并运行配置正确的PipelineRun |
6 | 等待签名 | 等待PipelineRun被Chains签名 |
7 | 获取镜像信息 | 从PipelineRun中提取镜像URI和摘要 |
8 | (可选)获取SBOM attestation | 获取并验证SBOM attestation |
9 | 使用Kyverno验证 | 创建并应用Kyverno策略验证基础镜像信息 |
10 | 清理 | 删除测试资源和策略 |
这些步骤与快速开始:签名溯源指南完全相同。请按照该指南完成:
这是一个Pipeline资源,用于构建镜像并生成SBOM。
本教程通过在流水线内联生成Dockerfile
和git-clone
任务输出,演示了简化的工作流。
在生产环境中,通常会:
git-clone
任务从代码仓库拉取源代码workspaces
:
signkey
:用于镜像签名的私钥和密码的工作空间。tasks
:
syft-sbom
:生成镜像SBOM并上传attestation的任务。
:::保存为chains-demo-5.yaml
文件并应用:
这是一个PipelineRun资源,用于运行流水线。
:::details {title="YAML字段说明"}
workspaces
signkey
:签名密钥的Secret名称。
secret.secretName
:前面步骤获取签名密钥中准备的签名Secret,但需在流水线运行的命名空间中创建新的Secret。
:::保存为chains-demo-5.pipelinerun.yaml
文件并应用:
等待PipelineRun完成。
等待PipelineRun带有chains.tekton.dev/signed: "true"
注解。
当PipelineRun带有该注解时,表示镜像已被签名。
该镜像将用于验证SBOM。
如果您对SBOM attestation内容感兴趣,可以继续阅读以下内容。
关于cyclonedx SBOM attestation的更多细节,请参考cyclonedx SBOM attestation
根据获取签名公钥章节获取签名公钥。
输出类似如下,包含镜像的组件信息。
:::details {title="cyclonedx SBOM attestation"}
:::details {title="字段说明"}
predicateType
:谓词类型。predicate
:
components
:镜像组件。
bom-ref
:组件的BOM引用。licenses
:组件的许可证。
license
:许可证信息。
name
:许可证名称。id
:许可证ID。name
:组件名称。type
:组件类型。version
:组件版本。metadata
:镜像元数据。
timestamp
:时间戳。tools
:
components
:工具组件。
author
:工具作者。name
:工具名称。type
:工具类型。version
:工具版本。
:::此步骤需要集群管理员权限。
关于Kyverno ClusterPolicy的更多信息,请参考Kyverno ClusterPolicy
策略如下:
:::details {title="YAML字段说明"}
spec.rules[0].verifyImages[].attestations[0].conditions
type
:cyclonedx SBOM attestation类型为https://cyclonedx.org/bom
attestors
:同上。conditions
:需验证的条件。
any
:满足任一条件即可。
key: "{{ components[?type=='operating-system'] | [?name=='ubuntu' && (version=='22.04' || version=='24.04')] | length(@) }}"
:操作系统必须是Ubuntu 22.04或24.04。key: "{{ components[?type=='operating-system'] | [?name=='alpine' && (version=='3.18' || version=='3.20')] | length(@) }}"
:操作系统必须是Alpine 3.18或3.20。
:::将策略保存为kyverno.verify-base-image.yaml
文件并应用:
在定义策略的policy
命名空间中,创建Pod以验证策略。
使用构建好的镜像创建Pod。
如果基础镜像是Ubuntu 22.04或24.04,Pod将成功创建。
将ClusterPolicy
中的条件改为只允许Alpine 3.18或3.20。
然后创建Pod验证策略。
会收到如下输出:
删除前面步骤创建的Pod。
删除策略。
完成本指南后:
本指南为在CI/CD流水线中实现供应链安全提供了基础。在生产环境中,您应当: