自定义组织政策限制条件

本页面介绍了如何使用 Google Cloud Organization Policy Service 自定义限制条件来限制对以下 Cloud Storage for Firebase 资源执行的特定操作:

  • firebasestorage.googleapis.com/DefaultBucket

如需详细了解组织政策,请参阅自定义组织政策。

组织政策和限制条件简介

借助 Google Cloud 组织政策服务,您可以对组织的资源进行程序化集中控制。作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的 Google Cloud 资源及其后代。您可以在组织、文件夹或项目级层强制执行组织政策。

组织政策为各种 Google Cloud 服务提供内置的托管式限制。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义限制条件并在组织政策中使用这些自定义限制条件。

政策继承

如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个文件夹强制执行一项政策,Google Cloud 会对该文件夹中的所有项目强制执行该政策。如需详细了解此行为及其更改方式,请参阅层次结构评估规则。

此外,由于 Cloud Storage for Firebase 将文件存储在底层 Cloud Storage 存储桶中,因此对 Cloud Storage 资源强制执行的任何组织政策或自定义限制条件也适用于您的 Cloud Storage for Firebase 存储桶。

优势

  • 安全和治理:对 Cloud Storage 存储桶预配实施集中式组织控制,以确保遵守数据驻留和费用管理护栏。
  • 精细属性控制:根据特定资源属性(例如 storageClass 或 location)限制默认存储桶创建。

限制

将自定义组织政策与 Cloud Storage for Firebase 搭配使用时,存在以下限制:

  • 不追溯执行:新强制执行的自定义限制条件不会应用于现有资源。除非现有默认存储桶被更新,否则不会对其进行评估。如需识别可能违反限制条件的现有资源,您可以使用试运行模式测试政策。
  • 访问权限控制限制:自定义限制条件无法限制存储桶的访问控制列表 (ACL) 或 IAM 政策。

准备工作

  1. 在 Firebase 控制台中,选择或创建一个 Firebase 项目。

    确保您的项目属于某个组织,并且您知道自己的组织 ID。

  2. 如需使用命令行设置和强制执行自定义限制条件,请安装 Google Cloud CLI (gcloud)。自定义组织政策无法使用 Firebase CLI 进行管理。

所需的角色

如需获得管理自定义组织政策所需的权限,请让您的管理员为您授予组织的 Organization Policy Administrator (roles/orgpolicy.policyAdmin) IAM 角色。

Cloud Storage for Firebase 项受支持的资源

下表列出了您可以在自定义限制条件中引用的 Cloud Storage for Firebase 资源。您还可以引用 Cloud Storage 支持的资源,因为这些资源的自定义限制条件也适用于 Cloud Storage for Firebase 存储桶。

资源 支持的字段
firebasestorage.googleapis.com/DefaultBucket
  • resource.location
  • resource.storageClass

设置自定义限制条件

自定义限制条件是在 YAML 文件中,由实施组织政策的服务所支持的资源、方法、条件和操作定义的。自定义限制条件的条件使用通用表达式语言 (CEL) 进行定义。如需详细了解如何使用 CEL 在自定义限制条件中构建条件,请参阅创建和管理自定义限制条件的 CEL 部分。

控制台

如需创建自定义限制条件,请执行以下操作:

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

    转到组织政策

  2. 在项目选择器中,选择要为其设置组织政策的项目。
  3. 点击 自定义限制条件。
  4. 在显示名称框中,为限制条件输入一个人类可读名称。此名称会在出错提示中使用,并可用于识别和调试用途。请勿在显示名称中使用个人身份信息 (PII) 或敏感数据,因为此名称可能会在出错提示中公开。此字段最多可包含 200 个字符。
  5. 在限制条件 ID 框中,为新的自定义限制条件输入所需的 ID。自定义限制条件只能包含字母(包括大写和小写)或数字,例如 custom.restrictStorageClass。此字段最多可包含 70 个字符,不计算前缀 (custom.),例如 organizations/123456789/customConstraints/custom.restrictStorageClass。请勿在限制条件 ID 中包含个人身份信息或敏感数据,因为该 ID 可能会在出错提示中公开。
  6. 在说明框中,输入人类可读的限制条件说明。当违反政策时,此说明将用作错误消息。请包含有关发生违规的原因以及如何解决违规问题的详细信息。请勿在说明中包含个人身份信息或敏感数据,因为该说明可能会在出错提示中泄露。此字段最多可包含 2000 个字符。
  7. 在资源类型框中,选择包含要限制的对象和字段的 REST 资源的名称,例如 firebasestorage.googleapis.com/DefaultBucket。大多数资源类型最多支持 20 个自定义限制条件。如果您尝试创建更多自定义限制条件,操作将会失败。
  8. 在强制执行方法下,选择是对 REST CREATE 方法强制执行限制条件,还是同时对 CREATE 和 UPDATE 方法强制执行限制条件。(注意:DefaultBucket 仅支持 CREATE)。
  9. 如需定义条件,请点击 修改条件。
    1. 在添加条件面板中,创建一个引用受支持服务资源的 CEL 条件,例如 resource.storageClass == 'STANDARD'。此字段最多可包含 1,000 个字符。如需详细了解 CEL 用法,请参阅通用表达式语言。
    2. 点击保存。
  10. 在操作下,选择在满足条件时是允许还是拒绝评估的方法。

    拒绝操作意味着,如果条件计算结果为 true,则创建或更新资源的操作会被阻止。

    允许操作意味着,仅当条件计算结果为 true 时,才允许执行创建或更新资源的操作。除了条件中明确列出的情况之外,其他所有情况都会被阻止。

  11. 点击创建限制条件。

gcloud

  1. 如需创建自定义限制条件,请使用以下格式创建 YAML 文件:
    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes: firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
      -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
  2. 为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:
    gcloud org-policies set-custom-constraint CONSTRAINT_PATH

    将 CONSTRAINT_PATH 替换为自定义限制条件文件的完整路径。例如 /home/user/customconstraint.yaml。

  3. 如需验证自定义限制条件是否存在,请使用 gcloud org-policies list-custom-constraints 命令:
    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID

强制执行自定义组织政策

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

控制台

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

    转到组织政策

  2. 在项目选择器中,选择要为其设置组织政策的项目。
  3. 从组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
  4. 如需为该资源配置组织政策,请点击管理政策。
  5. 在修改政策页面,选择覆盖父资源的政策。
  6. 点击添加规则。
  7. 在强制执行部分中,选择是否强制执行此组织政策。
  8. 如需在试运行模式下强制执行组织政策,请点击设置试运行政策。如需了解详情,请参阅测试组织政策。
  9. 验证试运行模式下的组织政策按预期运行后,点击设置政策来设置现行政策。

gcloud

  1. 如需创建包含布尔值规则的组织政策,请创建引用该限制条件的 YAML 政策文件:
    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    dryRunSpec:
      rules:
      -   enforce: true
  2. 如需在试运行模式下强制执行组织政策,请运行以下带有 dryRunSpec 标志的命令:
    gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
  3. 验证试运行模式下的组织政策按预期运行后,使用 org-policies set-policy 命令和 spec 标志设置现行政策:
    gcloud org-policies set-policy POLICY_PATH --update-mask=spec

测试自定义组织政策

以下示例创建自定义限制条件和政策,要求所有新创建的默认存储桶避免使用 STANDARD 存储类别。您可以通过尝试执行该政策应禁止的操作来测试该政策。

创建限制条件

  1. 将以下文件保存为 constraint-restrict-storage-class.yaml:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
    resourceTypes:
    -   firebasestorage.googleapis.com/DefaultBucket
    methodTypes:
    -   CREATE
    condition: "resource.storageClass == 'STANDARD'"
    actionType: DENY
    displayName: Restrict Standard Storage Class
    description: Deny creating buckets with STANDARD storage class.
    

    将 ORGANIZATION_ID 替换为您的组织 ID。

  2. 应用限制条件:

    gcloud org-policies set-custom-constraint ~/constraint-restrict-storage-class.yaml
    
  3. 验证限制条件存在:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    输出类似于以下内容:

    CUSTOM_CONSTRAINT            ACTION_TYPE   METHOD_TYPES   RESOURCE_TYPES                                 DISPLAY_NAME
    custom.restrictStorageClass  DENY          CREATE         firebasestorage.googleapis.com/DefaultBucket   Restrict Standard Storage Class
    ...
    

创建政策

  1. 将以下文件保存为 policy-restrict-storage-class.yaml:

    name: projects/PROJECT_ID/policies/custom.restrictStorageClass
    spec:
      rules:
      -   enforce: true
    

    将 PROJECT_ID 替换为您的项目 ID。

  2. 应用政策:

    gcloud org-policies set-policy ~/policy-restrict-storage-class.yaml
    
  3. 验证政策存在:

    gcloud org-policies list --project=PROJECT_ID
    

    输出类似于以下内容:

    CONSTRAINT                   LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.restrictStorageClass  -              SET               CIqktscGELiZn6cC-
    

应用政策后,请等待大约两分钟,以便 Google Cloud 开始强制执行政策。

测试政策

尝试使用 Cloud Storage for Firebase REST API 创建默认存储桶,而不指定存储类别(默认为 STANDARD):

PROJECT_ID="PROJECT_ID"
TOKEN=$(gcloud auth print-access-token)

curl -X POST "https://firebasestorage.googleapis.com/v1beta/projects/${PROJECT_ID}/defaultBucket" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"location": "US-EAST1"}'

请求失败,并显示类似于以下内容的错误:

FAILED_PRECONDITION: Operation denied by org policy: ["customConstraints/custom.restrictStorageClass": "Deny creating buckets with STANDARD storage class."].
-   '@type': type.googleapis.com/google.rpc.ErrorInfo
  domain: iam.googleapis.com
  metadata:
    customConstraints: customConstraints/custom.restrictStorageClass
  reason: CUSTOM_ORG_POLICY_VIOLATION

常见用例的自定义组织政策示例

下表提供了一些常见自定义限制条件的语法示例。

说明 限制条件语法
限制创建具有 Standard Storage 存储类别的默认存储桶
name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictStorageClass
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.storageClass == 'STANDARD'"
actionType: DENY
displayName: Restrict Standard Storage Class
description: Deny creating buckets with STANDARD storage class.
要求在特定位置创建默认存储桶
name: organizations/ORGANIZATION_ID/customConstraints/custom.requireDefaultBucketLocation
resourceTypes:
-   firebasestorage.googleapis.com/DefaultBucket
methodTypes:
-   CREATE
condition: "resource.location != 'US-EAST1'"
actionType: DENY
displayName: Require US-EAST1 Location
description: Deny creating default buckets outside the US-EAST1 location.

后续步骤