允许从内部 IP 地址访问受保护的资源

本页面介绍了如何允许来自内部 IP 地址的流量通过 使用入站和出站规则的 VPC 网络到服务边界。

概览

您可以使用 VPC Service Controls 来指定允许特定 IP 的条件 以确保其 VPC 网络地址可用于访问受保护的 项目和 VPC 网络借助此功能,您可以执行以下操作 任务:

  • 支持基本访问权限 level 条件 允许 VPC 网络的内部 IP 地址范围。

  • 允许为 Ingress 或 egress API 使用这些访问权限级别条件 服务边界之间的调用

此功能具有以下优势:

  • 您可以在 VPC Service Controls 配置中指定条件,以允许 通过 VPC 网络中的内部 IP 地址进行访问。

  • 需要 API 调用以通过多个服务边界的 Workflows 可以限制访问仅允许几个子网, 整个 VPC 网络或项目

  • 您可以在本地配置不同的资源 只能访问特定的 Google Cloud 资源。您需要使用子网的 IP 与这些本地资源和着陆区关联的地址范围 VPC 网络作为访问权限级别的一部分。

图 1 显示了一个允许访问特定受保护 从已获授权的内部 IP 地址访问 Cloud Storage 存储分区。

使用内部 IP 地址的限制

在 VPC Service Controls 中使用内部 IP 地址时,以下事项: 存在一些限制:

  • 您只能通过基本访问权限级别启用内部 IP 地址, 和自定义访问权限级别

  • 建议您不要使用内部 IP 地址排除访问权限级别 因为这可能会导致意外行为。

  • 局限性 将 VPC 网络添加到服务边界的功能也适用

  • 当 VPC Service Controls 记录政策拒绝审核日志时,它会隐去名称 作为 __UNKNOWN__ 在审核日志中 VPC 网络。

  • SUBNET_MODE 设置为 custom 的 VPC 网络 但又没有子网,则都是不受支持的。启用内部 IP 地址 要求 VPC 网络必须至少包含一个子网。

  • 您只能指定 500 个 VPC 跨所有网络 访问多个访问权限级别

  • 删除访问权限所引用的 VPC 网络时 或服务边界,然后重新创建 VPC Service Controls 不会自动启用 内部 IP 地址。接收者 突破这个限制,创建一个 VPC 网络 不同的名称,并将其添加到边界。

  • 您无法使用内部 IP 地址来允许通过 Google 管理的访问 服务。例如,Cloud SQL。

  • 如果您使用的访问权限级别具有基于内部 IP 地址的条件 出站规则时,我们建议您不要添加任何其他条件, 例如设备类型、用户身份到访问权限级别

  • 内部 IP 地址与引用地理位置的访问权限级别不符 区域。

在访问权限级别中使用内部 IP 地址

  1. 指定 VPC 网络名称和 IP 地址范围, 基本访问权限级别的 vpcNetworkSources 字段 条件

    • VPC 网络名称。您必须定义 VPC 网络名称,格式如下:

      //compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME
      

      例如 //compute.googleapis.com/projects/my-project/global/networks/my-vpc

    • IP 地址范围VpcSubNetwork 中指定的 IP 地址范围 字段 VpcNetworkSource 必须遵循 CIDR 地址块 IP 子网规范。您可以使用任何 IP 地址 范围,这是子网的有效 IPv4 范围

  2. IngressSourceEgressSource.

以下部分通过一个示例场景介绍了如何执行上述操作, 启用内部 IP 地址的步骤。

使用内部 IP 地址设置子网访问权限的示例

在以下示例中,您有两个项目:

  1. 网络宿主项目Project1 托管 VPC 网络: defaultProject1VM1VM2 中的两个虚拟机将此网络用作 用于发送流量的网络接口

  2. Cloud Storage 项目Project2 包含一个 Cloud Storage 存储桶。

您可以使用 VPC Service Controls 来仅允许 Project1VM1 访问 使用内部 IP 地址的 Project2 中的 Cloud Storage 存储桶。 如需实现此设置,您需要执行以下步骤:

  1. 您为 Project1 和另一项服务创建了一个服务边界“sp1Project2周围方圆 sp2 内的边界。

  2. 然后,您可以将入站和出站规则添加到服务边界, 仅允许 VM1 的子网访问 Cloud Storage 存储桶。

下图显示了此示例中所述的设置。

在组织级别配置访问权限政策

  1. 确保您在组织级别拥有访问权限政策。如果您 在此级别没有访问权限政策,请运行以下命令 gcloud CLI 命令:

    gcloud access-context-manager policies create \
        --organization=ORGANIZATION_ID --title=POLICY_TITLE
    

    替换以下内容:

    • ORGANIZATION_ID:您的组织的数字 ID。

    • POLICY_TITLE:人类可读的访问权限政策标题。

    如需了解详情,请参阅创建组织级访问权限 政策

  2. 获取访问权限的名称 政策

  3. 如需将此政策设为默认访问权限政策,请运行以下命令 gcloud CLI 命令:

    gcloud config set access_context_manager/policy POLICY_NAME
    

    POLICY_NAME 替换为您的访问权限政策的数字名称。

    有关详情,请参阅设置默认访问权限政策 gcloud 命令行工具

创建边界以保护网络宿主项目和 Cloud Storage 项目

  1. 如需围绕 Project1 创建边界 sp1,请运行以下命令 gcloud CLI 命令:

    gcloud access-context-manager perimeters create sp1 --title="sp1" --resources=PROJECT_NUMBER \
        --restricted-services=storage.googleapis.com --policy=POLICY_NAME
    

    替换以下内容:

    • PROJECT_NUMBER:网络宿主项目的项目编号。 例如 projects/111

    • POLICY_NAME:您的访问权限政策的数字名称。例如 1234567890

  2. 围绕 Project2 创建一个限制sp2 Cloud Storage 服务,请运行以下 gcloud CLI 命令:

    gcloud access-context-manager perimeters create sp2 --title="sp2" --resources=PROJECT_NUMBER \
        --restricted-services=storage.googleapis.com --policy=POLICY_NAME
    

    替换以下内容:

    • PROJECT_NUMBER:Cloud Storage 的项目编号 项目。例如 projects/222

    • POLICY_NAME:您的访问权限政策的数字名称。例如 1234567890

如需详细了解如何创建服务边界,请参阅创建服务 边界

创建这两个边界后,Cloud Storage 存储桶将不再 两个虚拟机均可访问。

创建使用基于内部 IP 地址的访问条件的访问权限级别

创建一个仅允许来自该 VM1 子网的流量的访问权限级别。

  1. 创建一个定义您的访问权限条件的 YAML 文件。以下示例 仅显示启用内部 IP 地址所需的属性:

    echo """
    - vpcNetworkSources:
      - vpcSubnetwork:
          network: VPC_NETWORK_NAME
          vpcIpSubnetworks:
          - IP_RANGE
    
    """ > level.yaml
    

    替换以下内容:

    • VPC_NETWORK_NAME:VPC 网络的名称 VM1 的存储位置。例如 //compute.googleapis.com/projects/Project1/global/networks/default

    • IP_RANGE:子网的 IP 地址范围。例如 10.10.0.0/24

    请使用 VPC 网络名称和 IP 地址范围格式 如上文所述

    如需详细了解 YAML 文件,请参阅 basic-level-spec YAML 文件

  2. 如需使用 YAML 文件创建访问权限级别,请运行以下命令 gcloud CLI 命令:

    gcloud access-context-manager levels create LEVEL_NAME \
        --title="TITLE" --basic-level-spec=FILE_NAME
    

    替换以下内容:

    • LEVEL_NAME:访问权限级别的唯一名称。例如 allowvm1

    • TITLE:访问权限级别的简短易懂标题。 例如 allowvm1

    • FILE_NAME:用于定义访问权限条件的 YAML 文件 权限级别例如 level.yaml

    如需了解详情,请参阅创建基本访问权限 级别

配置入站流量政策以允许入站 API 流量进入 Cloud Storage 存储桶

要仅允许来自“VM1”的访问,请在“sp2”中配置入站流量政策 以允许 Cloud Storage API 流量进入该边界。

  1. 创建一个定义入站流量政策的 YAML 文件。

    echo """
    - ingressFrom:
        identityType: ANY_IDENTITY
        sources:
        - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
      ingressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: storage.googleapis.com
        resources:
        - '*'
    
    """ > ingress.yaml
    

    替换以下内容:

    • POLICY_NAME:您的访问权限政策的数字名称。例如 1234567890

    • ACCESS_LEVEL_NAME:访问权限级别的名称。例如 allowvm1

    如需详细了解 YAML 文件,请参阅入站流量规则 参考

  2. 如需更新服务边界的入站流量政策,请运行以下命令 gcloud CLI 命令:

    gcloud access-context-manager perimeters update PERIMETER --set-ingress-policies=FILE_NAME
    

    替换以下内容:

    • PERIMETER:保护 Cloud Storage 项目中。例如 sp2

    • FILE_NAME:用于定义入站流量政策的 YAML 文件。例如 ingress.yaml

    有关详情,请参阅更新 服务边界

配置出站流量政策以允许出站 API 流量传入 Cloud Storage 存储桶

此外,请在 sp1 边界中配置出站流量政策,以允许 流出边界的 Cloud Storage API 流量。

  1. 创建用于定义出站流量政策的 YAML 文件。确保将 YAML 中的 SOURCE_RESTRICTION_ENABLED 形式的 sourceRestriction 字段 文件。

    echo """
    - egressFrom:
        identityType: ANY_IDENTITY
        sourceRestriction: SOURCE_RESTRICTION_ENABLED
        sources:
        - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
      egressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: storage.googleapis.com
        resources:
        - '*'
    
    """ > egress.yaml
    

    替换以下内容:

    • POLICY_NAME:您的访问权限政策的数字名称。例如 1234567890

    • ACCESS_LEVEL_NAME:访问权限级别的名称。例如 allowvm1

    如需详细了解 YAML 文件,请参阅出站规则 参考

  2. 如需更新服务边界的出站流量政策,请运行以下命令 命令:

    gcloud access-context-manager perimeters update PERIMETER --set-egress-policies=FILE_NAME
    

    替换以下内容:

    • PERIMETER:保护 网络宿主项目。例如 sp1

    • FILE_NAME:用于定义出站流量政策的 YAML 文件。例如 egress.yaml

    有关详情,请参阅更新 服务边界

配置入站和出站政策后,Cloud Storage 存储桶 可通过 VM1 访问,而 Cloud Storage 存储桶不能 可从 VM2 访问。

建议

  • 在启用内部 IP 地址时,我们建议您停用 IP 地址 为虚拟机转发流量。IP 转发 允许同一 VPC 网络中的虚拟机发送请求 ,从而存在 IP 地址仿冒的风险。

  • 如果您希望启用 IP 转发,那么我们建议您使用 以下配置来降低 IP 地址仿冒的风险:

    • 使用 Restrict VM IP Forwarding 组织政策 限制条件 (constraints/compute.vmCanIpForward),确保只有获得授权的虚拟机才能 启用 IP 转发。

    • 使用防火墙规则的来源 来限制与具有 IP 地址的虚拟机通信的 IP 地址 转发。完成以下任务:

      • 设置入站防火墙规则,仅允许来自特定 启用了 IP 转发的虚拟机的 IP 地址范围。

      • 设置出站防火墙规则,仅允许流向特定 已启用 IP 转发的虚拟机的 IP 地址范围。