按网域限制身份

借助网域限定共享,您可以根据网域或组织资源限制资源共享。启用网域限定共享后,只有属于允许的网域或组织的主账号才能在您的组织中获得 IAM 角色。 Google Cloud

您可以使用三种类型的组织政策按网域限制身份:

  • 引用 iam.googleapis.com/AllowPolicy 资源的自定义组织政策
  • iam.managed.allowedPolicyMembers 托管式约束条件
  • iam.allowedPolicyMemberDomains 预定义约束条件

准备工作

选择您将使用哪种方法实现网域限定共享。如需详细了解每种方法的优点和缺点,请参阅按网域限制共享的方法

所需的角色

如需获得强制执行网域受限共享所需的权限,请让您的管理员为您授予组织的 Organization Policy Administrator (roles/orgpolicy.policyAdmin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

使用自定义组织政策实现网域限定共享

  1. 创建一个自定义限制条件,以限制哪些主账号可以在贵组织中被授予角色:

    1. memberInPrincipalSet CEL 函数与组织主账号搭配使用,以限制向组织成员授予角色。如需了解如何查找组织 ID,请参阅检索组织资源 ID

      例如,以下限制条件会限制向组织成员授予角色:

      name: organizations/ORG_ID/customConstraints/custom.allowInternaldentitiesOnly
      methodTypes:
        - CREATE
        - UPDATE
      condition:
        "resource.bindings.all(
          binding,
          binding.members.all(member,
            MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/ORG_ID'])
          )
        )"
      actionType: ALLOW
      displayName: Only allow organization members to be granted roles
      
    2. 您可以酌情添加其他 CEL 函数(通过逻辑运算符 [&&||!] 连接)来优化约束条件。您可以添加以下任一函数:

      例如,以下限制条件会将角色授予范围限制为组织中的成员和 admin@example.com

      name: organizations/ORG_ID/customConstraints/custom.allowInternaldentitiesOnly
      methodTypes:
        - CREATE
        - UPDATE
      condition:
        "resource.bindings.all(
          binding,
          binding.members.all(member,
            (
              MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/ORG_ID'])
              ||
              MemberSubjectMatches(member, ['user:admin@example.com'])
            )
          )
        )"
      actionType: ALLOW
      displayName: Only allow organization members and service agents to be granted roles
      
  2. 设置自定义限制条件:

    为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:
    gcloud org-policies set-custom-constraint CONSTRAINT_PATH
    CONSTRAINT_PATH 替换为自定义限制条件文件的完整路径。例如 /home/user/customconstraint.yaml。完成后,您的自定义限制条件会成为 Google Cloud 组织政策列表中的组织政策。如需验证自定义限制条件是否存在,请使用 gcloud org-policies list-custom-constraints 命令:
    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    ORGANIZATION_ID 替换为您的组织资源的 ID。 如需了解详情,请参阅查看组织政策
  3. 强制执行自定义组织政策:

    如需强制执行布尔值限制条件,您可以创建引用该限制条件的组织政策,并将该组织政策应用于 Google Cloud 资源。

    控制台

    1. 在 Google Cloud 控制台中,转到组织政策页面。

      转到组织政策

    2. 在项目选择器中,选择要设置组织政策的项目。
    3. 组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
    4. 如需为该资源配置组织政策,请点击管理政策
    5. 修改政策页面,选择覆盖父级政策
    6. 点击添加规则
    7. 强制执行部分中,选择开启还是关闭此组织政策的强制执行。
    8. (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅设置带有标记的组织政策
    9. 如果是自定义限制条件,您可以点击测试更改来模拟此组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改
    10. 若要完成并应用组织政策,请点击设置政策。该政策最长需要 15 分钟才能生效。

    gcloud

    如需创建强制执行布尔值限制条件的组织政策,请创建引用该限制条件的 YAML 政策文件:

          name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
          spec:
            rules:
            - enforce: true
        

    请替换以下内容:

    • PROJECT_ID:要对其实施限制条件的项目。
    • CONSTRAINT_NAME:您要强制执行的限制条件的名称。例如 compute.disableAllIpv6

    如需强制执行包含限制条件的组织政策,请运行以下命令:

        gcloud org-policies set-policy POLICY_PATH
        

    POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。

使用 iam.managed.allowedPolicyMembers 约束条件实现网域限定共享

控制台

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到组织政策

  2. 在项目选择器中,选择要修改其组织政策的项目、文件夹或组织。随即显示的组织政策页面会显示适用于此资源的可过滤组织政策限制条件列表。

  3. 从列表中,选择限制 IAM 许可政策中的允许的政策成员受管理的约束条件。

  4. 政策详情页面上,点击管理政策

  5. 修改政策页面,选择覆盖父资源的政策

  6. 选择添加规则,然后更新组织政策规则:

  7. 实施下,选择开启

  8. (可选)如需使组织政策成为基于某个标记的条件政策,请点击添加条件。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策

  9. 参数部分,配置应能够在贵组织中授予角色的成员和主账号集,然后点击保存

  10. (可选)如需在强制执行组织政策更改之前预览其影响,请点击测试更改。如需详细了解如何测试组织政策更改,请参阅使用 Policy Simulator 测试组织政策更改

  11. 如需在试运行模式下强制执行组织政策,请点击设置试运行政策。如需了解详情,请参阅在试运行模式下创建组织政策

  12. 验证试运行模式下的组织政策是否按预期运行后,点击设置政策以设置正式版政策。

gcloud

  1. 创建一个 YAML 文件来定义组织政策:

    name: organizations/ORG_ID/policies/CONSTRAINT_NAME
    spec:
    rules:
     - enforce: true
     - parameters:
       allowedMemberSubjects:
         - ALLOWED_MEMBER_1
         - ALLOWED_MEMBER_2
       allowedPrincipalSets:
         - ALLOWED_PRINCIPAL_SET_1
         - ALLOWED_PRINCIPAL_SET_2
    

    替换以下内容:

    • ORG_ID:您的 Google Cloud组织的数字 ID。

    • CONSTRAINT_NAME:您要设置的约束条件的名称。

    • ALLOWED_MEMBER_1ALLOWED_MEMBER_2:应能获得贵组织中角色的成员。例如 user:example-user@example.com

    • ALLOWED_PRINCIPAL_SET_1ALLOWED_PRINCIPAL_SET_2:应能够在贵组织中授予角色的主账号集。例如 //cloudresourcemanager.googleapis.com/organizations/0123456789012

    (可选)如需使组织政策成为基于某个标记的条件政策,请向 rules 添加 condition 块。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策

  2. 使用 org-policies set-policy 命令和 spec 标志设置政策:

    gcloud org-policies set-policy POLICY_PATH \
      --update-mask=spec
    

    POLICY_PATH 替换为组织政策 YAML 文件的完整路径。

如需了解如何在应用政策之前在试运行模式下对其进行测试,请参阅在试运行模式下创建组织政策

如需了解如何在强制执行政策之前对其进行模拟,请参阅使用 Policy Simulator 测试组织政策更改

REST

如需设置组织政策,请使用 organizations.policies.create 方法。

POST https://orgpolicy.googleapis.com/v2/{parent=organizations/ORGANIZATION_ID}/policies

请求 JSON 正文包含组织政策的定义。如果此约束条件不支持参数,请省略 rules 下的 parameters 块。

{
  "name": "organizations/ORG_ID/policies/CONSTRAINT_NAME",
  "spec": {
    "rules": [
      {
        "enforce": true,
        "parameters": {
          "allowedMemberSubjects": [
            "ALLOWED_MEMBER_1",
            "ALLOWED_MEMBER_2"
          ],
          "allowedPrincipalSets": [
            "ALLOWED_PRINCIPAL_SET_1",
            "ALLOWED_PRINCIPAL_SET_2"
          ]
        }
      }
    ]
  }
}

替换以下内容:

  • ORG_ID:您的 Google Cloud组织的数字 ID。

  • CONSTRAINT_NAME:您要设置的约束条件的名称。

  • ALLOWED_MEMBER_1ALLOWED_MEMBER_2:应能获得贵组织中角色的成员。例如 user:example-user@example.com

  • ALLOWED_PRINCIPAL_SET_1ALLOWED_PRINCIPAL_SET_2:应能够在贵组织中授予角色的主账号集。例如 //cloudresourcemanager.googleapis.com/organizations/0123456789012

(可选)如需使组织政策成为基于某个标记的条件政策,请向 rules 添加 condition 块。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策

如需了解如何在应用政策之前在试运行模式下对其进行测试,请参阅在试运行模式下创建组织政策

如需了解如何在强制执行政策之前对其进行模拟,请参阅使用 Policy Simulator 测试组织政策更改

使用 iam.allowedPolicyMemberDomains 约束条件实现网域限定共享

网域限制条件是一种列表限制条件。 您可以通过网域限制条件的 allowed_values 列表添加和移除 Google Workspace 客户 ID 和组织资源 ID。 Google Cloud 网域限制条件不支持拒绝值,并且无法使用 denied_values 列表中的 ID 保存组织政策。

组织政策将允许与 allowed_values 中列出的 Google Workspace 账号或组织资源关联的所有网域。所有其他网域都将被组织政策拒绝。

您可以根据受支持资源列表中包含的任何资源,使组织政策强制执行网域限制条件。例如,Cloud Storage 存储分区、BigQuery 数据集或 Compute Engine 虚拟机。

控制台

如需设置包含网域限制条件的组织政策,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到组织政策

  2. 在项目选择器中,选择要为其设置组织政策的组织资源。

  3. 组织政策页面上,从限制条件列表中选择网域限制共享

  4. 政策详情页面上,点击管理政策

  5. 应用对象下,选择覆盖父资源的政策

  6. 点击添加规则

  7. 政策值下,选择“自定义”。

  8. 政策类型下,选择允许

  9. 自定义值下,在相应字段中输入组织资源 IDGoogle Workspace 客户 ID

    输入组织资源 ID 后,您可以向以下主账号授予组织中的角色:

    • 贵组织中的所有员工身份池
    • 组织中任何项目中的所有服务账号和工作负载身份池
    • 与贵组织中的资源关联的所有服务代理

    输入 Google Workspace 客户 ID 后,您可以为以下主账号授予组织中的角色:

    • 与您的 Google Workspace 客户 ID 关联的所有网域中的所有身份
    • 贵组织中的所有员工身份池
    • 组织中任何项目中的所有服务账号和工作负载身份池
    • 与贵组织中的资源关联的所有服务代理
  10. 如果您想添加多个 ID,请点击新政策值以创建其他字段。

  11. 点击完成

  12. (可选)如需使网域限制约束条件基于某个标记,请点击添加条件

    1. 名称字段中,输入条件的名称。

    2. 说明字段中,输入条件的说明。该说明介绍了所需标记的背景信息以及它们如何影响资源。

    3. 您可以使用条件构建器创建条件,要求具有特定标记限制条件才会生效。

      1. 条件构建器标签页的条件类型菜单中,选择代码

      2. 为条件选择运算符。要匹配整个标记,请使用匹配运算符。要匹配标记键和标记值,请使用匹配 ID 运算符。

      3. 如果您选择了匹配运算符,请输入标记的值命名空间名称。如果您选择了匹配 ID 运算符,请输入键和值 ID。

      4. 您可以通过点击添加创建多个条件。如果添加了其他条件,则可以通过切换将条件逻辑设置为要求满足所有条件。您可以通过切换将条件逻辑设置为仅要求其中一个条件为真。

      5. 您可以通过点击条件字段右侧的 X 来删除表达式。

      6. 完成条件修改后,点击保存

  13. 如需强制执行政策,请点击设置政策

gcloud

您可以通过 Google Cloud CLI 设置政策。如需创建包含网域限制条件的政策,请运行以下命令:

如需设置包含网域限制条件的组织政策,请运行以下命令:

gcloud org-policies set-policy POLICY_PATH

其中,POLICY_PATH 是组织政策 YAML 文件的完整路径,其内容应如下所示:

name: organizations/ORGANIZATION_ID/policies/iam.allowedPolicyMemberDomains
spec:
  rules:
  - condition: # This condition applies to the values block.
      expression: "resource.matchTag('ORGANIZATION_ID/environment', 'dev')"
    values:
      allowedValues:
      - PRINCIPAL_SET
  - values:
      allowedValues:
      - PRINCIPAL_SET

替换以下内容:

  • ORGANIZATION_ID,其中包含要设置此政策的组织资源的 ID。
  • PRINCIPAL_SET 用于指定您要允许的 Cloud Identity 主账号标识符,包括组织资源 ID。例如 is:principalSet://iam.googleapis.com/organizations/01234567890123

    您必须使用 Google Workspace 客户 ID 为您要允许的所有其他身份设置访问权限。例如 is:C03g5e3bc

应用该组织政策后,IAM 政策将只允许属于 allowed_values 列表中某个组织资源 ID 或 Google Workspace 网域的身份。Google Workspace 人类用户和群组必须是该组织资源的子级或属于该 Google Workspace 网域,并且 IAM 服务账号必须是与指定 Google Workspace 网域关联的组织资源的子级。

例如,如果您创建的组织政策只包含您公司 Google Workspace 的客户 ID,则从那一刻起,只能将来自该网域的主账号添加到 IAM 政策。

错误消息示例

如果因尝试添加 allowed_values 列表中未包含的主账号而违反了 iam.allowedPolicyMemberDomains 预定义限制条件,则操作将失败并显示错误消息。

控制台

控制台屏幕截图

gcloud

ERROR: (gcloud.projects.set-iam-policy) FAILED_PRECONDITION:
One or more users named in the policy do not belong to a permitted customer.

检索组织资源 ID

您可以使用 Google Cloud 控制台、gcloud CLI 或 Cloud Resource Manager API 获取组织资源 ID。

控制台

如需使用 Google Cloud 控制台获取组织资源 ID,请执行以下操作:

  1. 前往 Google Cloud 控制台:

    转到 Google Cloud 控制台

  2. 从页面顶部的项目选择器中,选择您的组织资源。
  3. 在右侧,点击更多,然后点击设置

设置页面会显示您的组织资源 ID。

gcloud

如需查找您的组织资源 ID,请运行以下命令:

gcloud organizations list

此命令会列出您所属的全部组织资源,及其对应的组织资源 ID。

API

如需使用 Cloud Resource Manager API 查找您的组织资源 ID,请使用 organizations.search() 方法,包括对您的网域的查询。例如:

GET https://cloudresourcemanager.googleapis.com/v3/organizations:search{query=domain:altostrat.com}

响应包含属于 altostrat.com 的组织资源的元数据,其中包括组织资源 ID。

获得组织资源 ID 后,您需要为其所属的一组正文使用正确的标识符。例如:

principalSet://iam.googleapis.com/organizations/01234567890123

如需详细了解 IAM 主账号标识符,请参阅主账号标识符

检索 Google Workspace 客户 ID

网域限制条件使用的 Google Workspace 客户 ID 可通过两种方式获得:

gcloud

您可以使用 gcloud organizations list 命令查看自己拥有 resourcemanager.organizations.get 权限的所有组织:

gcloud organizations list

此命令将返回 DISPLAY_NAMEID(组织 ID)和 DIRECTORY_CUSTOMER_IDDIRECTORY_CUSTOMER_ID 为 Google Workspace 客户 ID。

API

您可以使用 Google Workspace Directory API 检索 Google Workspace 客户 ID。

以 Google Workspace 管理员的身份登录后,您可以查看 Customers: get API 方法文档,然后点击执行。授权后,响应会显示您的客户 ID。

或者,您也可以使用 API 客户端:

  1. 获取 https://www.googleapis.com/auth/admin.directory.customer.readonly 范围的 OAuth 访问令牌。
  2. 运行以下命令以查询 Google Workspace 目录 API:

    curl -# -X GET "https://www.googleapis.com/admin/directory/v1/customers/customerKey" \
    -H "Authorization: Bearer $access_token" -H "Content-Type: application/json"
    

该命令将返回包含客户信息的 JSON 响应。id 为 Google Workspace 客户 ID。

为网域限定共享配置例外情况

某些 Google Cloud 服务会使用服务账号、服务代理和其他账号代表您执行操作。限制网域共享可能会导致系统无法自动向这些账号授予所需的 IAM 角色,从而导致某些操作失败。

下表列出了 Google Cloud 中可能会受到网域限制共享影响的操作。它还会列出需要自动授予角色的账号,以便这些操作能够成功执行。

如果您使用自定义组织政策或 iam.managed.allowedPolicyMembers 管理的限制条件来实现网域限定共享,不妨考虑将这些账号添加为网域限定共享限制条件的例外情况。如果您使用 iam.allowedPolicyMemberDomains 预定义约束条件来实现受限于网域的共享,则可能需要为这些账号强制授予账号访问权限,才能执行所列操作。

操作 账号
将 Google Analytics 360 与 BigQuery 相关联 analytics-processing-dev@system.gserviceaccount.com
公开共享数据 allUsersallAuthenticatedUsers
为结算账号启用 BigQuery 日志接收器 bUNIQUE_ID@gcp-sa-loggingiam.gserviceaccount.com
启用将账单导出到存储分区的功能 509219875288-kscf0cheafmf4f6tp1auij5me8qakbin@developer.gserviceaccount.com
启用存储空间访问日志记录 cloud-storage-analytics@google.com
启用 Firebase API
  • service-PROJECT_NUMBER@gcp-sa-firebase.iam.gserviceaccount.com
  • firebase-service-account@firebase-sa-management.iam.gserviceaccount.com
将 Pub/Sub 用作 Google Chat 应用的端点 chat-api-push@system.gserviceaccount.com

强制授予账号访问权限

对于违反网域限制的项目,如果您需要强制账号访问:

  1. 移除包含网域限制条件的组织政策。

  2. 授予对项目的账号访问权限。

  3. 再次实施含有网域限制条件的组织政策。

或者,您也可以向包含相关服务账号的 Google 群组授予访问权限:

  1. 在允许的网域中创建 Google 群组。

  2. 使用 Google Workspace 管理员面板关闭该群组的网域限制

  3. 将服务账号添加到群组。

  4. 在 IAM 政策中向 Google 群组授予访问权限。