使用自定义限制条件管理资源

本页面介绍了如何使用组织政策服务自定义限制条件来限制对以下 Google Cloud 资源执行的特定操作:

  • cloudresourcemanager.googleapis.com/Project
  • cloudresourcemanager.googleapis.com/Folder

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

组织政策和限制条件简介

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

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

政策继承

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

优势

如需实现安全性、合规性和治理,您可以通过以下方式使用自定义组织政策:

  • 管理项目命名模式:您可以针对项目 ID 创建自定义约束条件。例如,在暂存资源文件夹中,仅允许在项目 ID 以 staging- 开头时对项目执行创建和更新操作。
  • 限制对安全项目和文件夹的更改:如果父级是安全文件夹或组织,您可以创建自定义约束条件来拒绝项目和文件夹更新。

限制

  • 如果已在文件夹或项目上设置自定义约束条件,则对 Apps Script、Firebase 或 Contact Center Solution 资源执行的创建或更新操作可能会失败。在这种情况下,请检查导致自定义约束条件失败的条件。请确保更新这些限制,然后重试失败的操作。
  • 与所有组织政策限制条件一样,政策更改不会追溯应用于现有实例。
  • 在 Google Cloud 控制台中创建项目和文件夹时,系统可能不会提供 PERMISSION_DENIED 错误消息的具体原因。如需确认导致失败的具体约束条件的详细信息,您可以查看审核日志。

准备工作

  • 请确保您知道您的组织 ID
  • 安装并初始化 Google Cloud CLI。
    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
  • 所需的角色

    如需获得管理自定义组织政策所需的权限,请让您的管理员为您授予组织的 Organization Policy Administrator (roles/orgpolicy.policyAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

    创建自定义限制条件

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

    如需创建自定义限制条件,请使用以下格式创建 YAML 文件:

    name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
    resourceTypes:
    - RESOURCE_NAME
    methodTypes:
    - CREATE
    - UPDATE
    condition: "CONDITION"
    actionType: ACTION
    displayName: DISPLAY_NAME
    description: DESCRIPTION
    

    替换以下内容:

    • ORGANIZATION_ID:您的组织 ID,例如 123456789

    • CONSTRAINT_NAME:新的自定义限制条件的名称。 自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字。例如 custom.allowProjectForXDepartmentNameOnly。该字段的最大长度为 70 个字符。

    • RESOURCE_NAME:包含要限制的对象和字段的Google Cloud 资源的完全限定名称。例如 cloudresourcemanager.googleapis.com/Project

    • CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段的长度上限为 1,000 个字符。 如需详细了解可用于针对其编写条件的资源,请参阅支持的资源。 例如 "resource.projectId.startsWith(\"XDepartment\")"

    • ACTION:满足 condition 时要执行的操作。 可能的值包括 ALLOWDENY

    • DISPLAY_NAME:限制条件的直观易记名称。 此字段的最大长度为 200 个字符。

    • DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的长度上限为 2,000 个字符。

    如需详细了解如何创建自定义限制条件,请参阅定义自定义限制条件

    设置自定义限制条件

    为新的自定义限制条件创建 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 资源。

    控制台

    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:您为自定义限制条件定义的名称。例如,custom.allowProjectForXDepartmentNameOnly

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

        gcloud org-policies set-policy POLICY_PATH
        

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

    测试自定义组织政策

    以下示例创建自定义限制条件和政策,要求贵组织中的所有项目 ID 都以 dev_ 开头。

    在开始之前,请先确定您的组织 ID。

    创建限制条件

    1. 如需定义一个约束条件,以便在项目 ID 不以 dev_ 开头时拒绝所有项目创建和更新操作,请创建内容如下的 constraint-allow-dev-projects.yaml

      name: organizations/ORGANIZATION_ID/customConstraints/custom.allowProjectForDevIdOnly
      resourceTypes:
      - cloudresourcemanager.googleapis.com/Project
      methodTypes:
      - CREATE
      - UPDATE
      condition: "resource.projectId.startsWith(\"dev_\")"
      actionType: ALLOW
      displayName: Allow dev_ projects
      description: All projects in the org should start with dev_.
      

      ORGANIZATION_ID 替换为您的组织 ID。

    2. 应用限制条件:

      gcloud org-policies set-custom-constraint ~/constraint-allow-dev-projects.yaml
      
    3. 验证限制条件存在:

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

      输出类似于以下内容:

      CUSTOM_CONSTRAINT                ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                                      DISPLAY_NAME
      custom.allowProjectForDevIdOnly  ALLOW        CREATE,UPDATE  cloudresourcemanager.googleapis.com/Project   Allow dev_ projects
      ...
      

    创建政策

    1. 使用以下政策创建 policy-enable-dev-projects.yaml 文件:

      Name: organizations/ORGANIZATION_ID/policies/custom.allowProjectForDevIdOnly
      spec:
        rules:
        - enforce: true
      

      ORGANIZATION_ID 替换为您的组织 ID。

    2. 应用政策:

      gcloud org-policies set-policy ~/policy-enable-dev-projects.yaml
      
    3. 验证政策存在:

      gcloud org-policies list --organization=ORGANIZATION_ID
      

      输出类似于以下内容:

      CONSTRAINT                        LIST_POLICY    BOOLEAN_POLICY    ETAG
      custom.allowProjectForDevIdOnly   -              SET               COCsm5QGENiXi2E=
      

    应用政策后,系统大约需要两分钟才能开始强制执行该政策。 Google Cloud

    测试政策

    在组织中创建项目 ID 为 sampleDemoProject 的项目:

    gcloud projects create sampleDemoProject \
        --organization=ORGANIZATION_ID
    

    输出如下所示:

    PERMISSION_DENIED: The caller does not have permission
    

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

    下表列出了一些常见用例的自定义限制条件的语法:

    说明 限制条件语法
    禁止在文件夹 1234 (secure_admin_folder) 中创建新项目。
          name: organizations/ORGANIZATION_ID/customConstraints/custom.disableNewProjectInSecureAdminFolder
          resourceTypes:
          - cloudresourcemanager.googleapis.com/Project
          methodTypes:
          - CREATE
          condition: "resource.parent == "organizations/1234""
          actionType: DENY
          displayName: Disable new project creation in the secure admin folder
          description: Do not allow creation of new projects in the secure folders.
          
    禁止在其他文件夹中创建文件夹,以控制资源层次结构树的深度。
          name: organizations/ORGANIZATION_ID/customConstraints/custom.disableFolderCreation
          resourceTypes:
          - cloudresourcemanager.googleapis.com/Folder
          methodTypes:
          - CREATE
          condition: "resource.parent.startsWith("folders")"
          actionType: DENY
          displayName: Disable creation of a folder inside another folder
          description: Do not allow creation of a folder within another folder when
                       the resource hierarchy is set to a maximum value of 1.
          

    Resource Manager 支持的资源

    下表列出了您可以在自定义限制条件中引用的 Resource Manager 资源。

    资源 字段
    cloudresourcemanager.googleapis.com/Folder resource.displayName
    resource.parent
    cloudresourcemanager.googleapis.com/Project resource.parent
    resource.projectId

    后续步骤