配置 VPC Service Controls

VPC Service Controls 是一项 Google Cloud 功能,可让您设置安全的边界以防数据渗漏。本指南将介绍如何搭配 Cloud Functions 使用 VPC Service Controls,为您的函数额外增加一层安全性。

如需了解此集成的限制,请参阅 VPC Service Controls 文档

组织级别的设置

如需将 VPC Service Controls 与 Cloud Functions 搭配使用,您可以在组织级层配置服务边界。通过配置适当的组织政策,您可以确保在使用 Cloud Functions 时强制执行 VPC Service Controls 检查,并且开发者只能部署符合 VPC Service Controls 要求的服务。详细了解设置组织政策时的继承违规行为

设置 VPC Service Controls 边界

设置服务边界需要 Organization Viewer (roles/resourcemanager.organizationViewer) 和 Access Context Manager Editor (roles/accesscontextmanager.policyEditor) 角色。

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

  1. 创建服务边界。

  2. 向边界添加一个或多个项目。

  3. 限制 Cloud Functions API(第 1 代)或同时限制 Cloud Functions API 和 Cloud Run Admin API(第 2 代)。

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

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

对 Cloud Functions API 执行的 VPC Service Controls 检查会导致从服务边界以外发起的 Cloud Functions API 调用失败。因此,要使用 Cloud Functions API、Google Cloud 控制台中的 Cloud Functions 界面或 Google Cloud CLI 来管理函数,请选择以下任一操作:

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

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

设置组织政策

管理组织政策需要 Organization Policy Administrator (roles/orgpolicy.policyAdmin) 角色。

为了符合 VPC Service Controls 规范并避免数据渗漏,请设置以下组织政策来控制服务边界中 Cloud Functions 的允许网络设置

限制允许的入站设置

开发者针对 Cloud Functions 可使用的入站设置cloudfunctions.allowedIngressSettings 组织政策控制。对此组织政策进行设置,以强制要求开发者使用 ALLOW_INTERNAL_ONLY 值:

控制台

  1. 转到 Google Cloud 控制台中的允许使用的入站流量设置政策页面:

    打开组织政策

  2. 点击管理政策

  3. 修改政策页面上,选择自定义

  4. 强制执行政策下,选择替换

  5. 政策值下,选择自定义

  6. 政策类型下,选择允许

  7. 自定义值下,输入 ALLOW_INTERNAL_ONLY

  8. 点击设置政策

gcloud

使用 gcloud resource-manager org-policies allow 命令:

gcloud resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

其中 ORGANIZATION_ID 是组织 ID。

此组织政策就位后,所有函数都必须使用 ALLOW_INTERNAL_ONLY 值作为其入站设置。这意味着 HTTP 函数只能接受源自其服务边界内的 VPC 网络的流量。指定其他值的函数部署将失败。

需要 VPC 连接器

函数是否需要无服务器 VPC 访问通道连接器cloudfunctions.requireVPCConnector 组织政策控制。设置此组织政策以强制执行此限制条件:

控制台

  1. 转到 Google Cloud 控制台中的要求使用 VPC 连接器政策页面:

    打开组织政策

  2. 点击管理政策

  3. 修改政策页面上,选择自定义

  4. 实施下,选择开启

  5. 点击设置政策

gcloud

使用 gcloud resource-manager org-policies enable-enforce 命令:

gcloud resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

其中 ORGANIZATION_ID 是组织 ID。

此组织政策就位后,所有函数都必须使用无服务器 VPC 访问通道连接器。未指定连接器的函数部署将失败。

限制允许的 VPC 连接器出站设置

开发者针对 Cloud Functions 可使用的出站设置cloudfunctions.allowedVpcConnectorEgressSettings 组织政策控制。将此组织政策设置为仅允许 ALL_TRAFFIC 值:

控制台

  1. 转到 Google Cloud 控制台中的允许使用的 VPC 连接器出站流量设置政策页面:

    打开组织政策

  2. 点击管理政策

  3. 修改政策页面上,选择自定义

  4. 强制执行政策下,选择替换

  5. 政策值下,选择自定义

  6. 政策类型下,选择允许

  7. 自定义值下,输入 ALL_TRAFFIC

  8. 点击设置政策

gcloud

使用 gcloud resource-manager org-policies allow 命令:

gcloud resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

其中 ORGANIZATION_ID 是组织 ID。

此组织政策就位后,所有函数都必须使用值 ALL_TRAFFIC 作为其出站设置。这意味着函数必须通过您的 VPC 网络路由发送所有出站流量。指定其他值的函数部署将失败。

结合使用 cloudfunctions.requireVPCConnector 组织政策,这将强制所有出站流量通过受配置的防火墙和路由规则约束的 VPC 网络。

项目级设置

对于服务边界内的每个独立项目,您必须执行额外的配置才能使用 VPC Service Controls。

配置 VPC 网络

如需在缓解数据渗漏风险的同时访问 Google API 和服务,请求应发送至受限虚拟 IP (VIP) 地址范围 199.36.153.4/30 (restricted.googleapis.com)。

对于项目中的每个 VPC 网络,请按照以下步骤阻止除流向受限 VIP 地址范围的流量之外的出站流量:

  1. 配置防火墙规则以阻止数据离开 VPC 网络:

    • 创建阻止所有出站流量的拒绝出站规则。

    • 创建一条允许传输到 TCP 端口 443 上的 199.36.153.4/30 的出站规则。确保该规则具有的优先级高于您刚刚创建的拒绝出站规则,从而只允许传输到受限 VIP 范围的出站流量通过。

  2. 配置 DNS 以将 *.googleapis.com 解析为 restricted.googleapis.com

  3. 使用将 *.cloudfunctions.net 映射到 199.36.153.4/30 IP 范围的 A 记录配置 DNS。您可以使用 Cloud DNS 实现此目的:

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/VPC_NAME \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    
  4. 为 VPC 连接器的子网启用专用 Google 访问通道

此时,来自 VPC 网络内部的请求会发生以下情况:

  • 无法离开 VPC 网络,从而阻止了服务边界以外的出站流量。
  • 只能访问符合 VPC Service Controls 规范的 Google API 和服务,防止通过 Google API 渗漏数据。

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

Cloud Functions 使用 Cloud Build 将源代码构建到可运行的容器中。如需将 Cloud Functions 与 VPC Service Controls 搭配使用,您必须将 Cloud Build 服务账号(无论是默认服务账号还是自定义服务账号)配置为有权访问您的服务边界。

查找服务账号名称

如果您使用的是默认 Cloud Build 服务账号,则可以按以下方式找到其名称:

  1. 使用 Google Cloud 控制台中的 IAM 页面查找 Cloud Build 服务账号。

    打开 IAM

  2. 确保项目下拉列表中显示了正确的项目。

  3. 搜索 cloudbuild.gserviceaccount.com。 格式为 PROJECT_NUMBER@cloudbuild.gserviceaccount.com 的电子邮件地址是服务账号名称。

如果您有自定义 Cloud Build 服务账号,请改用该名称。

授予服务账号访问服务边界的权限

获知服务账号名称后,请按照按用户或服务账号限制访问权限指南为服务账号创建一个访问权限级别。然后,按照向现有边界添加访问权限级别的说明,将访问权限级别添加到服务边界。

部署符合 VPC Service Controls 规范的函数

为 Cloud Functions 配置 VPC Service Controls 之后,您必须确保服务边界内部署的所有函数都符合指定的组织政策。也就是说:

  • 所有函数都必须使用无服务器 VPC 访问通道连接器。 如需了解详情,请参见连接到 VPC 网络
  • 所有函数必须仅允许来自内部来源的流量。如需了解详情,请参阅入站流量设置
  • 所有函数必须通过 VPC 网络路由发送所有传出流量。如需了解详情,请参阅出站流量设置

不符合这些条件的函数部署将失败。

审核现有函数以确保符合 VPC Service Controls 规范

设置 VPC Service Controls 之后,系统会自动检查在服务边界内的项目中创建的新函数是否符合规范。不过,为了避免现有工作负载中断,现有函数将保持运行,但可能不符合组织政策。

建议您审核现有函数,并根据需要更新或重新部署它们。为此,您可以创建一个使用 Cloud Functions API 的脚本来列出函数,并突出显示未指定正确网络设置的函数。

将 VPC Service Controls 与边界外的函数搭配使用

上述部分适用于在 VPC Service Controls 服务边界内部署 Cloud Functions 的场景。

如果您需要在服务边界外部署函数,但该函数需要访问边界内的资源,请使用以下配置:

  1. 授予 Cloud Build 服务账号访问 VPC Service Controls 边界的权限
  2. 向函数的运行时服务账号授予对边界的访问权限。您可以通过创建访问权限级别将访问权限级别添加到服务边界或者通过在边界上创建入站流量政策来执行此操作。
  3. 将函数连接到 VPC 网络
  4. 通过 VPC 网络路由来自函数的所有传出流量。如需了解详情,请参阅出站流量设置

完成此配置后,该函数将能够访问受边界保护的资源。