如果我们只允许部署特定类型的基础镜像, 可以在获取镜像后将该信息保存到镜像证明中。
在漏洞扫描和验证中,cosign-vuln
格式的证明已经包含了基础镜像信息。
但这里我们将采用不同的方法,使用 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 证明 | 获取并验证 SBOM 证明 |
9 | 使用 Kyverno 验证 | 创建并应用 Kyverno 策略验证基础镜像信息 |
10 | 清理资源 | 删除测试资源和策略 |
这些步骤与快速开始:签名溯源指南相同。请按照该指南完成:
这是一个 Pipeline 资源,用于构建镜像并生成 SBOM。
本教程通过在流水线内联生成 Dockerfile
和 git-clone
任务输出,演示了简化的工作流。
在生产环境中,通常会:
git-clone
任务从代码仓库拉取源代码workspaces
:
signkey
:用于镜像签名的私钥和密码的工作区。tasks
:
syft-sbom
:生成镜像 SBOM 并上传证明的任务。
:::保存为 chains-demo-5.yaml
文件并应用:
这是一个 PipelineRun 资源,用于运行流水线。
:::details {title="YAML 字段说明"}
workspaces
signkey
:签名密钥的 Secret 名称。
secret.secretName
:前面步骤中准备的签名 Secret 名称 获取签名密钥 Secret。但需要创建与流水线运行相同命名空间的新 Secret。
:::保存为 chains-demo-5.pipelinerun.yaml
文件并应用:
等待 PipelineRun 完成。
等待 PipelineRun 带有 chains.tekton.dev/signed: "true"
注解。
当 PipelineRun 带有该注解时,表示镜像已签名。
该镜像将用于验证 SBOM。
如果您对 SBOM 证明内容感兴趣,可以继续阅读以下内容。
有关 cyclonedx SBOM 证明的更多详情,请参考 cyclonedx SBOM attestation
根据获取签名公钥章节获取签名公钥。
输出类似如下,包含镜像的组件信息。
:::details {title="cyclonedx SBOM 证明"}
:::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 证明类型为 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 流水线中实现供应链安全提供了基础。在生产环境中,应: