Principal Access Boundary Policy 的使用情形示例

以下是您可能想要使用主账号访问权限边界政策的常见场景,以及您可以在每种场景中创建的政策和政策绑定示例。如需了解如何创建 主账号访问权限边界政策并将其绑定到主账号集,请参阅创建并 应用主账号访问权限边界政策

防止用户访问组织外部的资源

由于主账号访问权限边界政策与主账号相关联,而非与资源相关联,因此您可以使用这些政策来阻止主账号访问您不拥有的资源。例如,设想以下场景:

主账号访问权限边界政策阻止访问某个资源

主账号访问权限边界政策阻止访问某个资源

  • 主账号 Tal (tal@example.com) 属于 Google Workspace 组织 example.com
  • Tal 获得了另一个组织 cymbalgroup.com 中 Cloud Storage 存储桶的 Storage Admin (roles/storage.admin) 角色。此角色包含 storage.objects.get 权限,查看存储桶中的对象需要此权限。
  • cymbalgroup.com 中没有任何拒绝政策会阻止 Tal 使用 storage.objects.get 权限。

example.com 管理员无法使用允许和拒绝政策来阻止 Tal 查看此外部存储桶中的对象。没有任何 example.com 主账号有权修改存储桶的允许政策,因此无法撤消 Tal 的角色。他们也没有权限在 cymbalgroup.com 中创建任何拒绝政策,因此无法使用拒绝政策阻止 Tal 访问存储桶。

不过,借助主账号访问权限边界政策,example.com 管理员可以阻止 Tal 查看 cymbalgroup.com 存储桶或 example.com 以外的任何存储桶中的对象。

为此,管理员可以创建主账号访问权限边界政策,声明 example.com 主账号只能访问 example.com 中的资源:

{
  "name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only",
  "displayName": "Boundary for principals in example.org",
  "details": {
    "rules": [
      {
        "description": "Principals are only eligible to access resources in example.org",
        "resources": [
            "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
        ],
        "effect": "ALLOW"
      }
    ],
    "enforcementVersion": "4"
  }
}

然后,他们可以创建政策绑定,以将此政策附加到组织 example.com 中的所有主账号:

{
  "name": "organizations/0123456789012/locations/global/policyBindings/example-org-only-binding",
  "displayName": "Bind policy to all principals in example.com",
  "target": {
    "principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only"
}

example.com 中包含的主账号包括 example.com 域中的所有身份、example.com 中的所有员工身份池,以及 example.com 中任何项目中的所有服务账号和工作负载身份池。

有了此政策,example.com 中的主账号将无法使用 主账号访问权限边界政策禁止的权限来 访问 example.com 以外的资源,即使他们对这些资源拥有相应权限 也是如此。

在本例中,主账号访问权限边界政策使用 强制执行版本 4,因此能够阻止 storage.objects.get 权限。因此,Tal 将无法查看 cymbalgroup.com 存储桶中的对象,即使他们已获授该存储桶的 Storage Admin 角色也是如此。

让服务账号有权访问单个项目中的资源

您还可以使用主账号访问权限边界政策,让主账号的子集有权访问组织中资源的子集。

例如,假设您有一个项目 example-dev,其项目编号为 901234567890。您想确保 example-dev 中的服务账号仅有资格访问 example-dev 中的资源。

为此,您首先需要创建一个新的主账号访问权限边界政策,让主账号有资格访问dev-project中的资源:

{
  "name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-dev-only",
  "displayName": "Boundary for principals in example-dev",
  "details": {
    "rules": [
      {
        "description": "Principals are only eligible to access resources in example-dev",
        "resources": [
          "//cloudresourcemanager.googleapis.com/projects/example-dev"
        ],
        "effect": "ALLOW"
      }
    ],
    "enforcementVersion": "4"
  }
}

此主账号访问权限边界政策使用强制执行版本 4,这意味着 它能够阻止强制执行版本 4中支持的所有权限

创建主账号访问权限边界政策后,您可以创建政策绑定,以 将新政策绑定到 example-dev 中的所有主账号,并添加 条件,以便政策绑定仅适用于服务 账号:

{
  "name": "organizations/0123456789012/locations/global/policyBindings/example-dev-only-binding",
  "displayName": "Bind policy to all service accounts in example-dev",
  "target": {
    "principalSet": "//cloudresourcemanager.googleapis.com/projects/example-dev"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-dev-only",
  "condition": {
    "title": "Only service accounts",
    "description": "Only enforce the policy if the principal in the request is a service account",
    "expression": "principal.type == 'iam.googleapis.com/ServiceAccount'"
  }
}

如果这是服务账号受制的唯一主账号访问权限边界政策,则服务账号将无法使用主账号访问权限边界政策可以阻止的任何权限来访问 example-dev 以外的任何资源。

管理不同主账号组的资格

您可以在同一组织中使用多项主账号访问权限边界政策,让不同的主账号有资格访问不同的资源。使用 多项主账号访问权限边界政策时,请在您的 政策绑定中使用条件,以确保每项政策仅适用于您希望其适用的 主账号。

例如,假设您希望大多数主账号都有资格访问组织中的所有 资源,如防止用户访问 组织外部的资源中所述。不过,您还想确保 example-dev 中的服务账号仅有资格访问 example-dev 中的资源,如让服务账号有权访问单个项目中的资源中所述。

如需实现此目标,请执行以下操作:

  1. 按照防止用户访问组织外部的 资源中的示例,创建一个主账号访问权限边界 政策,让主账号有资格访问 example.com 中的资源,并将其绑定到组织主账号集。

  2. 按照让服务账号有权访问资源 单个项目中的中的示例,创建一个主账号访问权限边界 政策,让 example-dev 中的服务账号有资格访问 example-dev 中的资源,并将其绑定到 example-dev 中的服务账号。

  3. 您可以将 example-dev 中的服务账号从主账号访问权限边界政策中排除,让主账号有资格访问 example.com 中的所有资源。为此,您需要在将主账号访问权限边界政策附加到组织的主账号集的政策绑定中添加以下条件:

    "condition": {
      "title": "Exempt example-dev service accounts",
      "description": "Don't enforce the policy for service accounts in the example-dev project",
      "expression": "principal.type != 'iam.googleapis.com/ServiceAccount' || (!principal.subject.endsWith('@example-dev.iam.gserviceaccount.com') && principal.subject != 'example-dev@appspot.gserviceaccount.com' && principal.subject != '901234567890-compute@developer.gserviceaccount.com')"
    }
    

最后一步至关重要,如果您不将 example-dev 服务账号从初始主账号访问权限边界政策中排除,则该政策将使他们有资格访问 example.com 中的所有资源,无论他们受哪些其他主账号访问权限边界政策的约束。如需了解详情,请参阅 定义有资格访问的资源

此外,在将 example-dev 服务账号从初始主账号访问权限边界政策中排除之前,请务必先创建新的主账号访问权限边界政策并将其附加到这些服务账号。 按照此过程操作可确保服务 账号始终受至少一项主账号访问权限边界政策的约束,从而 防止他们有资格访问所有 Google Cloud 资源。如需详细了解如何安全地减少 主账号有资格访问的资源,请参阅减少主账号有资格访问的资源

后续步骤