本页面介绍了如何允许来自内部 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 地址
指定 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 范围。
以下部分通过一个示例场景介绍了如何执行上述操作, 启用内部 IP 地址的步骤。
使用内部 IP 地址设置子网访问权限的示例
在以下示例中,您有两个项目:
网络宿主项目:
Project1
托管 VPC 网络:default
。Project1
、VM1
和VM2
中的两个虚拟机将此网络用作 用于发送流量的网络接口Cloud Storage 项目:
Project2
包含一个 Cloud Storage 存储桶。
您可以使用 VPC Service Controls 来仅允许 Project1
的 VM1
访问
使用内部 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
创建一个限制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
子网的流量的访问权限级别。
创建一个定义您的访问权限条件的 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 文件。如需使用 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
。
有关详情,请参阅更新 服务边界。
配置出站流量政策以允许出站 API 流量传入 Cloud Storage 存储桶
此外,请在 sp1
边界中配置出站流量政策,以允许
流出边界的 Cloud Storage API 流量。
创建用于定义出站流量政策的 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 文件,请参阅出站规则 参考。
如需更新服务边界的出站流量政策,请运行以下命令 命令:
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 地址仿冒的风险: