确保容器镜像和 OCI 制品的完整性和真实性

为什么完整性和真实性很重要

容器映像和其他 OCI 项目(如 SBOM、Helm 图表、配置捆绑包或 AI 模型)是现代云原生应用程序的关键组件。 这些制品流经软件供应链,从创建到部署:由发布者生成,存储在仓库中,并在 CI/CD 管道或生产环境中用于。

如果没有安全措施,攻击者可以:

  • 在存储或传输时更改工件。
  • 将受信任的图像或图表交换为恶意图像。
  • 将未经验证的基础映像或依赖项插入到生成中。

完整性 可确保所使用的项目与发布的项目完全相同。
真实性 可确保项目真正来自预期的发布者。

它们共同对保护供应链和防止攻击至关重要。

签名和验证的作用是什么?

为了确保完整性和真实性,可以在生成后对 OCI 项目(包括容器映像)进行签名 ,并在使用前验证这些签名。

  • 签名 生成加密签名,用于将发布者的标识绑定到包含摘要的项目描述符。
  • 验证 检查签名是否有效、发布者标识受信任且项目尚未更改。

如果验证失败,消费者可以阻止工件被拉取、用于构建或部署。

公证项目与符号系统

公证项目 是一个开源项目,它为 OCI 项目提供签名和验证,包括容器映像、SBOM、Helm 图表、AI 模型等。

Notation 是 Notary项目用于对OCI工件进行签名和验证的工具。 Notation与多个密钥供应商集成,包括:

  • Azure Key Vault (AKV): 用户管理自己的证书生命周期,包括颁发、轮换和过期。 这为希望维护证书直接管理的组织提供强大的控制和灵活性。

组织可以选择 AKV 进行完全控制。

签名和验证的场景

1.映像发布者在 CI/CD 管道(如 GitHub Actions)中对映像进行签名

容器映像发布者生成映像并将其签名为其 GitHub Actions 工作流的一部分,然后再将其推送到 Azure 容器注册表。

  • 确保下游使用者可以验证映像源。
  • 在构建时将信任元数据添加到供应链中。

2. 映像使用者在 AKS 上的部署期间进行验证

将工作负荷部署到 Azure Kubernetes 服务(AKS)时,群集策略可以强制仅允许已签名和已验证的映像运行。

  • 防止未经授权的或篡改的映像被部署。
  • 确保运行时工作负荷源自受信任的发布者。

3. 映像使用者验证 CI/CD 管道中的基本映像

在生成应用程序映像之前,开发人员可以配置管道(例如 GitHub Actions),以验证基本映像的签名。

  • 防止构建中继承漏洞或恶意代码。
  • 强制在应用程序生成中仅使用受信任的上游组件。

4. 验证其他 OCI 工件

除了容器映像之外,相同的过程也适用于存储在 OCI 注册表中的其他项目:

  • SBOM:在使用镜像之前,验证已签名的 SBOM 以便进行安全分析。
  • Helm 图表:在将其安装到 Kubernetes 群集之前验证图表。
  • 配置捆绑包或 AI 模型:在集成到系统中之前,请验证它们是否源自预期发布者。

后续步骤

本概述介绍了对容器映像和其他 OCI 项目进行签名和验证的重要性。 以下每个方案都有自己的专用指南:

使用 AKV 进行签名

使用 Notation CLI 进行签名:

登录 GitHub 工作流:

验证

GitHub 工作流中的验证:

AKS 上的验证: