允许从 VPC Service Controls 边界内的专用端点访问受保护的资源

在共享 VPC 架构中,宿主项目的网络会共享给服务项目。此前,这种情况导致无法将这些项目划分到不同的边界中。现在,借助基于专用 IP 地址的入站和出站规则,宿主项目和服务项目可以位于不同的边界内,并继续通过这些规则实施访问控制。

参考架构

服务政策中使用了以下属性:

  • VPC Service Controls 边界
  • Access Context Manager 专用 IP 地址
  • 入站规则和出站规则

在网络组件中,此架构使用 Private Service Connect 端点来访问 Google API。

使用 VPC Service Controls 创建服务边界的架构图。

本参考架构采用入站和出站规则以及专用 IP 地址,来控制以下服务边界和项目中的 Compute Engine 实例与 Vertex AI API 之间的访问:

边界 边界内的项目
aiml-host-perimeter aiml-host-project
high-trust-svc-perimeter ph-fm-svc-project-1
low-trust-svc-perimeter ph-fm-svc-project-2ph-fm-svc-project-3

从每个服务项目自己的 Compute Engine 实例访问 Vertex AI API 的权限由 VPC Service Controls 入站和出站规则来控制。这些规则使用通过专用 IP 地址配置的 Access Context Manager 访问权限级别,来允许与每个服务项目共享的子网访问其各自的边界。

可选:为组织公共流量创建访问权限级别

如果您的最终用户需要通过Google Cloud 控制台访问 Vertex AI,请按照本部分中的说明创建可在 VPC Service Controls 中使用的访问权限级别。不过,如果对 API 的访问完全是通过私密来源(例如使用本地专用 Google 访问通道的本地环境或 Cloud Workstations)以程序化方式进行的,则不需要访问权限级别。

在此参考架构中,我们使用 CIDR 范围 corp-public-block 来允许组织员工流量访问Google Cloud 控制台。

Access Context Manager 允许 Google Cloud 组织管理员为 Google Cloud中的资源定义基于属性的精细访问权限控制。

访问权限级别说明了请求得以执行所需满足的要求。例如:

  • 设备类型和操作系统(需要 Chrome 企业进阶版许可)
  • IP 地址
  • 地理位置
  • 用户身份

如果组织是首次使用 Access Context Manager,其管理员必须定义访问权限政策,这是访问权限级别和服务边界的容器。方法如下:

  1. 在 Google Cloud 控制台顶部的项目选择器中,点击全部标签页,然后选择您的组织。
  2. 按照创建基本访问权限级别页面中的说明创建基本访问权限级别。指定以下选项:
    1. 使用以下模式创建条件下,选择基本模式
    2. 访问权限级别标题字段中,输入 corp-public-block
    3. 条件部分,对于满足条件时返回选项,选择 TRUE
    4. IP 子网下,选择公共 IP
    5. 对于 IP 地址范围,指定需要访问 VPC Service Controls 边界的外部 CIDR 范围。

构建 VPC Service Controls 服务边界

创建服务边界时,您可以通过创建访问权限级别(在本示例中使用 IP 地址)来允许从边界外访问受保护的服务。在此参考架构中,创建了多个服务边界,这些边界使用入站和出站规则来控制对 Vertex AI API 和 Compute Engine API 通信的访问权限,如下所示:

  • 属于服务项目 ph-fm-svc-project-1 的计算资源的子网可以从 aiml-host-project 访问 ph-fm-svc-project-1 中的 Vertex AI API 和 Compute Engine API。
  • 属于服务项目 ph-fm-svc-project-2ph-fm-svc-project-3 的计算资源的子网可以从 aiml-host-project 访问项目 ph-fm-svc-project-2 和项目 ph-fm-svc-project-3 中的 Vertex AI API 和 Compute Engine API。

每个服务项目都可以访问宿主项目中的 Compute Engine API(因为在给定服务项目中创建计算资源时,宿主项目与服务项目之间会发生双向流量)。

在此参考架构中,为每个子网创建了一个访问权限级别,以使用入站和出站规则来允许宿主项目边界与每个服务项目边界之间进行所需的流量传输。

创建访问权限级别 gce-subnet-1

  1. 在 Google Cloud 控制台顶部的项目选择器中,点击全部标签页,然后选择您的组织。
  2. 按照创建基本访问权限级别页面中的说明创建基本访问权限级别。指定以下选项:
    1. 使用以下模式创建条件下,选择基本模式
    2. 访问权限级别标题字段中,输入 gce-subnet-1
    3. 条件部分,对于满足条件时返回选项,选择 TRUE
    4. IP 子网下,选择专用 IP
    5. 选择 VPC 网络,找到您的项目,然后选择您的 VPC 名称
    6. IP 子网部分,选择表示宿主项目与 ph-fm-svc-project-1 共享的子网的 CIDR 范围。

创建访问权限级别 gce-subnet-2

  1. 在 Google Cloud 控制台顶部的项目选择器中,点击全部标签页,然后选择您的组织。
  2. 按照创建基本访问权限级别页面中的说明创建基本访问权限级别。指定以下选项:
    1. 使用以下模式创建条件下,选择基本模式
    2. 访问权限级别标题字段中,输入 gce-subnet-2
    3. 条件部分,对于满足条件时返回选项,选择 TRUE
    4. IP 子网下,选择专用 IP
    5. 选择 VPC 网络,找到您的项目,然后选择您的 VPC 名称
    6. IP 子网部分,选择表示宿主项目与 ph-fm-svc-project-2 共享的子网的 CIDR 范围。

创建访问权限级别 gce-subnet-3

  1. 在 Google Cloud 控制台顶部的项目选择器中,点击全部标签页,然后选择您的组织。
  2. 按照创建基本访问权限级别页面中的说明创建基本访问权限级别。指定以下选项:
    1. 使用以下模式创建条件下,选择基本模式
    2. 访问权限级别标题字段中,输入 gce-subnet-3
    3. 条件部分,对于满足条件时返回选项,选择 TRUE
    4. IP 子网下,选择专用 IP
    5. 选择 VPC 网络,找到您的项目,然后选择您的 VPC 名称
    6. IP 子网部分,选择表示宿主项目与 ph-fm-svc-project-3 共享的子网的 CIDR 范围。

aiml-host-perimeter 的配置步骤

选择新边界的配置类型

在本部分中,您将以试运行模式创建 VPC Service Controls (aiml-host-perimeter) 服务边界。在试运行模式下,服务边界会像强制执行时一样记录违规行为,但并不会阻止对受限服务的访问。建议的最佳实践是在切换到强制执行模式之前先使用试运行模式。

  1. 在 Google Cloud 控制台导航菜单中,点击安全,然后点击 VPC Service Controls

    转到“安全”

  2. 如果系统提示,请选择您的组织、文件夹或项目。

  3. VPC Service Controls 页面上,点击试运行模式

  4. 点击新建边界

  5. 新建 VPC 服务边界标签页的边界名称框中,为边界输入一个名称,例如 aiml-host-perimeter

    边界名称的最大长度为 50 个字符,必须以字母开头,并且只能包含 ASCII 拉丁字母(a-zA-Z)、数字 (0-9) 和下划线 (_)。边界名称区分大小写,并且在一个访问政策中必须是唯一的。

  6. 接受边界的默认设置。

选择要保护的资源

  1. 点击要保护的资源
  2. 如需添加要在边界内保护的项目或 VPC 网络,请执行以下操作:
    1. 点击添加资源
    2. 如需将项目添加到边界中,请在添加资源窗格中,点击添加项目
      1. 选择要添加的项目,在本例中为 aiml-host-project
      2. 点击添加所选资源。添加的项目会显示在项目部分中。

选择受限服务

在此参考架构中,受限 API 的范围仅限于 Vertex AI 所需的必要 API。不过,作为一项最佳实践,我们建议您在创建边界时对所有服务施加限制,以降低 Google Cloud 服务发生数据渗漏的风险。

如需选择要在边界内保护的服务,请执行以下操作:

  1. 点击受限的服务
  2. 受限的服务窗格中,点击添加服务
  3. 指定要限制的服务对话框中,选择 Compute Engine API。
  4. 点击添加 Compute Engine API

可选:选择 VPC 可访问的服务

VPC 可访问的服务这项设置可限制能够从您的服务边界内的网络端点访问哪些服务。在此参考架构中,我们保留了所有服务这项默认设置。

可选:选择访问权限级别

如果您在前面部分创建了公司 CIDR 访问权限级别,请执行以下操作,以允许从边界外访问受保护的资源:

  1. 点击访问权限级别
  2. 点击选择访问权限级别框。

    您也可以在创建边界后添加访问权限级别

  3. 选中与相应访问权限级别对应的复选框。(此参考架构中为 corp-public-block。)

配置入站政策

在给定服务项目中创建计算资源时,宿主项目和服务项目之间会进行双向通信,因为宿主项目拥有包含与服务项目共享的子网的 VPC 网络。在本部分中,您将配置一项入站规则,允许所有三个服务项目访问宿主项目中的计算资源来实现这些流量传输。

  1. 在左侧菜单中,点击入站政策
  2. 点击添加规则
  3. 入站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
      2. 来源:项目(ph-fm-svc-project-1ph-fm-svc-project-2ph-fm-svc-project-3
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所有项目
      2. 服务:所选服务
      3. 所选服务:Compute Engine API
      4. 方法:所有方法

配置出站政策

在本部分中,您将配置两条出站规则。

第一条出站规则

由于宿主项目拥有与 ph-fm-svc-project-1 共享的子网,因此需要一条出站规则来允许该子网从宿主项目的边界访问 ph-fm-svc-project-1 的边界。当最终用户使用配置的访问权限级别在服务项目中创建计算资源时,公司访问权限级别可实现创建计算实例所需的双向通信。

  1. 在左侧菜单中,点击出站政策
  2. 点击添加规则
  3. 出站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
      2. 选择启用访问权限级别的出站流量来源
      3. 访问权限级别 corp-public-blockgce-subnet-1
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所选项目
      2. 添加项目ph-fm-svc-project-1
      3. 服务:所有服务

第二条出站规则

由于宿主项目拥有与 ph-fm-svc-project-2ph-fm-svc-project-3 共享的子网,因此需要一条出站规则来允许这些子网从宿主项目的边界访问服务项目的边界。当最终用户使用配置的访问权限级别在服务项目中创建计算资源时,公司访问权限级别可实现创建计算实例所需的双向通信。

  1. 在左侧菜单中,点击出站政策
  2. 点击添加规则
  3. 出站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
      2. 选择启用访问权限级别的出站流量来源
      3. 访问权限级别 corp-public-blockgce-subnet-2gce-subnet-3
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所选项目
      2. 添加项目ph-fm-svc-project-2ph-fm-svc-project-3
      3. 服务:所有服务

创建边界

完成上述配置步骤后,点击创建边界来创建边界。

high-trust-svc-perimeter 的配置步骤

选择新边界的配置类型

  1. 在 Google Cloud 控制台导航菜单中,点击安全,然后点击 VPC Service Controls

    转到“安全”

  2. 如果系统提示,请选择您的组织、文件夹或项目。

  3. VPC Service Controls 页面上,点击试运行模式

  4. 点击新建边界

  5. 新建 VPC 服务边界标签页的边界名称框中,为边界输入一个名称,例如 high-trust-svc-perimeter

    边界名称的最大长度为 50 个字符,必须以字母开头,并且只能包含 ASCII 拉丁字母(a-zA-Z)、数字 (0-9) 和下划线 (_)。边界名称区分大小写,并且在一个访问政策中必须是唯一的。

  6. 接受边界的默认设置。

选择要保护的资源

  1. 点击要保护的资源
  2. 如需添加要在边界内保护的项目或 VPC 网络,请执行以下操作:
    1. 点击添加资源
    2. 如需将项目添加到边界中,请在添加资源窗格中,点击添加项目
      1. 选择要添加的项目,在本例中为 ph-fm-svc-project-1
      2. 点击添加所选资源。添加的项目会显示在项目部分中。

选择受限服务

在此参考架构中,受限 API 的范围仅限于 Gemini 所需的必要 API。不过,作为一项最佳实践,我们建议您在创建边界时对所有服务施加限制,以降低 Google Cloud 服务发生数据渗漏的风险。

如需选择要在边界内保护的服务,请执行以下操作:

  1. 点击受限的服务
  2. 受限的服务窗格中,点击添加服务
  3. 指定要限制的服务对话框中,选择 Compute Engine API。
  4. 点击添加 Compute Engine API
  5. 受限的服务窗格中,点击添加服务
  6. 指定要限制的服务对话框中,选择 Vertex AI API。
  7. 点击添加 Vertex AI API

可选:选择 VPC 可访问的服务

VPC 可访问的服务这项设置可限制能够从您的服务边界内的网络端点访问哪些服务。在此参考架构中,我们保留了所有服务这项默认设置。

可选:选择访问权限级别

如果您在前面部分创建了公司 CIDR 访问权限级别,请执行以下操作,以允许从边界外访问受保护的资源:

  1. 点击访问权限级别
  2. 点击选择访问权限级别框。

    您也可以在创建边界后添加访问权限级别

  3. 选中与相应访问权限级别对应的复选框。(此参考架构中为 corp-public-block。)

配置入站政策

由于宿主项目拥有与 ph-fm-svc-project-1 共享的子网,因此需要一条入站规则来允许该子网从宿主项目访问 ph-fm-svc-project-1 的边界。这样一来,ph-fm-svc-project-1 的计算实例便可访问 ph-fm-svc-project-1 内的托管式服务。

  1. 在左侧菜单中,点击入站政策
  2. 点击添加规则
  3. 入站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
      2. 来源:访问权限级别
      3. 访问权限级别gce-subnet-1
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所有项目
      2. 服务:所有服务

配置出站政策

由于宿主项目拥有与 ph-fm-svc-project-1 共享的子网,因此在服务项目中创建计算资源时,需要一条出站规则来允许该服务项目与宿主项目之间的双向通信。

  1. 在左侧菜单中,点击出站政策
  2. 点击添加规则
  3. 出站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所选项目
      2. 添加项目aiml-host-project
      3. 服务:所选服务
      4. 所选服务:Compute Engine API
      5. 方法:所有方法

创建边界

完成上述配置步骤后,点击创建边界来创建边界。

low-trust-svc-perimeter 的配置步骤

选择新边界的配置类型

  1. 在 Google Cloud 控制台导航菜单中,点击安全,然后点击 VPC Service Controls

    转到“安全”

  2. 如果系统提示,请选择您的组织、文件夹或项目。

  3. VPC Service Controls 页面上,点击试运行模式

  4. 点击新建边界

  5. 新建 VPC 服务边界标签页的边界名称框中,为边界输入一个名称,例如 low-trust-svc-perimeter

    边界名称的最大长度为 50 个字符,必须以字母开头,并且只能包含 ASCII 拉丁字母(a-zA-Z)、数字 (0-9) 和下划线 (_)。边界名称区分大小写,并且在一个访问政策中必须是唯一的。

  6. 接受边界的默认设置。

选择要保护的资源

  1. 点击要保护的资源
  2. 如需添加要在边界内保护的项目或 VPC 网络,请执行以下操作:
    1. 点击添加资源
    2. 如需将项目添加到边界中,请在添加资源窗格中,点击添加项目
      1. 选择要添加的项目。对于此参考架构,请选择以下项目:
        • ph-fm-svc-project-2
        • ph-fm-svc-project-3
      2. 点击添加所选资源。添加的项目会显示在项目部分中。

选择受限服务

在此参考架构中,受限 API 的范围仅限于 Gemini 所需的必要 API。不过,作为一项最佳实践,我们建议您在创建边界时对所有服务施加限制,以降低 Google Cloud 服务发生数据渗漏的风险。

如需选择要在边界内保护的服务,请执行以下操作:

  1. 点击受限的服务
  2. 受限的服务窗格中,点击添加服务
  3. 指定要限制的服务对话框中,选择 Compute Engine API。
  4. 点击添加 Compute Engine API
  5. 受限的服务窗格中,点击添加服务
  6. 指定要限制的服务对话框中,选择 Vertex AI API。
  7. 点击添加 Vertex AI API

可选:选择 VPC 可访问的服务

VPC 可访问的服务这项设置可限制能够从您的服务边界内的网络端点访问哪些服务。在此参考架构中,我们保留了所有服务这项默认设置。

可选:选择访问权限级别

如果您在前面部分创建了公司 CIDR 访问权限级别,请执行以下操作,以允许从边界外访问受保护的资源:

  1. 点击访问权限级别
  2. 点击选择访问权限级别框。

    您也可以在创建边界后添加访问权限级别

  3. 选中与相应访问权限级别对应的复选框。(此参考架构中为 corp-public-block。)

配置入站政策

由于宿主项目拥有与 ph-fm-svc-project-2ph-fm-svc-project-3 共享的子网,因此需要一条入站规则来授予这些子网从宿主项目访问服务项目边界的权限。这样一来,这些服务项目的计算实例便可访问 ph-fm-svc-project-2ph-fm-svc-project-3 中的托管式服务。

  1. 在左侧菜单中,点击入站政策
  2. 点击添加规则
  3. 入站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
      2. 来源:访问权限级别
      3. 访问权限级别gce-subnet-2gce-subnet-3
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所有项目
      2. 服务:所有服务

配置出站政策

由于宿主项目拥有与 ph-fm-svc-project-2ph-fm-svc-project-3 共享的子网,因此在服务项目中创建计算资源时,需要一条出站规则来允许这些服务项目与宿主项目之间的双向通信。

  1. 在左侧菜单中,点击出站政策
  2. 点击添加规则
  3. 出站规则窗格中,执行以下操作:
    1. “来源”属性部分,选择 API 客户端的以下“来源”属性:
      1. 身份:任何身份
    2. “目标”属性部分,选择 Google Cloud服务和资源的以下“目标”属性:
      1. 项目:所选项目
      2. 添加项目aiml-host-project
      3. 服务:所选服务
      4. 所选服务:Compute Engine API
      5. 方法:所有方法

创建边界

完成上述配置步骤后,点击创建边界来创建边界。

配置网络

使用 Private Service Connect 端点访问 Google API

用于访问 Google API 的 Private Service Connect 是使用专用 Google 访问通道或 Google API 的公共域名的替代方案。在这种情况下,提供方是 Google。

使用 Private Service Connect 可以执行以下操作:

  • 创建一个或多个内部 IP 地址,以访问适用于不同应用场景的 Google API。
  • 访问 Google API 时,将本地流量定向到特定 IP 地址和区域。
  • 创建用于解析 Google API 的自定义端点 DNS 名称。

在此参考架构中,一个名为 restricted 且 IP 地址为 192.168.10.2 的 Private Service Connect Google API 端点将部署在目标 VPC Service Controls 中,用作虚拟 IP (VIP) 来访问在 VPC Service Controls 边界内配置的受限服务。Private Service Connect 端点部署在宿主项目 aiml-host-project 中。

通过 Compute Engine 实例访问 Gemini Pro

创建 Private Service Connect 端点时,Service Directory 会在 p.googleapis.com 专用区域中创建 DNS 记录。这些记录会指向端点 IP 地址,并采用 SERVICE-ENDPOINT.p.googleapis.com 格式,该格式的地址等同于用于访问 Vertex AI API 的完全限定域名:LOCATION-aiplatform-restricted.p.googleapis.com

验证网络配置

在服务项目中部署的 Compute Engine 实例中,执行以下步骤更新 Vertex AI API 以使用自定义完全限定域名并进行验证。

  1. 按如下方式初始化 Python 环境变量:

    PROJECT_ID="ph-fm-svc-project-1"
    LOCATION_ID="us-central1"
    API_ENDPOINT="us-central1-aiplatform-restricted.p.googleapis.com"
    MODEL_ID="gemini-2.0-flash-exp"
    GENERATE_CONTENT_API="streamGenerateContent"
    
  2. 使用文本编辑器创建一个包含以下 JSON 内容的 request.json 文件:

    {
      "contents": [
        {
          "role": "user",
          "parts": [
            {
              "text": "what weight more 1kg feathers vs 1kg stones"
            }
          ]
        }
      ],
      "generationConfig": {
        "temperature": 1,
        "maxOutputTokens": 8192,
        "topP": 0.95,
        "seed": 0
      },
      "safetySettings": [
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "threshold": "OFF"
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "threshold": "OFF"
        },
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "threshold": "OFF"
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "threshold": "OFF"
        }
      ]
    }
    
  3. 向 Vertex AI Gemini API 发出以下 cURL 请求:

    curl \
    -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://${API_ENDPOINT}/v1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:${GENERATE_CONTENT_API}" -d '@request.json'
    

在试运行模式下验证边界

在此参考架构中,服务边界被配置为试运行模式,可让您在不强制执行的情况下测试访问权限政策的效果。这意味着,您可以了解政策在有效状态下会对环境产生何种影响,但又不会有中断合法流量的风险。

如需了解如何在试运行模式下验证边界,请观看 VPC Service Controls 试运行日志记录 YouTube 视频。

在试运行模式下验证边界后,便可将其切换为强制执行模式