VPC Service Controls 是一项 Google Cloud 功能,可让您设置安全的边界以防数据渗漏。此页面显示了 如何使用 VPC Service Controls Cloud Build 专用池 为您的 build 增加一道安全屏障。
限制
VPC Service Controls 保护仅适用于在专用池中运行的构建;您无法将 VPC Service Controls 与在默认池中运行的构建搭配使用。
使用 VPC Service Controls 时不支持 Cloud Build Pub/Sub 触发器。
准备工作
如需使用本指南中的命令行示例,请安装并配置 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 Viewer 和 Access Context Manager Editor 角色。有关授予这些角色的说明,请参阅配置对 Cloud Build 资源的访问权限。
如需创建 VPC Service Controls 边界,请执行以下操作:
按照 VPC Service Controls 快速入门执行以下操作:
- 创建服务边界。
将您打算在其中创建专用池的项目添加到边界。
限制 Cloud Build API。
设置服务边界后,系统会检查所有对 Cloud Build API 的调用,以确保这些调用都源自同一个边界内部。
向服务账号授予对 VPC Service Controls 边界的访问权限
在以下情况下,您必须授予旧版 Cloud Build 或 Compute Engine 服务 允许您的构建访问 VPC Service Controls 边界的账号访问权限 边界内的资源:
如果您使用旧版 Cloud Build 或 Compute Engine 服务账号开始 使用构建触发器、Cloud Build API 或 命令行。
如果您使用用户指定的服务账号来启动使用 build 的 build 触发。
如果您使用用户指定的服务账号通过 Cloud Build API 或命令行启动 build,则无需向旧版 Cloud Build 或 Compute Engine 服务账号授予对 VPC Service Controls 边界的访问权限。
执行以下步骤以授予旧版 Cloud Build 或 Compute Engine 服务 账号访问 VPC Service Controls 边界:
记下旧版服务账号的电子邮件地址:
打开 IAM 页面:
选择您已添加到服务边界中的项目。
在权限表中,找到旧版 Cloud Build 服务账号。
更新服务边界的入站流量政策以允许 服务账号,以调用 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'
更新边界政策,方法是运行以下命令,并将变量替换为适当的值:
gcloud beta access-context-manager perimeters update PERIMETER_NAME \ --set-ingress-policies=INGRESS-FILENAME \ --policy=POLICY_ID
将上面的变量替换为以下内容:
SERVICE_ACCOUNT_EMAIL
:服务账号的电子邮件地址。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 管理 build,请选择以下任一选项:
使用 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 Run 函数等服务,则强制执行此组织政策限制条件可能会导致这些服务无法按预期运行。
在服务边界中创建专用池
控制台
在 Google Cloud 控制台中,打开工作器池页面:
选择要在其中创建专用池的项目。
在工作器池页面中,点击创建。
在创建专用池侧边栏中:
输入专用池的名称。
选择要在其中创建专用池的区域。
选择要用于专用池的 Compute Engine 机器类型。
输入您在其中创建了 VPC 网络的 Google Cloud 项目的编号。
输入您的 VPC 网络的名称。
取消选中分配外部 IP。
点击创建。
gcloud
以 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 边界内创建专用池。
运行以下
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):
在专用池配置文件中,确保将
egressOption
字段设置为NO_PUBLIC_EGRESS
。运行专用池的 VPC 网络定义为 PeeredNetwork。要允许调用代码库主机,请确保此 VPC 网络允许发送到代码库主机的公共出站流量。如需了解如何执行此操作,请参阅路由和防火墙规则。
在服务边界内的专用池中运行构建
在服务边界内运行的构建无权访问公共互联网,因为您需要先执行一些操作才能运行构建。
推送构建的映像和工件
如果您的构建将映像和工件推送到 Container Registry (已弃用)、Artifact Registry 或 Cloud Storage 位于其他 Google Cloud 项目中,请务必将该项目添加到 与构建来源项目相同的服务边界。
创建日志存储分区
在服务边界内运行的构建将无权在默认的 Cloud Storage 日志存储分区中存储构建日志。 选择以下一个选项:
- 通过将
loggingMode
设置为CLOUD_LOGGING_ONLY
,以选择在 Cloud Logging 中存储构建日志。 - 在专用项目中,创建一个 Cloud Storage 日志存储桶以存储构建日志。如需了解如何执行此操作,请参阅将构建日志存储在用户创建的存储分区中。
- 将
loggingMode
设置为NONE
以停用构建日志。
运行构建
按照在专用池中运行构建中的说明运行构建。