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

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

概览

您可以使用 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 地址访问特定的受保护服务。

使用内部 IP 地址的限制

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

  • 您只能使用基本访问权限级别启用内部 IP 地址,而不能使用自定义访问权限级别。

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

  • 向服务边界添加 VPC 网络时,也适用相关限制

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

  • 不支持将 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 地址范围VpcNetworkSourceVpcSubNetwork 字段中指定的 IP 地址范围必须遵循 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 周围创建了服务边界 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_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. 创建用于定义 Ingress 政策的 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 中的 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 转发,我们建议您使用以下配置来降低 IP 地址欺骗的风险:

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

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

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

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