本页面介绍了如何使用入站流量和出站流量规则允许 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 地址
在基本访问权限级别条件的
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 地址范围。在
VpcNetworkSource
的VpcSubNetwork
字段中指定的 IP 地址范围必须遵循 CIDR 块 IP 子网规范。您可以使用任何有效的 IPv4 范围作为子网的 IP 地址范围。
将此访问权限级别与
IngressSource
或EgressSource
中的允许条件搭配使用。
以下部分将通过一个示例场景来介绍如何执行这些步骤以启用内部 IP 地址。
使用内部 IP 地址设置子网访问权限的示例
在以下示例中,您有两个项目:
网络宿主项目:
Project1
托管 VPC 网络:default
。Project1
中的两个虚拟机VM1
和VM2
使用此网络作为网络接口来发送流量。Cloud Storage 项目:
Project2
包含 Cloud Storage 存储桶。
您可以使用 VPC Service Controls,仅允许 VM1
从 Project1
使用内部 IP 地址访问 Project2
中的 Cloud Storage 存储桶。如需实现此设置,您需要执行以下步骤:
您围绕
Project1
创建了一个服务边界sp1
,并围绕Project2
创建了另一个服务边界sp2
。然后,您可以向服务边界添加入站流量规则和出站流量规则,以便仅允许
VM1
的子网访问 Cloud Storage 存储桶。
下图显示了此示例中所述的设置。
在组织级别配置访问权限政策
确保您在组织级别拥有访问权限政策。如果您没有此级别的访问权限政策,请运行以下 gcloud CLI 命令:
gcloud access-context-manager policies create \ --organization=ORGANIZATION_ID --title=POLICY_TITLE
替换以下内容:
ORGANIZATION_ID:贵组织的数字 ID。
POLICY_TITLE:人类可读的访问权限政策标题。
如需了解详情,请参阅创建组织级别访问权限政策。
如需将此政策设置为默认访问权限政策,请运行以下 gcloud CLI 命令:
gcloud config set access_context_manager/policy POLICY_NAME
将 POLICY_NAME 替换为访问权限政策的数字名称。
如需了解详情,请参阅为
gcloud
命令行工具设置默认访问权限政策。
创建边界以保护网络主机项目和 Cloud Storage 项目
如需围绕
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
。
如需围绕
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
子网的流量。
创建一个用于定义访问权限条件的 YAML 文件。以下示例仅显示了启用内部 IP 地址所需的属性:
echo """ - vpcNetworkSources: - vpcSubnetwork: network: VPC_NETWORK_NAME vpcIpSubnetworks: - IP_RANGE """ > level.yaml
替换以下内容:
VPC_NETWORK_NAME:
VM1
所在的 VPC 网络的名称。例如//compute.googleapis.com/projects/Project1/global/networks/default
。IP_RANGE:子网的 IP 地址范围例如
10.10.0.0/24
。
使用前面介绍过的 VPC 网络名称和 IP 地址范围格式。
如需详细了解 YAML 文件,请参阅
basic-level-spec
YAML 文件。如需使用 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 流量进入该边界。
创建用于定义入站流量政策的 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 文件,请参阅入站流量规则参考文档。
如需更新服务边界的入站流量政策,请运行以下 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 流量离开边界。
创建用于定义出站流量政策的 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 文件,请参阅出站流量规则参考文档。
如需更新服务边界的出站流量政策,请运行以下命令:
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 地址仿冒风险: