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

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

概览

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

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

  • 允许对入站或出站 API 调用(进入或离开服务边界边界)使用这些访问权限级别条件。

此功能具有以下优势:

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

  • 如果 Workflows 需要 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 地址范围

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

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

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

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

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

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

您可以使用 VPC Service Controls 仅允许 Project1 中的 VM1 使用内部 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

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

配置入站政策,以允许向 Cloud Storage 存储桶发送入站 API 流量

如需仅允许从 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 文件中将 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 地址范围发送出站流量。