使用 VPC Service Controls

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

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

组织级别的设置

如需搭配 Cloud Functions 使用 VPC Service Controls,您必须配置相应的服务边界和组织政策,这两项操作都是在组织级别执行的。此设置可确保在使用 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。

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

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

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

  • 使用 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. 转到 Cloud Console 中的允许的入站设置 (Allowed ingress settings) 政策页面:

    转到组织政策

  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. 转到 Cloud Console 中的要求使用 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. 转到 Cloud Console 中的允许使用的 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 网络路由发送所有出站流量。指定其他值的函数部署将失败。

项目级设置

对于服务边界内的每个独立项目,您必须执行额外的配置才能使用 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 服务帐号配置为有权访问您的服务边界:

查找服务帐号名称。

节点 8 和 Go 1.11

由于构建操作是在租户项目中执行的,因此您需要使用以下解决方法:

  1. 在您的项目中部署函数。使用 Google Cloud Console 中的默认值:

    创建函数

  2. 等待部署失败,然后点击列表中的函数名称以转至其函数详细信息页面。

  3. 注意观察“部署失败”错误消息 - 该消息以 Build failed: Unable to build your function due to VPC Service Controls 开头。错误消息包含电子邮件地址,该地址是服务帐号的名称。

您还可以使用类似下面这样的脚本,通过命令行查找服务帐号的地址:

#!/bin/bash

REGION="us-central1" # Your region
CONNECTOR_NAME="test-connector" # Your VPC connector name

# Deploy and delete an HTTP-triggered function
gcloud functions deploy FUNCTION_NAME --trigger-http --runtime nodejs8 --region $REGION --ingress-settings=internal-only --egress-settings=all --vpc-connector $CONNECTOR_NAME -q
gcloud functions delete FUNCTION_NAME --region $REGION -q

# Search log entries for Cloud Build failures
LOG_ENTRIES=$(gcloud logging read "resource.type=\"audited_resource\" AND protoPayload.serviceName=\"containerregistry.googleapis.com\"" --freshness=10m)
SERVICE_ACCTS=$(echo "$LOG_ENTRIES" | grep -oE "\d+@\w+.gserviceaccount.com" | sort | uniq)

# Print out service account IDs
echo "$SERVICE_ACCTS"

其中 FUNCTION_NAME 可以是任何 HTTP 函数,例如简单的 Hello World 函数

其他运行时

  1. 如果您使用的是 Java 11、Python 3.7 或 3.8、Node 10 或 Go 1.13,请使用 Google Cloud Console 中的 IAM 页面查找 Cloud Build 服务帐号。

    打开 IAM

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

  3. 搜索 cloudbuild.gserviceaccount.com。 格式为 my-project-number@cloudbuild.gserviceaccount.com 的电子邮件地址是服务帐号名称。

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

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

向 Cloud Build 服务帐号授予对 VPC Service Controls 服务边界的访问权限后,函数部署即会成功。

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

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

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

不符合上述条件的函数部署将失败。

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

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

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