确保 Google Kubernetes Engine 中软件供应链的安全

本文介绍了在将代码部署到 Google Kubernetes Engine (GKE) 集群之前,如何确保您的软件供应链遵循已知的安全路径。本文将首先介绍 Binary Authorization 的工作原理,然后介绍如何以最佳方式实现和搭配 Google Cloud 使用它来确保部署流水线能够提供尽可能多的信息,帮助您在每个必需阶段强制执行审批。

DevOps 现状报告确定了可提高软件交付方面表现的功能。本文将帮助您使用以下功能:

有助于确保软件供应链安全的要素

在构建和部署容器化应用时,应使用不可变工件作为部署单元。借助不可变工件,您可以放心地跨众多主机与环境部署软件并调整其计算容量,因为软件始终都会按您预期的方式运行。

在构建不可变工件后,您可以将它们放入工件存储区,并在工件存储区对其进行版本控制和编目,以供进一步使用。

在发布流程的各个阶段,可以由相关人员或自动化系统来添加描述活动结果的元数据,类似于向检查点发送信号。例如,您可以为映像添加元数据,以表明该映像已通过集成测试套件的测试。

为工件添加元数据后,请创建一项部署政策,以规定工件必须通过哪些验证才能部署到您的基础架构。您要在基础架构中构建一种机制,即在允许某工作负载部署到基础架构之前,先验证该工作负载是否已顺利通过所有必要的检查点。这种验证应在允许代码运行之前完成,这有助于确保任何一次部署都无法绕过整个流程中的必要阶段。

下图显示了软件供应链管理的常规流程。

软件供应链管理流程

确保 GKE 中供应链的安全

下表列出了供应链要素与 Google Cloud 功能的对应关系。

要素 Google Cloud 实现
不可变工件 Docker 映像
工件存储区 Container Registry
工件元数据 备注
工件审核者 证明者
工件验证 证明
部署政策 Binary Authorization 政策

您部署的 GKE 不可变工件是指 Docker 映像。您可以构建这种映像,然后将其推送到工件存储区 Container Registry。在这一存储区中,您可以将该映像部署到任意数量的 GKE 集群。

在 Container Registry 中,您可以通过标记来添加与映像有关的信息,该信息代表一段元数据。对于映像上的 Docker 标记,其最常见的用途是表示软件版本或发布阶段,例如 v2.0.0beta。尽管此信息有用,但您无法使用标记来添加如下所示的工件详细信息:工件是在哪里构建的、构建工件时使用了哪些源代码,或者工件是否已获准在生产环境中部署。对于此类详细信息,您可使用证明。

证明者可以在 Container Registry 中添加关于映像的备注,说明相关映像是否符合特定标准。在映像的整个生命周期中,您都可以访问这些信息。备注分为几种类型,这有助于您更好地过滤映像相关信息。其中一类备注是 attestation,它由您项目中的证明者添加。例如,您可以让证明者来证实构建的映像不存在严重的安全漏洞,或者证实某个映像是通过特定的构建系统构建的。

通过上传用于创建和识别证明者的关联优良保密协议 (PGP) 公钥,您可以向自己的项目中添加证明者。然后,证明者可以创建证明,具体做法是签署相关消息来确认其要为特定的内容可寻址映像摘要提供证明。

下图显示了为特定映像摘要添加证明的一个示例。

为映像添加证明

借助 Binary Authorization,您可以配置一项政策,以规定映像必须具备哪些证明才能部署到您的集群。这项措施可确保您的映像在整个部署流水线中遵循正确的路径,而不会跳过任何重要步骤。在部署流水线的每个关键阶段,您都可以创建一项证明来表示映像已顺利通过该步骤。可以由自动化系统或相关人员来添加证明。

例如,您可能希望确保您的映像已通过质量保证 (QA) 团队的验证。完成测试后,一名质量保证团队成员会使用特定密钥对证明者 qa-validated 的证明进行签名。必须具备该证明才能将映像部署到生产集群。

同样,您可能希望确保您的映像已经过漏洞扫描并且未出现任何异常。自动化系统可以检测存储库中的新映像,并添加一项证明来证实这些映像符合某种漏洞标准。系统在验证漏洞扫描结果后,会使用加密密钥来签署并添加来自 not-vulnerable 证明者的证明。您可以使用 Cloud Key Management Service 加密此密钥、将其安全存储在 Cloud Storage 中、通过 Identity and Access Management 控制对其的访问权限,以及通过 Cloud Logging 审核其使用情况。

下图显示了 Container Registry 中的映像,其中包含由相关人员和自动化证明者添加的证明。

Container Registry 中的映像(由自动化系统或相关人员添加证明)

借助 Binary Authorization,您可以创建相关政策,规定可使用哪些加密密钥来验证各项证明。您还可以将某些映像添加到 allowlist,来绕过证明验证或停用特定集群的 Binary Authorization。

虽然 Google Cloud 提供代管式服务来创建和管理您的软件供应链,但您也可以使用开源实现在其他环境中实现类似流程。

下表将 Google Cloud 服务与具有类似功能的开源工具一一对应。

Google Cloud 开源工具
Container Registry Docker Distribution
Metadata API Grafeas
Binary Authorization Kritis
漏洞扫描 ClairAnchore Engine

持续交付流水线最佳做法

如果您有一条持续交付流水线,并且该流水线采用自动化方式将代码库的源代码部署到生产基础架构,那么软件供应链的验证工作会变得极为有效。这类流水线所包含的阶段因组织而异,但您可以实施一些高级的最佳做法,以确保流水线能够安全地部署软件。

CI/CD 流水线常规指导

许多组织允许各个团队选择自己的持续交付流程和工具。尽管这种灵活度有助于提升自主性,并可让团队使用熟悉的工具,但可能难以确保所有发布活动都遵循最佳做法。您可能希望在 Spinnaker 等工具中集中管理团队的发布流水线,这有助于您在同一位置对相关方法进行模板化、共享和审核。

构建映像

对供应链而言,软件的安全性与用于构建可运行工件的材料息息相关。在使用 GKE 时,您必须确保构建的映像来自安全的基础映像。

要最大限度地提高基础映像的安全性,第一步是使用仅包含运行应用所需的软件和库的最低发行版映像。对于 Ubuntu、Debian 和 CentOS 等热门发行版,Google Cloud 提供了托管式基础映像,系统会使用安全补丁定期更新这些映像。Distroless 映像是一组基础映像,其中仅包含运行以各种编程语言编写的应用所需的库和工具。选择基础映像后,请尽量避免为其添加内容。您可以利用 Docker 的多阶段构建将构建时依赖项与运行时依赖项相互分开,以缩小攻击面。

构建映像后,请确保其符合贵组织的政策。您可以创建容器结构测试来验证映像的内容和元数据。您可以使用 container-diff 来比较现有容器和新构建的容器。

在缩减应用映像所包含的内容后,请尝试审核并缩小您的集群所允许的第三方映像的范围。您可以使用 Binary Authorization 将映像添加到 allowlist,从而绕过证明要求。确保 allowlist 条目对于您需要的每个映像而言都尽可能的具体,但无法通过工件创建流水线进行构建。

如需详细了解如何构建容器,请参阅构建容器最佳做法文档。

启用映像漏洞分析

在项目中启用 Container Registry 漏洞扫描,以详细了解 Docker 映像中的潜在安全问题。在您推送映像后,系统会立即运行自动扫描,扫描结果有助您了解映像中是否存在严重漏洞。虽然在部署映像前必须对其进行漏洞检查,但部署后仍需要检查映像,因为可能会发现新漏洞。漏洞扫描服务会不断扫描过去 30 天内从注册表提取的所有映像。只要在映像中发现漏洞,您就可以通过 Pub/Sub 接收通知

在部署期间验证政策

要确保软件供应链的安全,请在部署期间启用映像验证。持续交付流水线的最后一步是部署,在该阶段,您可以确保您的流程经历了所有阶段并顺利通过了所有检查点。采用此方法后,即使有人获得了集群的访问凭据,也无法部署恶意映像。

通过 Binary Authorization,您可以为项目中的所有集群配置默认规则,然后使用专门针对具体集群的配置覆盖这些规则。例如,您可能希望所有集群都要求漏洞扫描和质量检查验证证明,但也想要确保开发者无需质量检查验证就能试用 development 集群中的新技术和映像。如需详细了解 Binary Authorization 政策,请参阅政策 YAML 参考文档。

流水线示例

下面是一个流水线示例,它分为两个主要阶段:构建和部署。

示例流水线中的构建和部署阶段

下表提供了关于流水线步骤的详细信息,并指出需要在哪些阶段添加证明。

步骤编号 摘要 说明 认证
图标
1 获取源代码 检出所需修订版本的源代码,以供构建系统使用。
2 运行单元测试 在创建工件之前,请确保代码已通过所有单元测试。

运行单元测试。

3 创建 Docker 映像 使用本地源代码中的 Dockerfile 构建可推送至 Container Registry 的映像。
4 确保 Docker 映像符合政策 借助容器结构测试,您可以声明您的映像包含正确的内容,并声明映像中的命令会返回正确的输出。

确保 Docker 映像符合政策。

5 将映像推送到 Container Registry 在对代码进行单元测试并对映像内容进行验证后,您可以将映像推送到 Container Registry。此时,系统会自动启动漏洞扫描。
6 确保映像没有严重漏洞 漏洞扫描服务需要几分钟才能完成扫描,然后会在映像的元数据中添加与发现的任何常见漏洞和威胁 (CVE) 有关的备注。请等待此数据出现,如果系统未发现任何严重漏洞,请添加证明。

确保映像没有严重漏洞。

7 将映像部署到模拟环境 将映像部署到模拟环境中,以便在尽可能接近生产环境的场景中验证和观察您对映像所做的更改。

将映像部署到模拟环境。

8 批准在生产环境中部署代码 如果所有迹象都表明您对映像所做的更改符合相关要求,请批准在生产环境中部署映像。
9 在生产集群中发布代码 现在,您可以将映像设置为跨一系列集群进行更新。在运行您的应用之前,每个集群都会检查您的映像是否已完成所有证明。

证明示例

您可能希望将以下证明纳入您的发布流水线:

  • 漏洞分析结果中不包含严重漏洞。
  • 已通过手动质量保证验证。
  • 映像中包含的所有软件都已获得适当许可。
  • 工件是在可信的构建系统中创建的。

后续步骤