基础镜像和SBOM验证
如果我们只允许部署特定类型的基础镜像, 可以在获取镜像后将该信息保存到镜像的attestation中。
在漏洞扫描与验证中,cosign-vuln格式的attestation已经包含了基础镜像信息。
但这里我们将采用不同的方法,使用syft为镜像生成SBOM。
SBOM信息同样包含基础镜像信息。
在ACP(Alauda Container Platform)中,可以使用Tekton Pipeline中的trivy或syft任务为镜像生成SBOM。
这里我们使用syft任务生成SBOM。
目录
功能概述使用场景前提条件流程概览详细步骤说明步骤1-3:基础环境搭建步骤4:创建示例流水线步骤5:运行示例流水线步骤6:等待PipelineRun被签名步骤7:从PipelineRun获取镜像信息步骤8:(可选)获取SBOM attestation步骤9:验证基础镜像信息步骤9.1:创建Kyverno策略验证基础镜像信息步骤9.2:验证策略步骤10:清理资源预期结果参考资料功能概述
该方法使用类似syft的工具为镜像生成SBOM,然后使用Kyverno验证SBOM:
- 使用
syftTekton任务为镜像生成SBOM并附加到镜像。 - 配置Kyverno规则验证SBOM。
- 使用该镜像创建Pod以验证SBOM。
使用场景
以下场景需要参考本文档的指导:
- 在Kubernetes集群中使用Kyverno实现基础镜像验证
- 强制安全策略,仅允许特定基础镜像部署
- 在CI/CD流水线中设置自动SBOM生成和验证
- 确保生产环境中基础镜像合规
- 通过验证基础镜像信息实现容器镜像供应链安全控制
前提条件
- 已安装Tekton Pipelines、Tekton Chains和Kyverno的Kubernetes集群
- 支持镜像推送的镜像仓库
- 已安装并配置好访问集群的
kubectlCLI - 已安装
cosignCLI工具 - 已安装
jqCLI工具
流程概览
详细步骤说明
步骤1-3:基础环境搭建
这些步骤与快速开始:签名溯源指南相同。请按照该指南完成:
- 步骤1:生成签名密钥
- 步骤2:设置认证
- 步骤3:配置Tekton Chains
- 获取签名secret
- 重要:此处仅为方便起见,使用了Chains的全局签名证书。实际使用中,可以使用单独证书签名镜像漏洞信息。
- 将secret导入流水线执行的命名空间。
步骤4:创建示例流水线
这是一个Pipeline资源,用于构建镜像并生成SBOM。
本教程通过在流水线内联生成Containerfile和git-clone任务输出,演示了简化的工作流。
在生产环境中,通常会:
- 使用
git-clone任务从代码仓库拉取源码 - 使用源码中的Containerfile构建镜像
- 这样可以确保版本控制的正确性,并保持代码与流水线配置的分离
YAML字段说明
- 与步骤4:创建示例流水线相同,但增加了:
workspaces:signkey:用于镜像签名的私钥和密码的工作空间。
tasks:syft-sbom:生成镜像SBOM并上传attestation的任务。 :::
保存为chains-demo-5.yaml文件并应用:
步骤5:运行示例流水线
这是一个PipelineRun资源,用于运行流水线。
:::details {title="YAML字段说明"}
- 与步骤5:运行示例流水线相同,仅介绍差异。
workspacessignkey:签名密钥的secret名称。secret.secretName:前面步骤中准备的签名secret名称获取签名secret。但需要创建与流水线运行相同命名空间的新secret。 :::
保存为chains-demo-5.pipelinerun.yaml文件并应用:
等待PipelineRun完成。
步骤6:等待PipelineRun被签名
等待PipelineRun带有chains.tekton.dev/signed: "true"注解。
当PipelineRun带有chains.tekton.dev/signed: "true"注解时,表示镜像已被签名。
步骤7:从PipelineRun获取镜像信息
该镜像将用于验证SBOM。
步骤8:(可选)获取SBOM attestation
如果您对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:工具版本。 :::
步骤9:验证基础镜像信息
步骤9.1:创建Kyverno策略验证基础镜像信息
此步骤需要集群管理员权限。
关于Kyverno ClusterPolicy的更多信息,请参考Kyverno ClusterPolicy
策略如下:
:::details {title="YAML字段说明"}
- 策略与镜像签名验证中的大致相同。
spec.rules[0].verifyImages[].attestations[0].conditionstype:cyclonedx SBOM attestation类型为https://cyclonedx.org/bomattestors:同上。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文件并应用:
步骤9.2:验证策略
在定义策略的policy命名空间中,创建Pod以验证策略。
使用构建好的镜像创建Pod。
如果基础镜像是Ubuntu 22.04或24.04,Pod将成功创建。
将ClusterPolicy中的条件改为只允许Alpine 3.18或3.20。
然后创建Pod验证策略。
会收到如下输出:
步骤10:清理资源
删除前面步骤中创建的Pod。
删除策略。
预期结果
完成本指南后:
- 已成功搭建Tekton Chains用于SBOM生成,Kyverno用于基础镜像验证
- 容器镜像自动包含SBOM信息的attestation
- 仅允许指定基础镜像的镜像在指定命名空间中部署
- 不合规基础镜像的镜像被Kyverno策略自动阻止
- 通过验证容器镜像的基础镜像信息,实现了基础的供应链安全控制
本指南为在CI/CD流水线中实现供应链安全提供了基础。在生产环境中,您应当:
- 配置合理的命名空间隔离和访问控制
- 实施安全的密钥管理策略
- 设置策略违规的监控和告警
- 定期轮换签名密钥并更新安全策略