保护 build

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本文档介绍了保护 build 的最佳做法。 构建代码可以指不同类型的操作,例如:

  • 优化或混淆代码:例如,Google 开源工具 Closure 编译器可解析和分析 JavaScript、移除无效代码,并重写和最小化剩余代码。还会检查代码是否存在常见 JavaScript 问题。
  • 将代码编译到中间代码中:例如,您可以将 Java 代码编译为 Java 类文件 (.class) 或将 C++ 代码编译为对象文件 (.obj)。
  • 编译代码和链接,创建库或可执行文件:例如,将 C++ 代码编译到共享库 (.so) 或 Windows 可执行文件 (.exe) 中。
  • 将代码打包为可分发或可部署的格式:示例包括从 Java 类文件创建 Java WAR (.war) 文件、创建 Docker 映像或创建 Python 构建的发行版 (.whl)。

根据您使用的编程语言以及部署到的环境,您的 build 可能包含这些操作的不同组合。例如,构建可以将 Python 代码打包到构建的发行版中,并将其上传到工件工件存储区(如 Artifact RegistryPyPI),以便您可以将其用作 Cloud Functions 的依赖项。您还可以将 Python 代码容器化,并将容器映像部署到 Cloud Run 或 Google Kubernetes Engine。

本文档中的做法侧重于构建用于打包或部署到运行时环境的代码,而不是编译代码。

使用自动构建

自动构建脚本构建定义了构建脚本或构建配置中的所有构建步骤,包括检索源代码的步骤和构建代码的步骤。唯一的手动命令(如有)是运行构建的命令。

例如,构建脚本可以是:

  • Cloud Build cloudbuild.yaml
  • 使用 make 工具运行的 Makefile。
  • YAML 格式的 GitHub Actions 工作流文件,存储在 .github/workflows/ 目录中。

自动构建可在构建步骤中提供一致性。不过,在一致且受信任的环境中运行构建也很重要。

虽然本地构建对于调试很有用,但从本地构建发布软件可能会给构建流程带来许多安全问题、不一致和低效问题。

  • 允许本地构建可让恶意的攻击者修改构建流程。
  • 开发者本地环境和开发者做法不一致会导致难以重现 build 和诊断 build 问题。

手动构建利用更多基础架构资源(如计算、存储和网络)使过程效率低下。在 SLSA 框架的要求中,SLSA 级别 1 要求使用自动构建;对于 SLSA 级别 2,使用构建服务(而非开发者环境)进行构建。

Cloud Build 是 Google Cloud 上的代管式构建服务。它使用构建配置文件为 Cloud Build 提供构建步骤。您可以构建依赖项以提取依赖项,运行单元测试、静态分析和集成测试,并使用 Docker、Gradle、Maven、Go 和 Python 等构建工具创建工件。Cloud Build 与 Google Cloud 上的其他 CI/CD 服务(例如 Artifact RegistryGoogle Cloud Deploy)以及运行时环境(例如 GKECloud Run)完全集成,还提供与主要源代码管理系统(如 GitHub 和 Bitbucket)的集成。

生成 build 来源

build 来源是关于 build 的可验证数据集合。

来源元数据包含构建映像的摘要、输入源位置、构建工具链和构建时长等详细信息。

生成 build 出处有助于您:

  • 验证构建的工件是否是通过可信来源位置和受信任的构建系统创建的。
  • 识别从不受信任的源位置或构建系统注入的代码。

您可以使用提醒和政策机制主动使用构建出处数据。例如,您可以创建仅允许部署通过经过验证的源代码构建的代码的政策。

对于 SLSA 1 级,构建出处必须可供已构建工件的使用方使用。对于 SLSA 2 级,build 出处数据也必须:

  • 由构建服务生成或可直接从构建服务读取。
  • 可供消费者验证的真实性和完整性。应使用由创建 build 源数据的服务生成的数字签名来完成此操作。

对于 SLSA 3 级,出处内容还必须包括:

  • build 定义的入口点。
  • 由用户控制的所有 build 参数。

Cloud Build 可以为提供 SLSA 3 级构建保证的容器映像生成构建出处。如需了解详情,请参阅查看 build 来源

使用临时构建环境

临时环境是指旨在为单次构建调用持续的临时环境。构建完成后,系统会擦除或删除环境。临时 build 可确保构建服务和构建步骤在临时环境(例如容器或虚拟机)中运行。构建服务会为每个构建预配一个新环境,然后在构建流程完成后将其销毁,而不是重复使用现有构建环境。

临时环境可确保干净的构建,因为以前的 build 没有会干扰构建流程的残留文件或环境设置。攻击者可以在非临时环境中注入恶意文件和内容。临时环境还可以减少维护开销并减少构建环境中的不一致。

Cloud Build 会为每个构建设置新的虚拟机环境,并在构建后将其销毁。

限制对构建服务的访问权限

遵循最小权限安全原则,为构建服务和构建资源授予所需的最低权限。您还应使用非真人身份代表 build 运行并与其他服务交互。

如果您使用 Cloud Build:

  • 向组织成员授予所需的最低权限
  • 自定义代表 Cloud Build 的服务帐号的权限,使其仅具有使用所需的权限。修改默认 Cloud Build 服务帐号的权限,或考虑改用自定义服务帐号
  • 使用 Cloud Build 允许的集成组织政策来控制可以调用构建触发器的外部服务。
  • 使用 VPC Service Controls 将 Cloud Build 放置在服务边界内。边界允许边界中的 Google Cloud 服务之间免费通信,但系统会根据您指定的规则限制跨边界的通信。边界还可以降低数据渗漏的风险。

    对于您在专用池中运行的构建,Cloud Build 仅支持 VPC Service Controls。

保护凭据

构建通常包括连接到其他系统,例如版本控制、工件存储和部署环境。保护在构建中使用的凭据有助于防止对软件供应链中的系统未经授权的访问和数据渗漏。

避免将硬编码凭据直接存储在版本控制中或 build 配置中。请将凭据存储在安全的密钥库中。

在 Google Cloud 中,Secret Manager 可安全存储 API 密钥、密码和其他敏感数据。您可以将 Cloud Build 配置为使用存储在 Secret Manager 中的 Secret

管理您的依赖项

应用的完整性取决于所开发代码的完整性和您使用的任何依赖项的完整性。您还需要考虑发布依赖项的位置、谁有权读写工件代码库,以及关于部署到运行时环境的构建工件的可信来源的政策。

如需详细了解依赖项管理,请参阅管理依赖项

在 Cloud Build 中,您可以使用 Cloud Builder 运行命令。构建器是安装有通用语言和工具的容器映像。您可以使用公共注册表,例如 Docker Hub、Cloud Build 提供的构建器、社区提供的构建器以及您创建的自定义构建器。您还可以使用 buildpack 作为构建器,包括 Google Cloud buildpack

查看您在 Cloud Build 构建中使用的构建器,确定谁提供了这些构建器,并确定您是否信任它们在您的软件供应链中。为了更好地控制构建器中的代码,您可以创建自定义构建器,而不是使用公共源代码中的构建器。

减少更改 build 的机会

有很多因素会影响 build,包括:

  • 并发运行且可以相互影响的构建,或持续并影响后续构建的构建。
  • 接受 build 入口点和顶级源位置以外的用户参数的 build。
  • 该 build 指定了具有范围或可变依赖项(例如,使用具有 latest 标记的图片)。这些方法会导致构建面临使用不良或不需要版本的依赖项的风险。

以下做法有助于缓解这些风险:

  • 临时环境中运行每个构建。
  • 避免使用其他参数运行构建,这样用户就无法影响构建脚本中定义的变量。
  • 限制对构建服务和构建资源的访问
  • 引用依赖项的不可变版本,而不是可以指代后续工件工件版本的标记,例如标记。如需详细了解依赖项,请参阅依赖项管理

遵循构建容器的最佳做法

查看构建容器的最佳做法,了解如何构建更可靠且不易遭到攻击的容器映像,包括:

  • 打包单个应用
  • 处理流程
  • 优化 Docker 构建缓存
  • 移除不必要的工具,并尽可能缩小图片
  • 使用 Container Analysis 扫描漏洞。您可以扫描存储在 Artifact Registry 中的映像,也可以在本地扫描这些映像,然后再存储这些映像。
  • 添加代码的最佳做法
  • 使用公共映像的安全注意事项

Software Delivery Shield

Software Delivery Shield 是一种全代管式端到端软件供应链安全解决方案。它为 Google Cloud 服务提供一套全面的模块化功能和工具,开发者、DevOps 和安全团队可以使用这些工具和工具改善软件供应链的安全状况。它会在 Google Cloud 控制台的 Cloud Build 界面中显示已构建的应用的安全数据分析。包括:

  • SLSA 级别,用于确定软件供应链的成熟度。
  • 构建工件中的漏洞。
  • build 出处,它是关于 build 的可验证元数据集合。它包括构建映像的摘要、输入源位置、构建工具链、构建步骤和构建时长等详细信息。

如需了解如何查看已构建应用的安全性数据分析,请参阅构建应用和查看安全性数据分析

后续步骤