本页介绍了如何使用入站和出站规则允许从 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 地址
指定 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 地址范围。
VpcNetworkSource
的VpcSubNetwork
字段中指定的 IP 地址范围必须遵循 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
周围创建限制 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: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 流量进入该边界。
创建用于定义 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 文件,请参阅入站流量规则参考文档。
如需更新服务边界的入站流量政策,请运行以下 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 中的
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 转发,我们建议您使用以下配置来降低 IP 地址欺骗的风险: