使用 VPC Service Controls

VPC Service Controls 是 Google Cloud 的一项功能,可让您设置安全的边界以防数据渗漏。本页面介绍了如何将 VPC Service Controls 与 Cloud Build 专用池结合使用,为您的构建增加额外的安全性。

限制

VPC Service Controls 保护仅适用于在专用池中运行的构建;您无法对在默认池中运行的构建使用 VPC Service Controls。

准备工作

  • 如需使用本指南中的命令行示例,请安装并配置 Google Cloud CLI

  • 在您的 Virtual Private Cloud 网络和专用池所在的 VPC 网络之间建立专用连接。如需了解相关说明,请参阅设置环境以创建专用池

在 VPC Service Controls 边界中设置专用池

如需将 Cloud Build 与 VPC Service Controls 搭配使用,您必须先创建和配置在组织级层执行的服务边界。此设置可确保在使用 Cloud Build 时强制执行 VPC Service Controls 检查,并且开发者只能运行符合 VPC Service Controls 要求的构建。

创建 VPC Service Controls 边界

Identity and Access Management 权限:要设置服务边界,您需要 Organization ViewerAccess Context Manager Editor 角色。有关授予这些角色的说明,请参阅配置对 Cloud Build 资源的访问权限

如需创建 VPC Service Controls 边界,请执行以下操作

按照 VPC Service Controls 快速入门执行以下操作:

  1. 创建服务边界。
  2. 将您打算在其中创建专用池的项目添加到边界。

  3. 限制 Cloud Build API。

设置服务边界后,系统会检查所有对 Cloud Build API 的调用,以确保这些调用都源自同一个边界内部。

授予 Cloud Build 服务账号访问 VPC Service Controls 边界的权限

Cloud Build 使用 Cloud Build 服务帐号用户指定的服务帐号代表您执行构建。在以下情况下,您必须向服务帐号授予对 VPC Service Controls 边界的访问权限,您的构建才能访问该边界内的资源:

  • 如果您使用 Cloud Build 服务帐号通过构建触发器Cloud Build API 或命令行启动构建,
  • 如果您使用用户指定的服务帐号来通过构建触发器启动构建,请执行以下操作:

如果您使用用户指定的服务帐号通过 Cloud Build API 或命令行启动构建,则无需授予服务帐号访问 VPC Service Controls 边界的权限。

请执行以下步骤,向 Cloud Build 服务帐号授予对 VPC Service Controls 边界的访问权限:

  1. 记下您的 Cloud Build 服务帐号或用户指定的服务帐号的电子邮件地址。如需获取 Cloud Build 服务帐号的电子邮件地址,请执行以下操作:

    1. 打开 IAM 页面:

      打开 IAM 页面

    2. 选择您已添加到服务边界中的项目。

    3. 在权限表中,找到以 @cloudbuild.gserviceaccount.com 结尾的电子邮件地址,并记下该地址。这是您的 Cloud Build 服务账号。

  2. 更新服务边界的入站流量政策,以允许服务帐号调用 Cloud Build API。此入站流量规则允许服务帐号进行 CreateBuild API 调用。如需详细了解如何设置 VPC Service Controls 入站流量政策,请参阅配置入站流量和出站流量政策以及入站和出站流量规则

    - ingressFrom:
        identities:
        - serviceAccount:SERVICE_ACCOUNT_EMAIL
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: 'cloudbuild.googleapis.com'
          methodSelectors:
          - method: '*'
        resources:
        - 'projects/PROJECT_NUMBER'
    
  3. 运行以下命令将变量替换为适当的值,以更新边界政策:

    gcloud beta access-context-manager perimeters update PERIMETER_NAME \
        --set-ingress-policies=INGRESS-FILENAME \
        --policy=POLICY_ID
    

将上面的变量替换为以下内容:

  • SERVICE_ACCOUNT_EMAIL:您的 Cloud Build 服务帐号或用户指定的服务帐号的电子邮件地址。
  • PROJECT_NUMBER:您添加到 VPC Service Controls 边界的 Google Cloud 项目的项目编号。
  • PERIMETER_NAME:您的 VPC Service Controls 边界的名称。
  • INGRESS-FILENAME:入站流量政策文件的名称。
  • POLICY_ID:访问权限政策的 ID。

可选:为开发机器启用边界访问权限

由于系统会对 Cloud Build API 强制执行 VPC Service Controls 检查,因此调用 Cloud Build API 将失败(除非这些调用源自服务边界内部)。因此,如需使用 Cloud Build API、Google Cloud 控制台中的 Cloud Build 界面或 Google Cloud CLI 管理构建,请选择以下选项之一:

  • 使用 VPC Service Controls 边界内的机器。例如,您可以使用 Compute Engine 虚拟机或通过 VPN 连接到您 VPC 网络的本地机器。

  • 授予开发者访问边界的权限。例如,您可以根据 IP 地址或用户身份,创建可访问边界的权限级别。如需了解详情,请参阅允许从边界外访问受保护的资源

设置组织政策限制条件

为确保正确强制执行 VPC Service Controls 检查,并且您将 Google Cloud 组织中的构建限制为仅使用指定的专用池,请设置 constraints/cloudbuild.allowedWorkerPools 组织政策限制条件。您可以将组织政策应用于整个组织或组织中的项目或文件夹。例如,组织政策可以指定以下内容:

  • 组织中的所有构建均使用指定的专用池。
  • 文件夹中的所有构建均使用指定的专用池。
  • 项目中的所有构建均使用指定的专用池。

IAM 权限:要管理组织政策,您需要 Organization Policy Administrator (roles/orgpolicy.policyAdmin) 角色。有关授予角色的说明,请参阅配置对 Cloud Build 资源的访问权限

gcloud resource-manager org-policies allow 命令会设置要求组织中的构建仅使用指定专用池的组织政策:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools \
     projects/PRIVATEPOOL_PROJECT_ID/locations/LOCATION/workerPools/PRIVATEPOOL_ID \
     --organization ORGANIZATION_ID

将上述命令中的占位值替换为以下内容:

  • PRIVATEPOOL_ID:要运行构建的专用池的 ID。

  • PRIVATEPOOL_PROJECT_ID:包含专用池的 Google Cloud 项目的 ID。

  • LOCATION:包含专用池的区域。

  • ORGANIZATION_ID:您运行构建的组织的 ID。

该命令支持 under:is 前缀。

如需设置要求组织中的所有构建均使用该组织下任何专用池的组织政策,请运行以下命令:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:organizations/ORGANIZATION_ID \
     --organization ORGANIZATION_ID

其中,ORGANIZATION_ID 是包含专用池的组织的 ID。

如需设置组织政策以要求文件夹下的项目中的所有构建均使用指定项目中的任何专用池,请运行以下命令:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PROJECT_ID \
     --folder FOLDER_ID

其中,PROJECT_ID 是包含专用池的项目的 ID,FOLDER_ID 包含在其中运行构建的项目。

如需设置组织政策以要求项目中的所有构建均使用指定项目中任何专用池,请运行以下命令:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PRIVATEPOOL_PROJECT_ID \
     --project BUILD_PROJECT_ID

其中 PRIVATEPOOL_PROJECT_ID 是包含专用池的项目的 ID,BUILD_PROJECT_ID 是在其中运行构建的项目的 ID。

强制执行 constraints/cloudbuild.allowedWorkerPools 组织政策限制条件时,请牢记以下注意事项:

  • 如果您将此组织政策限制条件应用于 Google Cloud 项目,请确保该项目中的所有构建都使用专用池;尝试使用默认共享池的构建将失败。

  • 如果您的 Google Cloud 组织包含隐式使用 Cloud Build 的 App Engine 或 Cloud Functions 等服务,则强制执行此组织政策限制条件可能会导致这些服务无法按预期运行。

在服务边界中创建专用池

控制台

  1. 在 Google Cloud 控制台中打开工作器池页面:

    打开 Cloud Build 工作器池页面

  2. 选择要在其中创建专用池的项目。

  3. 工作器池页面中,点击创建

  4. 创建专用池侧边栏中:

    1. 输入专用池的名称。

    2. 选择要在其中创建专用池的区域。

    3. 选择要用于专用池的 Compute Engine 机器类型。

    4. 输入您在其中创建了 VPC 网络的 Google Cloud 项目的项目编号。

    5. 输入您的 VPC 网络的名称。

    6. 取消选中分配外部 IP

    7. 点击创建

gcloud

  1. 以 YAML 或 JSON 格式创建专用池配置文件,并将 egressOption 标志设置为 NO_PUBLIC_EGRESS

    privatePoolV1Config:
      networkConfig:
        egressOption: NO_PUBLIC_EGRESS
        peeredNetwork: PEERED_NETWORK
      workerConfig:
        diskSizeGb: 'PRIVATE_POOL_DISK_SIZE'
        machineType: PRIVATE_POOL_MACHINE_TYPE
    

    其中:

    • PEERED_NETWORK 是已与服务提供商网络建立对等互连的网络的网络资源网址。PEERED_NETWORK 必须采用 projects/NETWORK_PROJECT_ID/global/networks/NETWORK_NAME 格式,其中 NETWORK_PROJECT_ID 是包含您的 VPC 网络的 Google Cloud 项目的 ID,NETWORK_NAME 是您的 VPC 网络的名称。
    • PRIVATE_POOL_MACHINE_TYPE 是专用池实例的 Compute Engine 机器类型。如需了解受支持的机器类型,请参阅专用池配置文件架构
    • PRIVATE_POOL_DISK_SIZE 是专用池实例的磁盘大小(以 GB 为单位)。指定一个大于或等于 100 且小于或等于 1000 的值。如果指定 0,则 Cloud Build 会使用默认值 100。
    • egressOption 是用于为专用池启用 VPC Service Controls 边界的标志。将此标志设置为 NO_PUBLIC_EGRESS 可在 VPC Service Controls 边界内创建专用池。
  2. 运行以下 gcloud 命令,其中 PRIVATEPOOL_ID 是专用池的唯一标识符,PRIVATEPOOL_CONFIG_FILE 是您的专用池配置文件的名称,而 REGION 是要在其中创建专用池的地区

    gcloud builds worker-pools create PRIVATEPOOL_ID --config-from-file PRIVATEPOOL_CONFIG_FILE --region REGION
    

可选:在 VPC 网络上启用公共互联网调用

确保使用以下设置将您的 VPC 网络配置为允许连接到您的代码库的托管位置(例如 github.com):

  1. 专用池配置文件中,确保将 egressOption 字段设置为 NO_PUBLIC_EGRESS

  2. 运行专用池的 VPC 网络定义为 PeeredNetwork。要允许调用代码库主机,请确保此 VPC 网络允许发送到代码库主机的公共出站流量。如需了解如何执行此操作,请参阅路由和防火墙规则

在服务边界内的专用池中运行构建

在服务边界内运行的构建无权访问公共互联网,因为您需要先执行一些操作才能运行构建。

推送构建的映像和工件

如果您的构建将映像和工件推送到位于其他 Google Cloud 项目的 Container Registry(已弃用)、Artifact Registry 或 Cloud Storage,请务必将该项目添加到其来源项目所在的服务边界。

创建日志存储桶

在服务边界内运行的构建将无权在默认的 Cloud Storage 日志存储桶中存储构建日志。 选择以下一个选项:

运行构建

按照在专用池中运行构建中的说明运行构建。

后续步骤