License Compliance Verification
在 ACP (Alauda Container Platform) 中,您可以使用 Tekton Pipeline 中的 trivy 或 syft 任务为镜像生成 SBOM。
SBOM 包含镜像中每个组件的许可证信息。
我们可以使用 Kyverno 策略拒绝包含特定许可证的镜像。
由于在基础镜像和 SBOM 验证中已经为镜像生成了 SBOM,这里不再创建流水线,而是直接使用已有镜像来验证此功能。
本章节基于基础镜像和 SBOM 验证,仅增加了验证镜像许可证信息的逻辑。
目录
功能概述
此方法与基础镜像和 SBOM 验证类似,仅更改 Kyverno 规则以验证许可证合规性。
- 配置 Kyverno 规则以验证 SBOM。
- 使用镜像创建 Pod 以验证许可证合规性。
使用场景
以下场景需要参考本文档的指导:
- 在 Kubernetes 集群中使用 Kyverno 实现许可证合规性验证
- 强制执行安全策略,阻止包含特定许可证(如 GPL)的镜像
- 在 CI/CD 流水线中设置自动许可证验证
- 确保生产环境中的许可证合规性
- 通过验证容器镜像中组件的许可证,实现供应链安全控制
前提条件
- 已完成基础镜像和 SBOM 验证。
流程概览
详细步骤
步骤 1:验证镜像的许可证信息
步骤 1.1:创建 Kyverno 策略以验证基础镜像信息
此步骤需要集群管理员权限。
有关 Kyverno ClusterPolicy 的更多详情,请参阅 Kyverno ClusterPolicy
策略如下:
YAML 字段说明
- 此策略与镜像签名验证中的策略大致相同
spec.rules[0].verifyImages[].attestations[0].conditionstype:cyclonedx SBOM 认证类型为https://cyclonedx.org/bomattestors:同上。conditions:需要验证的条件。any:满足任一条件即可。key: "{{ components[].licenses[].license.id }}":镜像包含不允许的 GPL 许可证。key: "{{ components[].licenses[].license.name }}":镜像包含不允许的 Expat 许可证。
将策略保存为 kyverno.verify-component-licenses.yaml 文件,并使用以下命令应用:
步骤 1.2:验证策略
在定义策略的 policy 命名空间中,创建 Pod 以验证策略。
使用构建好的镜像创建 Pod。
如果镜像包含 GPL 许可证,Pod 创建将失败。
会收到如下输出:
修改 ClusterPolicy 中的许可证限制以允许 GPL 许可证。
然后创建 Pod 验证策略。
Pod 将成功创建。
步骤 2:(可选)验证镜像是否存在 CVE-2022-42889
- 如果您有兴趣向策略添加更多条件,可以继续阅读以下内容。
- 这是一个简单示例,您可以用相同方法检查其他漏洞。
CVE-2022-42889 是 Apache Commons Text 库中的一个严重漏洞,可能导致任意代码执行,影响版本为 1.5 到 1.9。通过在 SBOM 中识别受影响版本的 "commons-text" 包,可以检测受影响的包。此策略检查指定在 imageReferences 下的镜像的 CycloneDX 格式的认证 SBOM,如果包含 commons-text 包的 1.5-1.9 版本,则拒绝该镜像。
我们只需在 ClusterPolicy 中添加一个条件,检查镜像中是否存在 commons-text 包。
此处不做演示,有兴趣的读者可自行尝试。
步骤 3:清理资源
删除前面步骤中创建的 Pod。
删除策略。
预期结果
完成本指南后:
- 您已成功配置 Kyverno 进行许可证合规性验证
- 您的容器镜像自动在其认证中包含 SBOM 信息
- 只有符合许可证要求的镜像能在指定命名空间中部署
- 不合规许可证的镜像会被 Kyverno 策略自动阻止
- 您已通过验证容器镜像组件的许可证信息,实现了基础的供应链安全控制
本指南为在 CI/CD 流水线中实现许可证合规性验证提供了基础。在生产环境中,您应当:
- 配置合适的命名空间隔离和访问控制
- 实施安全的密钥管理以保护签名密钥
- 设置策略违规的监控和告警
- 根据许可证要求定期更新安全策略