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

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

概览

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

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

  • 允许使用这些访问权限级别条件来控制入站流量或出站流量 API 调用进入或离开服务边界。

此功能具有以下优势:

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

  • 如果工作流需要 API 调用通过多个服务边界,则可以限制访问权限,仅允许访问部分子网,而不是整个 VPC 网络或项目。

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

图 1 显示了允许通过授权的内部 IP 地址访问特定受保护服务的示例设置。

使用内部 IP 地址的限制

在 VPC Service Controls 中使用内部 IP 地址时,会受到以下限制:

  • 只能在基本访问权限级别中启用内部 IP 地址,无法用于自定义访问权限级别。

  • 我们建议不要对包含内部 IP 地址条件的访问权限级别使用否定逻辑,因为这可能导致意外行为。

  • 添加 VPC 网络到服务边界的限制也适用。

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

  • 不支持将 SUBNET_MODE 设置为 custom 但未配置子网的 VPC 网络。若要启用内部 IP 地址,VPC 网络必须包含至少一个子网。

  • 您只能在访问权限政策中的所有访问权限级别中指定 500 个 VPC 网络

  • 当您删除由访问权限级别或服务边界引用的 VPC 网络,然后重新创建另一个具有相同名称的 VPC 网络时,VPC Service Controls 不会自动在重新创建的 VPC 网络上启用内部 IP 地址。如需克服此限制,请创建一个名称不同的 VPC 网络,并将其添加到边界中。

  • 您不能使用内部 IP 地址来允许来自 Google 管理服务的访问。例如,Cloud SQL。

  • 如果您使用的访问权限级别包含基于内部 IP 地址的条件和出站流量规则,我们建议您不要向该访问权限级别添加任何其他条件(例如设备类型、用户身份)。

  • 内部 IP 地址不适用于基于地理区域的访问权限级别。

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

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

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

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

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

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

  2. 将此访问权限级别与 IngressSourceEgressSource 中的允许条件搭配使用。

以下部分将通过一个示例场景来介绍如何执行这些步骤以启用内部 IP 地址。

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

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

  1. 网络宿主项目Project1 托管 VPC 网络:defaultProject1 中的两个虚拟机 VM1VM2 使用此网络作为网络接口来发送流量。

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

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

  1. 您围绕 Project1 创建了一个服务边界 sp1,并围绕 Project2 创建了另一个服务边界 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 创建限制 Cloud Storage 服务的边界 sp2,请运行以下 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_NAMEVM1 所在的 VPC 网络的名称。例如 //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

    如需了解详情,请参阅更新服务边界的入站流量和出站流量政策

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

此外,还需要在 sp1 边界中配置出站流量政策,以允许 Cloud Storage API 流量离开边界。

  1. 创建用于定义出站流量政策的 YAML 文件。请务必在 YAML 文件中将 sourceRestriction 字段设置为 SOURCE_RESTRICTION_ENABLED

    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

    如需了解详情,请参阅更新服务边界的入站流量和出站流量政策

配置入站流量和出站流量政策后,可以从 VM1 访问 Cloud Storage 存储桶,而 VM2 将无法访问 Cloud Storage 存储桶。

建议

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

  • 如果您想启用 IP 转发,建议采用以下配置来降低 IP 地址仿冒风险:

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

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

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

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