使用 VPC Service Controls (VPC SC)

VPC Service Controls 是一项 Google Cloud 功能,可让您设置安全的边界以防数据渗漏。默认 run.app 网址和自定义网域均受 VPC Service Controls 的约束。本指南介绍了如何将 VPC Service Controls 与 Cloud Run 搭配使用,以增强服务的安全性。

限制和建议

  • 对于 Artifact Registry 或 Container Registry:

    • 存储容器的注册表必须位于要部署到的项目所在的 VPC Service Controls 服务边界中。
    • 要构建的代码必须与容器要推送到的注册表位于同一边界内。
  • VPC Service Controls 边界内的项目无法使用持续部署功能。

  • 调用 Cloud Run 服务时,VPC Service Controls 政策强制执行不会使用客户端的 IAM 身份验证信息。此类请求存在以下限制:

    • 不支持使用 IAM 主账号的 VPC Service Controls 入站流量政策规则。
    • 不支持使用 IAM 主账号的 VPC Service Controls 边界的访问权限级别。

设置您的组织以支持 VPC Service Controls

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

设置 VPC Service Controls 边界

以下步骤展示了如何设置 VPC Service Controls 边界

  1. 确保您拥有 管理 VPC Service Controls 所需的角色

  2. 在 Google Cloud 控制台中,转到 VPC Service Controls 页面。

    转到 VPC Service Controls 页面

  3. 如果收到提示,请选择您的组织

  4. 点击管理访问权限政策。选择访问权限政策或创建一项政策。 访问权限政策必须包含您要添加到边界的所有项目。

  5. 点击新建边界。 输入边界的名称。

  6. 选择您要在边界内保护的项目。

    1. 点击项目

    2. 添加项目窗口中,选择您要添加的项目。

      如果您使用的是共享 VPC,请务必添加宿主项目和服务项目。

    3. 点击添加项目按钮。

  7. 选择 Cloud Run 作为您要在边界内保护的服务。

    1. 点击受限的服务

    2. 点击添加服务

    3. 搜索“Cloud Run”。然后选择 Cloud Run Admin API

    4. 点击添加 Cloud Run Admin API

  8. 为开发者启用访问权限。

    为 Cloud Run 启用 VPC Service Controls 可防止从边界外进行所有访问,包括从不在边界内的机器(如公司笔记本电脑)查看和部署服务。为了让开发者和应用运维人员查看和部署边界内的资源,必须配置边界入站流量政策

    1. 点击入站流量政策

    2. 指定来源身份项目服务

    3. 点击添加规则 (Add Rule)。

    如果您的组织使用 Access Context Manager,则还可以通过设置访问权限级别为开发者启用访问权限。

  9. 点击创建边界

完成这些步骤后,系统将检查对 Cloud Run Admin API 的所有调用,以确保它们源自同一边界内。

设置组织政策

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

为了符合 VPC Service Controls 规范并避免数据渗漏,请设置以下组织政策来控制服务边界的 Cloud Run 允许的入站流量出站流量设置。

限制允许的入站流量设置

开发者针对 Cloud Run 可使用的入站设置run.allowedIngress 组织政策控制。对此组织政策进行设置,以强制要求开发者使用 internal 值(如果您希望仅允许内部请求),或 internal-and-cloud-load-balancing(如果您希望允许通过外部应用负载均衡器发出请求),并使用由 Cloud Load Balancing 管理的访问权限控制。

如需详细了解这些设置,请参阅限制 Cloud Run 的入站流量

控制台

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

    转到组织政策

  2. 点击修改

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

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

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

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

  7. 自定义值下,输入 internal。 如果您还想允许 Cloud Load Balancing 流量,请点击新政策值,然后输入 internal-and-cloud-load-balancing

  8. 点击保存

gcloud

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

gcloud resource-manager org-policies allow \
  run.allowedIngress internal \
  --organization ORGANIZATION_ID

其中 ORGANIZATION_ID 是组织 ID。 如果您还允许 Cloud Load Balancing 流量,请将 run.allowedIngress internal 替换为 run.allowedIngress internal-and-cloud-load-balancing

此组织政策就位后,所有服务都必须使用允许的值作为其入站流量设置。这意味着 Cloud Run 服务只能接受源自服务边界内的 VPC 网络的流量。组织政策将会阻止将入站流量设置为其他值的尝试。

限制允许的 VPC 出站流量设置

开发者针对 Cloud Run 可使用的出站设置run.allowedVPCEgress 组织政策控制。将此组织政策设置为仅允许 all-traffic 值:

控制台

  1. 转到 Google Cloud 控制台中的允许的 VPC 出站流量设置 (Cloud Run) 政策页面:

    转到组织政策

  2. 点击修改

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

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

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

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

  7. 自定义值下,输入 all-traffic

  8. 点击保存

gcloud

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

gcloud resource-manager org-policies allow \
  run.allowedVPCEgress all-traffic \
  --organization ORGANIZATION_ID

其中 ORGANIZATION_ID 是组织 ID。

设置组织政策后的行为

组织政策就位后,所有新修订版本都必须使用 Direct VPC 出站流量或无服务器 VPC 访问通道连接器,并且必须使用 all-traffic 值作为其出站流量设置。此设置组合通过 VPC 网络路由来自这些修订版本的所有出站流量,以使此流量受 VPC 网络的防火墙规则和其他设置的约束。指定了其他值的新修订版本部署将被组织政策阻止。

组织政策和流量迁移

对于在设置组织政策前已存在的服务,您可以继续将流量迁移到不合规的修订版本,直到处理流量的所有修订版本都合规为止。

此行为可让您测试和逐步发布符合政策的新修订版本。在处理流量的所有修订版本均符合该政策之后,任何想将流量迁移到不合规修订版本的操作都会被组织政策阻止。

设置项目以支持 VPC Service Controls

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

配置 VPC 网络

本部分介绍如何配置 VPC 网络,使发送到常规 googleapis.com 网域的请求自动路由到受限的受限虚拟 IP (VIP) 范围和 Cloud Run 服务正在运行的 199.36.153.4/30 (restricted.googleapis.com)。无需更改代码。

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

  1. 在托管您的 VPC 网络资源的子网上启用专用 Google 访问通道

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

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

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

  3. 创建 Cloud DNS 响应政策

    gcloud dns response-policies create RESPONSE_POLICY \
    --networks=NETWORK \
    --description=DESCRIPTION
    

    替换以下内容:

    • RESPONSE_POLICY:响应政策的名称。
    • NETWORK:与此政策关联的网络的名称。如需指定多个网络,请使用英文逗号分隔各个网络的名称,例如:network1,network2
    • DESCRIPTION:响应政策的说明,例如 Cloud Run VPC Service Controls response policy
  4. 向响应政策添加规则,以将 *.googleapis.com 解析为 restricted.googleapis.comrestricted.googleapis.com 的 IP 地址范围为 199.36.153.4/30

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.googleapis.com." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    替换以下内容:

    • RESPONSE_POLICY_RULE:响应政策规则的名称。
    • RESPONSE_POLICY:您在上一步中创建的响应政策的名称(用英文引号括起来)。
  5. 向响应政策添加规则,以将 *.run.app 解析为 restricted.googleapis.comrestricted.googleapis.com 的 IP 地址范围为 199.36.153.4/30

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.run.app." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    替换以下内容:

    • RESPONSE_POLICY_RULE:响应政策规则的名称。
    • RESPONSE_POLICY:您在上一步中指定的响应政策的名称(用英文引号括起来)。

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

  • 无法离开 VPC 网络,从而阻止服务边界以外的出站流量。
  • 只能访问检查 VPC Service Controls 的 Google API 和服务,从而防止通过 Google API 发生渗漏。

部署符合 VPC Service Controls 要求的 Cloud Run 服务和作业

为 Cloud Run 配置 VPC Service Controls 后,请确保服务边界内部署的所有 Cloud Run 服务和作业都已启用 VPC Service Controls。这需要满足以下条件:

  • Cloud Run 服务和作业必须使用直接 VPC 出站流量或无服务器 VPC 访问通道连接器。 如需了解详情,请参见连接到 VPC 网络
  • Cloud Run 服务和作业必须通过 VPC 网络路由所有传出流量。 如需了解详情,请参阅出站流量设置
  • Cloud Run 服务必须仅允许来自内部来源的流量。如需了解详情,请参阅入站流量设置。 将入站流量设置为“全部”可停用 VPC Service Controls 强制执行。

审核现有服务是否符合 VPC Service Controls 规范

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

Google 建议您定期审核您的服务,以确保您的入站流量和出站流量设置符合要求,并根据需要更新或重新部署服务。例如,您可以创建一个脚本,该脚本使用 Cloud Run Admin API 列出您的服务,并突出显示未指定的正确网络设置。