入站规则和出站规则

本页面介绍 VPC Service Controls 的入站和出站规则。VPC Service Controls 使用入站和出站规则来允许访问受服务边界保护的资源和客户端或来自它们的访问。

入站出站规则块指定去往和来自不同身份和资源的允许访问。入站和出站规则可以替换和简化之前需要一个或多个边界网桥的使用场景。

如需了解如何将入站和出站政策应用于服务边界,请参阅配置入站和出站政策

您可以在入站和出站规则中配置身份组和第三方身份预览版)。如需查看使用情形示例,请参阅在入站规则和出站规则中使用身份组和第三方身份的示例

如需查看安全数据交换使用场景和示例的列表,请参阅使用入站和出站规则实现安全数据交换

如需查看情境感知访问权限使用场景和示例的列表,请参阅使用入站规则实现情境感知访问权限

入站和出站规则的优势

  1. 通过入站和出站规则,您可以使用 Google Cloud 服务 API 以专用方式在组织内部和组织之间高效交换数据。
  2. 通过入站和出站规则,您可以根据 API 请求的上下文授予对边界内 Google Cloud 资源的访问权限:
    1. 限制指定来源网络、IP 地址或设备时可使用的身份类型或身份。
    2. 限制指定来源网络、IP 地址、设备和身份类型时可访问的 Google Cloud API 和方法。
  3. 通过限制用于执行数据交换的确切服务、方法、Google Cloud 项目、VPC 网络和身份,最大限度地降低渗漏风险。
  4. 授予对由您管理的外部数据集和映像的只读权限。
  5. 确保低权限细分中的客户端无权访问高权限细分中的 Google Cloud 资源;同时授予相反方向的访问权限。
  6. 简化之前需要一个或多个边界网桥的配置。

入站流量和出站流量的定义

入站流量和出站流量的定义与对资源调用的操作无关。因此,定义指的是请求的方向,而不是数据移动的方向。

  • 入站流量:指服务边界外 API 客户端对服务边界内资源的访问。例如:

    • 服务边界外的 Cloud Storage 客户端对服务边界内的 Cloud Storage 资源调用 Cloud Storage 读取、写入或复制操作。
  • 出站流量:指涉及服务边界内 API 客户端或资源以及服务边界外资源的任何访问。示例:

    • 服务边界内的 Compute Engine 客户端调用 Compute Engine create 操作,其中映像资源位于边界外。
    • 边界内或边界外的 Cloud Storage 客户端调用 copy 命令,其中一个存储桶在边界内,另一个存储桶在边界外。

政策模型

入站或出站规则由 fromto 块组成,其中:

  • from 引用 API 客户端的特性。
  • to 引用 Google Cloud 服务和资源的特性。

一个服务边界可以关联多个入站和出站规则。根据以下语义允许或拒绝 Google Cloud 服务调用:

  • 如果满足必要的入站流量规则的条件,则允许边界外客户端向边界内 Google Cloud 资源发送的请求。
  • 如果满足必要的出站流量规则的条件,则允许边界内客户端向边界外 Google Cloud 资源发送的请求。
  • 如果客户端满足入站规则(如果客户端不在边界内),并且外部资源满足出站规则,则允许调用边界内 Google Cloud 资源和边界外 Google Cloud 资源的 API 调用。

入站规则允许的 API 请求示例

  • 边界外的 Cloud Storage 客户端从边界内的 Cloud Storage 存储桶下载对象到本地机器(例如,使用 gcloud storage cp 命令)。
  • 边界外的 BigQuery 客户端在边界内的项目中使用 BigQuery 作业查询边界内的 BigQuery 数据集(例如,使用 bq query 命令)。
  • 边界外的 VPC 网络中的 Compute Engine 虚拟机会写入边界内的 Cloud Storage 存储桶。

出站规则允许的 API 请求示例

  • 边界内的 Cloud Storage 客户端在边界外的 Cloud Storage 存储桶与边界内的存储桶之间复制对象(例如,使用 gcloud storage cp 命令)。
  • 边界内的 BigQuery 客户端在边界外的项目中使用 BigQuery 作业查询边界内的 BigQuery 数据集(例如,使用 bq query 命令)。

允许入站规则和出站规则共同使用的 API 请求示例

  • 边界外的 Cloud Storage 客户端在边界外的 Cloud Storage 存储桶与边界内的存储桶之间复制对象(例如使用 gcloud storage cp 命令)。
  • 边界外的 BigQuery 客户端在边界外的项目中使用 BigQuery 作业查询边界内的 BigQuery 数据集(例如,使用 bq query 命令)。
  • 边界外的 Compute Engine 客户端使用边界内的 Cloud KMS 密钥创建位于边界外的 Compute Engine 磁盘。

在 BigQuery 和 Compute Engine 示例中,仅有入站规则是不够的,因为 BigQuery 作业或 Compute Engine 磁盘位于边界外。必须使用出站规则允许 API 请求涉及边界内的 Google Cloud 资源(BigQuery 数据集或 Cloud KMS 密钥)和边界外的资源(BigQuery 作业或 Compute Engine 磁盘)。

涉及多个服务边界的 API 请求

在所访问的资源和/或 API 客户端属于不同的服务边界时,所有相关边界的政策必须允许 API 请求。例如,假设 Cloud Storage 客户端和服务边界 A 内的存储桶 a 以及服务边界 B 内的存储桶 b。在此示例中,为了让 Cloud Storage 客户端将对象从存储桶 a 复制到存储桶 b,以及从存储桶 b 复制到存储桶 a,需要以下入站流量和出站流量规则:

  • A 边界中的出站流量规则,以允许访问 Cloud Storage 存储桶 b
  • B 边界中的出站流量规则,以允许访问 Cloud Storage 存储桶 a
  • B 边界中的入站流量规则,以允许边界 B 之外的 Cloud Storage 客户端访问。

入站规则参考

您可以使用 Google Cloud 控制台、JSON 文件或 YAML 文件来配置入站规则。以下示例使用 .yaml 格式:

- ingressFrom:
    identityType: ANY_IDENTITY | ANY_USER_ACCOUNT | ANY_SERVICE_ACCOUNT
    *OR*
    identities:
    - PRINCIPAL_IDENTIFIER
    sources:
    - resource: RESOURCE
      *OR*
    - accessLevel: ACCESS_LEVEL
  ingressTo:
    operations:
    - serviceName: SERVICE
      methodSelectors:
      - method: METHOD
      *OR*
      - permission: PERMISSION
    resources:
    - projects/PROJECT
  • - ingressFrom: -(必需)开始 from 块,其中列出允许的边界外来源和身份。

  • identityType: -(必须使用此特性或 identities 特性)此特性定义可以从指定的 sources(网络来源)使用的身份类型。可接受的值:ANY_IDENTITYANY_USER_ACCOUNTANY_SERVICE_ACCOUNTANY_IDENTITY 允许所有身份。ANY_USER_ACCOUNT 允许所有真人用户。ANY_SERVICE_ACCOUNT 允许所有服务账号。

    此属性不会根据组织限制身份。例如,ANY_SERVICE_ACCOUNT 允许来自任何组织的服务账号。

  • identities: -(必须使用此属性或 identityType 属性)此属性会启动可访问边界内资源的服务账号、用户账号、Google 群组或第三方身份列表。

  • PRINCIPAL_IDENTIFIER:指定您要向其授予对边界内资源的访问权限的用户账号、服务账号、Google 群组或第三方身份。使用 IAM v1 API 主账号标识符中指定的格式。例如,使用 group:GROUP_NAME@googlegroups.com 格式指定 Google 群组。

    VPC Service Controls 仅支持 IAM v1 API 主账号标识符中以 userserviceAccountgroup预览版)、principal预览版)和 principalSet预览版)前缀开头的 v1 身份。

  • sources: -(必需)此特性指的是网络来源列表。列表中的每个值都是访问权限级别或 Google Cloud 项目。如果您将 accessLevel 特性设置为 "*",则入站政策允许来自任何网络来源的访问。 如果您将此属性设置为 Google Cloud 项目,则入站政策会允许来自项目所属 VPC 网络的访问。

    当关联的项目被永久删除时,系统可能会移除此值。 不过,移除此值不会导致错误。在排查任何问题时,请务必检查是否存在此值。

  • - resource: -(使用此属性或 accessLevel 属性)指定要提供访问权限的边界外的项目或 VPC 网络。如需指定项目,请使用以下格式:projects/PROJECT_NUMBER。如需指定 VPC 网络,请使用以下格式://compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME

  • - accessLevel: -(必须使用此特性或 resource 特性)指定被授予访问权限的边界外访问权限级别。如果您将 accessLevel 特性设置为 "*",则入站政策允许来自任何网络来源的访问。

  • ingressTo: -(必需)开始 to 块,其中列出允许对指定的边界内 Google Cloud 资源执行的服务操作。

  • operations: -(必需)标记满足 from 块条件的客户端允许访问的可访问服务和操作/方法列表的开头。

  • - serviceName: -(必需)此字段可以是有效的服务名称,也可以设置为 "*" 以允许访问所有服务。例如,bigquery.googleapis.com 是有效的 serviceName。如需查看可用服务的列表,请参阅支持的产品

  • methodSelectors: -(如果 serviceName 不是 "*",则为必需)允许满足 from 块条件的客户端访问的方法列表的开头。如需查看服务的受限方法和权限列表,请参阅支持的服务方法限制

  • - method: -(必须使用此特性或 permission 特性)此字段必须是有效的服务方法,也可以设置为 "*" 以允许访问指定服务的所有方法。

  • - permission: -(必须使用此特性或 method 特性)此字段必须是有效的服务权限。允许需要此权限的操作访问边界内的资源。

    如果对资源的请求需要多项权限,您必须在同一操作下指定所有必需的权限,入站规则才能有效。例如,如果对 BigQuery 资源的请求需要 bigquery.jobs.createbigquery.tables.create 权限,则您必须在同一操作下同时指定这两项权限。此外,如果使用 Google Cloud 控制台多次为同一资源指定权限,则不会在同一操作下创建权限。为避免此问题,请一次性为资源指定所有权限。

  • resources: -(必需)此特性指定服务边界外的客户端可以访问的服务边界内 Google Cloud 资源的列表。可以将此字段设置为 "*",以允许访问边界内的任何 Google Cloud 资源。

如需创建有效的入站流量规则,必须指定以下特性:

  • sources 特性。必须指定 accessLevelresource(Google Cloud 项目或 VPC 网络),或者将 accessLevel 属性设置为 "*"
  • identityTypeidentities 特性
  • resources 特性
  • serviceName 特性

配置入站政策文件后,请参阅更新入站和出站政策,了解有关将入站政策文件应用于服务边界的说明。

如果您在服务边界中配置了多个入站规则,则只要请求满足任一入站规则的条件,VPC Service Controls 就会允许该请求。

出站规则参考

您可以使用 Google Cloud 控制台、JSON 文件或 YAML 文件来配置出站规则。以下示例使用 .yaml 格式:

- egressTo:
    operations:
    - serviceName: SERVICE_NAME
      methodSelectors:
      - method: METHOD
      *OR*
      - permission: PERMISSION
    resources:
    - projects/PROJECT
    *OR*
    externalResources:
    - EXTERNAL_RESOURCE_PATH
  egressFrom:
    identityType: ANY_IDENTITY | ANY_USER_ACCOUNT | ANY_SERVICE_ACCOUNT
    *OR*
    identities:
    - PRINCIPAL_IDENTIFIER
  • - egressTo: -(必需)开始 to 块,其中列出允许对指定的边界外项目中的 Google Cloud 资源执行的服务操作。

  • operations: -(必需)标记满足 from 块条件的客户端允许访问的可访问服务和操作/方法列表的开头。

  • - serviceName: -(必需)此字段可以是有效的服务名称,也可以设置为 "*" 以允许访问所有服务。如需查看可用服务的列表,请参阅支持的产品

  • methodSelectors: -(如果 serviceName 不是 "*",则为必需)允许满足 from 块条件的客户端访问的方法列表的开头。如需查看服务的受限方法和权限列表,请参阅支持的服务方法限制

  • - method: -(必须使用此特性或 permission 特性。)此字段可以是有效的服务方法,也可以设置为 "*" 以允许访问指定服务的所有方法。

  • - permission: -(必须使用此特性或 method 特性。)此字段必须是有效的服务权限。允许需要此权限的操作访问边界外的指定资源。

    如果对资源的请求需要多项权限,您必须在同一操作下指定所有必需的权限,出站规则才能有效。例如,如果对 BigQuery 资源的请求需要 bigquery.jobs.createbigquery.tables.create 权限,则您必须在同一操作下同时指定这两项权限。此外,如果使用 Google Cloud 控制台多次为同一资源指定权限,则不会在同一操作下创建权限。为避免此问题,请一次性为资源指定所有权限。

  • resources: - 此属性是边界内客户端可以访问的 Google Cloud 资源列表,这些资源由其项目指定。您可以将此字段设置为 "*" 以允许对任何 Google Cloud 资源的出站访问。

  • externalResources: - 此属性仅用于指定 BigQuery Omni 资源。此属性是边界内客户端可以访问的 BigQuery Omni 支持的外部资源列表。您只能指定 Amazon S3 或 Azure Blob Storage 资源。对于 Amazon S3,支持的格式为 s3://BUCKET_NAME。对于 Azure Storage,支持的格式为 azure://myaccount.blob.core.windows.net/CONTAINER_NAME

  • egressFrom: -(必需)开始 from 块,其中列出允许的边界内来源和身份。

  • identityType: -(必须使用此特性或 identities 特性。)此特性定义可用于访问边界外指定资源的身份类型。可接受的值:ANY_IDENTITYANY_USER_ACCOUNTANY_SERVICE_ACCOUNTANY_IDENTITY 允许所有身份。ANY_USER_ACCOUNT 允许所有真人用户。ANY_SERVICE_ACCOUNT 允许所有服务账号。

    此属性不会根据组织限制身份。例如,ANY_SERVICE_ACCOUNT 允许来自任何组织的服务账号。

  • identities: -(必须使用此特性或 identityType 特性。)此属性会启动可访问边界外指定资源的服务账号、用户账号、Google 群组或第三方身份的列表。

  • PRINCIPAL_IDENTIFIER:指定可访问边界外的指定资源的用户账号、服务账号、Google 群组或第三方身份。使用 IAM v1 API 主账号标识符中指定的格式。例如,使用 group:GROUP_NAME@googlegroups.com 格式指定 Google 群组。

    VPC Service Controls 仅支持 IAM v1 API 主账号标识符中以 userserviceAccountgroup预览版)、principal预览版)和 principalSet预览版)前缀开头的 v1 身份。

配置出站政策文件后,请参阅更新入站和出站政策,了解有关将出站政策文件应用于服务边界的说明。

如果您在服务边界中配置了多个出站规则,则只要请求满足其中任一出站规则的条件,VPC Service Controls 就会允许该请求。

使用试运行模式测试入站/出站政策

如果您不想授予对某个服务的所有方法的访问权限,有时可能很难确定要允许的方法的精确列表。之所以发生这种情况,是因为服务的某个给定方法可能会导致对另一个 Google Cloud 服务调用另一个方法。例如,BigQuery 从 Cloud Storage 存储桶加载表以运行查询。

为了确定一组正确的允许方法,您可以使用 VPC Service Controls 试运行模式。为此,首先在试运行模式下启用边界(无入站流量或出站流量政策),并从审核日志收集调用的方法列表。然后,在试运行模式下逐渐向入站/出站政策添加这些方法,直到所有违规都停止。此时,可以将配置从试运行模式转移到实施模式。

不支持的特性

目前,入站和出站规则不支持以下功能:

  1. 按标签(而非项目)确定 Google Cloud 资源。
  2. 并非所有服务都支持每种方法的入站/出站规则。请参阅支持的服务方法限制
  3. ANY_SERVICE_ACCOUNTANY_USER_ACCOUNT 身份类型不能用于执行以下操作:

限制

如需了解入站流量和出站流量限制,请参阅配额和限制

后续步骤

  • 完成此 Codelab,了解如何修正入站和出站违规问题。