借助网域限定共享,您可以根据网域或组织资源来限制资源共享。当网域限定共享处于有效状态时,只有属于允许的网域或组织的主账号才能在您的 Google Cloud 组织中被授予 IAM 角色。
您可以使用以下三种类型的组织政策按网域限制身份:
iam.managed.allowedPolicyMembers
托管式限制- 引用
iam.googleapis.com/AllowPolicy
资源的自定义组织政策 iam.allowedPolicyMemberDomains
旧版托管式限制
准备工作
选择您将使用哪种方法来实现网域限定共享。如需详细了解每种方法的优缺点,请参阅按网域限制共享的方法。
所需的角色
如需获得强制执行网域受限共享所需的权限,请让您的管理员为您授予组织的 Organization Policy Administrator (roles/orgpolicy.policyAdmin
) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
使用 iam.managed.allowedPolicyMembers
限制条件实现网域限定共享
控制台
在 Google Cloud 控制台中,转到组织政策页面。
从项目选择器中,选择要为其修改组织政策的项目、文件夹或组织。随即显示的组织政策页面会显示可用于相应资源的可过滤组织政策限制条件列表。
从列表中选择 Restrict allowed policy members in IAM allow policies 受管理的限制条件。
在政策详情页面上,点击管理政策。
在修改政策页面,选择覆盖父资源的政策。
选择添加规则,然后更新组织政策规则。
在实施下,选择开启。
(可选)如需使组织政策成为基于某个标记的条件政策,请点击添加条件。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策。
在参数部分中,配置您要向组织中的哪些成员和主账号集授予角色,然后点击保存。
(可选)如需在组织政策更改生效之前预览其效果,请点击测试更改。如需详细了解如何测试组织政策更改,请参阅使用 Policy Simulator 测试组织政策更改。
如需在试运行模式下强制执行组织政策,请点击设置试运行政策。如需了解详情,请参阅以试运行模式创建组织政策。
验证试运行模式下的组织政策是否按预期运行后,点击设置政策,设置正式政策。
gcloud
创建一个 YAML 文件来定义组织政策:
name: organizations/ORG_ID/policies/iam.managed.allowedPolicyMembers 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。ALLOWED_MEMBER_1
、ALLOWED_MEMBER_2
:您要向组织中的哪些成员授予角色,例如user:example-user@example.com
。ALLOWED_PRINCIPAL_SET_1
、ALLOWED_PRINCIPAL_SET_2
:您要向组织中的哪些主账号集授予角色。例如//cloudresourcemanager.googleapis.com/organizations/0123456789012
。
(可选)如需使组织政策成为基于某个标记的条件性政策,请向
rules
添加condition
块。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策。使用
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_1
、ALLOWED_MEMBER_2
:您要向组织中的哪些成员授予角色,例如user:example-user@example.com
。ALLOWED_PRINCIPAL_SET_1
、ALLOWED_PRINCIPAL_SET_2
:您要向组织中的哪些主账号集授予角色。例如//cloudresourcemanager.googleapis.com/organizations/0123456789012
。
(可选)如需使组织政策成为基于某个标记的条件性政策,请向 rules
添加 condition
块。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策。
如需了解如何在应用政策之前在试运行模式下对其进行测试,请参阅在试运行模式下创建组织政策。
如需了解如何在强制执行政策之前模拟政策,请参阅使用 Policy Simulator 测试组织政策更改。
使用自定义组织政策来实现网域限定共享
创建自定义限制条件,以限制哪些主账号可以在组织中获授角色:
使用
memberInPrincipalSet
CEL 函数并设置组织主账号,以限制向组织中的成员授予角色。如需了解如何查找组织 ID,请参阅检索组织主账号集。例如,以下限制条件会将角色授予限制为仅限组织中的成员:
name: organizations/ORG_ID/customConstraints/custom.allowInternalIdentitiesOnly resourceTypes: iam.googleapis.com/AllowPolicy 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
您可以选择添加其他 CEL 函数,并使用逻辑运算符(
&&
、||
或!
)将它们连接起来,以优化限制条件。您可以添加以下任意函数:例如,以下限制条件将角色授予对象限制为组织中的成员和
admin@example.com
:name: organizations/ORG_ID/customConstraints/custom.allowInternalIdentitiesOnly resourceTypes: iam.googleapis.com/AllowPolicy 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
设置自定义限制条件:
为新的自定义限制条件创建 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。 如需了解详情,请参阅查看组织政策。强制执行自定义组织政策:
如需强制执行限制条件,您可以创建引用该限制条件的组织政策,并将该组织政策应用于 Google Cloud 资源。控制台
- 在 Google Cloud 控制台中,前往组织政策页面。
- 在项目选择器中,选择要设置组织政策的项目。
- 从组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
- 如需为该资源配置组织政策,请点击管理政策。
- 在修改政策页面,选择覆盖父级政策。
- 点击添加规则。
- 在强制执行部分中,选择开启还是关闭此组织政策的强制执行。
- (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅设置带有标记的组织政策。
- 点击测试更改以模拟组织政策的效果。政策模拟不适用于旧版托管式限制。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改。
- 若要完成并应用组织政策,请点击设置政策。该政策最长需要 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.allowedPolicyMemberDomains
限制条件实现网域限定共享
网域限制条件是一种旧版受管理限制条件,具有列表 constraint_type
。
您可以在网域限制条件的 allowed_values
列表中指定组织主账号集或 Google Workspace 客户 ID。如需了解详情,请参阅组织主账号集与 Google Workspace 客户 ID。
您的组织正文集和 Google Workspace ID 不会自动获得许可。如需允许组织中的主账号访问组织中的资源,您必须将组织主账号集或 Google Workspace ID 纳入允许的主账号集中。
网域限制条件不支持拒绝值,并且无法保存 denied_values
列表中包含 ID 的组织政策。
您可以使组织政策强制执行网域限制条件,但前提是该政策适用于受支持的资源列表中包含的任何资源。例如,Cloud Storage 存储分区、BigQuery 数据集或 Compute Engine 虚拟机。
控制台
如需设置包含网域限制条件的组织政策,请执行以下操作:
在 Google Cloud 控制台中,转到组织政策页面。
在项目选择器中,选择要为其设置组织政策的组织资源。
在组织政策页面上,从限制条件列表中选择网域受限的共享。
在政策详情页面上,点击管理政策。
在应用对象下方,选择覆盖父资源的政策。
点击添加规则。
在政策值下方,选择“自定义”。
在政策类型下,选择允许。
在自定义值下,在相应字段中输入组织主账号集或 Google Workspace 客户 ID。
如果您想添加多个 ID,请点击新政策值以创建其他字段。
点击完成。
(可选)如需使网域限制成为基于某个标记的条件性限制,请点击添加条件。
在名称字段中,输入条件的名称。
在说明字段中,输入条件的说明。该说明介绍了所需标记的背景信息以及它们如何影响资源。
您可以使用条件构建器创建条件,要求具有特定标记限制条件才会生效。
在条件构建器标签页的条件类型菜单中,选择标记。
为条件选择运算符。要匹配整个标记,请使用匹配运算符。要匹配标记键和标记值,请使用匹配 ID 运算符。
如果您选择了匹配运算符,请输入标记的值命名空间名称。如果您选择了匹配 ID 运算符,请输入键和值 ID。
您可以通过点击添加创建多个条件。如果添加了其他条件,则可以通过切换和将条件逻辑设置为要求满足所有条件。您可以通过切换或将条件逻辑设置为仅要求其中一个条件为真。
您可以通过点击条件字段右侧的 X 来删除表达式。
完成条件修改后,点击保存。
如需强制执行政策,请点击设置政策。
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 替换为您要允许的主账号标识符。您可以添加组织主账号集或 Google Workspace 客户 ID。例如,
is:principalSet://cloudresourcemanager.googleapis.com/organizations/01234567890123
或is:C03g5e3bc
强制执行此组织政策后,只有 allowed_values
列表中指定的身份才会被允许政策所允许。如需获得许可,主账号必须位于指定的组织主账号集中,或者属于指定的 Google Workspace 网域。
例如,如果您创建的组织政策仅允许您公司 Google Workspace 网域的客户 ID,那么从那一刻起,只有与该网域相关联的主账号才能添加到允许政策中。
错误消息示例
如果因尝试添加 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.
检索组织主账号集
您可以使用 Google Cloud 控制台、gcloud CLI 或 Cloud Resource Manager API 获取组织资源 ID。
控制台
如需使用 Google Cloud 控制台获取组织资源 ID,请执行以下操作:
- 前往 Google Cloud 控制台:
- 从页面顶部的项目选择器中,选择您的组织资源。
- 点击右侧的更多,然后点击设置。
设置页面会显示您的组织资源 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 后,即可向以下正文授予组织中的角色:
- 与您的 Google Workspace 客户 ID 相关联的所有网域中的所有身份
- 贵组织中的所有员工身份池
- 组织中任何项目中的所有服务账号和工作负载身份池
- 与贵组织中的资源相关联的所有服务代理。
网域限制条件使用的 Google Workspace 客户 ID 可通过两种方式获得:
gcloud
您可以使用 gcloud organizations list 命令查看自己拥有 resourcemanager.organizations.get
权限的所有组织:
gcloud organizations list
此命令将返回 DISPLAY_NAME
、ID
(组织 ID)和 DIRECTORY_CUSTOMER_ID
。DIRECTORY_CUSTOMER_ID
为 Google Workspace 客户 ID。
API
您可以使用 Google Workspace Directory API 检索 Google Workspace 客户 ID。
以 Google Workspace 管理员的身份登录后,您可以查看 Customers: get API 方法文档,然后点击执行。授权后,响应会显示您的客户 ID。
或者,您也可以使用 API 客户端:
- 获取
https://www.googleapis.com/auth/admin.directory.customer.readonly
范围的 OAuth 访问令牌。 运行以下命令以查询 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
旧版受管理的限制来实现网域限定共享,则可能需要强制账号访问这些账号才能执行所列操作。
操作 | 主账号标识符 |
---|---|
为结算账号启用 BigQuery 日志接收器 | serviceAccount:bUNIQUE_ID@gcp-sa-logging.iam.gserviceaccount.com |
启用存储空间访问日志记录 | serviceAccount:cloud-storage-analytics@google.com |
将 Pub/Sub 用作 Google Chat 应用的端点 | serviceAccount:chat-api-push@system.gserviceaccount.com |
使用 Pub/Sub 接收来自 Google Play 的实时开发者通知 | serviceAccount:google-play-developer-notifications@system.gserviceaccount.com |
将签名网址与 Cloud CDN 搭配使用 | serviceAccount:service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com |
将专用源站身份验证与 Cloud CDN 搭配使用 | serviceAccount:service-PROJECT_NUMBER@https-lb.iam.gserviceaccount.com |
Cloud Run 公共服务
Cloud Run 可让您公开服务。不过,如果您实施网域限定共享,那么组织外的用户将无法访问公开的 Cloud Run 服务。
如需允许用户访问公共 Cloud Run 服务,您必须为 Cloud Run 服务停用 Cloud Run Invoker IAM 检查。如需了解详情,请参阅为服务停用 Cloud Run 调用方。
公开共享其他数据
如果您使用自定义组织政策来实现网域限定共享,则可以向组织政策添加例外情况,以允许公开共享数据。
公开共享数据涉及特殊正文 allUsers
和 allAuthenticatedUsers
。如果您在使用网域限定共享的同时需要公开共享数据,则需要为这些正文添加例外情况。只有在使用自定义组织政策来实现网域限定共享时,才能添加例外情况。
如需为 allUsers
和 allAuthenticatedUsers
添加例外情况,请创建基于资源标记的条件性自定义组织政策。
在组织资源上创建标记键。
gcloud resource-manager tags keys create allUsersIngress \ --parent=organizations/ORGANIZATION_ID
将
ORGANIZATION_ID
替换为您的组织 ID。为您创建的标记键创建标记值。
gcloud resource-manager tags values create True \ --parent=ORGANIZATION_ID/allUsersIngress \ --description="Allow allUsers to access internal Cloud Run services"
将标记附加到您要公开共享的资源。
在限制条件的条件表达式中使用
memberSubjectMatches
CEL 函数创建自定义限制条件。例如,以下条件表达式将角色授予限制为仅针对组织中的成员
allUsers
和allAuthenticatedUsers
:name: organizations/ORGANIZATION_ID/customConstraints/custom.allowInternalAndSpecialIdentitiesOnly resourceTypes: iam.googleapis.com/AllowPolicy methodTypes: - CREATE - UPDATE condition: "resource.bindings.all( binding, binding.members.all(member, ( MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/ORG_ID']) || MemberSubjectMatches(member, ['allUsers', 'allAuthenticatedUsers']) ) ) )" actionType: ALLOW displayName: Only allow organization members, allusers, and allAuthenticatedUsers to be granted roles
创建强制执行自定义限制条件的组织政策。
name: organizations/ORGANIZATION_ID/policies/iam.allowedPolicyMemberDomains spec: rules: - allowAll: true condition: expression: resource.matchTag("ORGANIZATION_ID/allUsersIngress", "True") title: allowAllUsersIngress
强制执行组织政策。
gcloud org-policies set-policy POLICY_PATH
将
POLICY_PATH
替换为组织政策的路径和文件名。
借助有条件组织政策,您可以向带有 allUsersIngress: true
标记的资源上的 allUsers
身份授予权限。
强制授予账号访问权限
对于违反网域限制的项目,如果您需要强制账号访问:
移除包含网域限制条件的组织政策。
授予对项目的账号访问权限。
再次实施含有网域限制条件的组织政策。
或者,您也可以向包含相关服务账号的 Google 群组授予访问权限:
在允许的网域中创建 Google 群组。
使用 Google Workspace 管理员面板关闭该群组的网域限制。
将服务账号添加到群组。
在允许政策中向 Google 群组授予访问权限。