创建和管理自定义限制条件

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

组织政策为各种Google Cloud 服务提供预定义限制条件。不过,如果您希望组织政策提供更精细的控制,可以创建自定义组织政策。

本文档介绍了管理员如何查看、创建和管理自定义组织政策。借助自定义组织政策,您可以自定义对组织政策限制的特定字段的控制。

准备工作

所需的角色

如需获得管理组织政策所需的权限,请让管理员向您授予组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

您可以通过向组织政策管理员角色绑定添加 IAM 条件来委托组织政策的管理权限。如需控制主账号可以管理组织政策的资源,您可以使角色绑定以特定标记为条件。如需了解详情,请参阅使用限制条件

自定义限制条件

自定义限制条件是在 YAML 文件中定义的,该文件指定了受相应限制条件约束的资源、方法、条件和操作。自定义限制行为和支持的参数因服务而异。自定义限制条件的条件是使用通用表达式语言 (CEL) 定义的。

设置自定义限制条件

您可以使用 Google Cloud 控制台或 Google Cloud CLI 创建自定义限制条件并将其设置为在组织政策中使用。

控制台

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

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

    转到组织政策

  2. 在项目选择器中,选择要为其设置组织政策的项目。
  3. 点击 自定义限制条件
  4. 显示名称框中,为限制条件输入一个人类可读名称。此名称用于错误消息,也可用于标识和调试。请勿在显示名称中使用个人身份信息或敏感数据,因为此名称可能会在错误消息中公开。此字段最多可包含 200 个字符。
  5. 限制条件 ID 框中,为新的自定义限制条件输入所需的名称。自定义限制条件只能包含字母(包括大写和小写)或数字,例如 custom.disableGkeAutoUpgrade。此字段最多可包含 70 个字符,不计算前缀 (custom.),例如 organizations/123456789/customConstraints/custom。请勿在您的限制条件 ID 中包含个人身份信息或敏感数据,因为这类内容可能会在错误消息中公开。
  6. 说明框中,输入人类可读的限制条件说明。此说明在违反政策时会用作错误消息。详细说明违规原因以及如何解决违规问题。请勿在说明中包含个人身份信息或敏感数据,因为这类内容可能会在错误消息中公开。 此字段最多可包含 2,000 个字符。
  7. 资源类型框中,选择包含要限制的对象和字段的 Google Cloud REST 资源的名称,例如 container.googleapis.com/NodePool。大多数资源类型最多支持 20 个自定义限制条件。如果您尝试创建更多自定义限制条件,则相应操作会失败。
  8. 强制执行方法下,选择是对 REST CREATE 方法强制执行限制条件,还是同时对 CREATEUPDATE 方法强制执行限制条件。如果您使用 UPDATE 方法对违反限制条件的资源强制执行限制条件,则组织政策会阻止对该资源所做的更改,除非该更改解决了违规问题。
  9. 并非所有 Google Cloud 服务都支持这两种方法。如需查看每种服务支持的方法,请在支持的服务中找到相应服务。

  10. 如需定义条件,请点击 修改条件
    1. 添加条件面板中,创建一个引用受支持的服务资源的 CEL 条件,例如 resource.management.autoUpgrade == false。此字段最多可包含 1,000 个字符。如需详细了解 CEL 用法,请参阅通用表达式语言。 如需详细了解可在自定义限制条件中使用的服务资源,请参阅自定义限制条件支持的服务
    2. 点击保存
  11. 操作下,选择在满足条件时是允许还是拒绝评估的方法。
  12. 拒绝操作意味着,如果条件计算结果为 true,则创建或更新资源的操作会被阻止。

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

  13. 点击创建限制条件
  14. 在每个字段中输入值后,右侧将显示此自定义限制条件的等效 YAML 配置。

gcloud

  1. 如需创建自定义限制条件,请使用以下格式创建 YAML 文件:
  2.       name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
          resourceTypes:
          - RESOURCE_NAME
          methodTypes:
          - CREATE
          condition: "CONDITION"
          actionType: ACTION
          displayName: DISPLAY_NAME
          description: DESCRIPTION
          

    请替换以下内容:

    • ORGANIZATION_ID:您的组织 ID,例如 123456789
    • CONSTRAINT_NAME:新的自定义限制条件的名称。自定义限制条件只能包含字母(包括大写和小写)或数字,例如 custom.disableGkeAutoUpgrade。此字段最多可包含 70 个字符。
    • RESOURCE_NAME:包含要限制的对象和字段的 Google Cloud资源的完全限定名称。例如 container.googleapis.com/NodePool
    • CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段最多可包含 1,000 个字符。例如 "resource.management.autoUpgrade == false"
    • ACTION:满足 condition 时要执行的操作。 可能的值包括 ALLOWDENY
    • 允许操作意味着,如果条件计算结果为 true,则允许执行创建或更新资源的操作。这也意味着,除了条件中明确列出的情况之外,其他所有情况都会被阻止。

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

    • DISPLAY_NAME:限制条件的直观易记名称。此字段最多可包含 200 个字符。
    • DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。此字段最多可包含 2,000 个字符。
  3. 为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:
  4.         gcloud org-policies set-custom-constraint CONSTRAINT_PATH
          

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

    此操作完成后,您的自定义限制条件会成为 Google Cloud 组织政策列表中的组织政策。

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

    ORGANIZATION_ID 替换为您的组织资源的 ID。

    如需了解详情,请参阅查看组织政策

更新自定义限制条件

如需更新自定义限制条件,您可以在Google Cloud 控制台中修改限制条件,也可以创建新的 YAML 文件并再次使用 set-custom-constraint gcloud CLI 命令。自定义限制条件没有版本控制,因此这会覆盖现有的自定义限制条件。如果自定义限制条件已强制执行,则更新后的自定义限制条件会立即生效。

控制台

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

    转到组织政策

  2. 选择页面顶部的项目选择器。

  3. 在项目选择器中,选择要为其更新组织政策的资源。

  4. 组织政策页面的列表中选择要修改的限制条件,以打开该限制条件的政策详情页面。

  5. 点击 修改限制条件

  6. 更改显示名称、说明、强制执行方法、条件和操作。创建限制条件后,您便无法更改限制条件 ID 或资源类型。

  7. 点击保存更改

gcloud

  1. 使用 gcloud org-policies describe-custom-constraint 命令获取当前的自定义限制条件。

    gcloud org-policies describe-custom-constraint CONSTRAINT_NAME \
      --organization=ORGANIZATION_ID \
      --format=FORMAT > PATH
    

    替换以下内容:

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

    • CONSTRAINT_NAME:自定义限制条件的名称,例如 custom.disableGkeAutoUpgrade

    • FORMAT:允许政策的格式。请使用 jsonyaml

    • PATH:指向自定义限制条件的新输出文件的路径。

  2. 修改自定义限制条件的本地副本,以反映您要对显示名称、说明、强制执行方法、条件和操作做出的更改。创建限制条件后,您便无法更改限制条件 ID 或资源类型。

  3. 更新自定义限制条件的 YAML 文件后,请对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:

    gcloud org-policies set-custom-constraint CONSTRAINT_PATH
    

    CONSTRAINT_PATH 替换为自定义限制条件文件的完整路径。

更新完成后,更新后的自定义限制条件即可用于组织政策。如果原始限制条件已强制执行,则更新后的限制条件会立即生效。

删除自定义限制条件

您可以使用 Google Cloud 控制台或 Google Cloud CLI 删除自定义限制条件。

控制台

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

    转到组织政策

  2. 选择页面顶部的项目选择器。

  3. 在项目选择器中,选择要为其删除组织政策的资源。

  4. 组织政策页面的列表中选择要删除的限制条件,以打开该限制条件的政策详情页面。

  5. 点击 删除

  6. 如需确认要删除限制条件,请点击删除

gcloud

如需删除自定义限制条件,请使用 org-policies delete-custom-constraint gcloud CLI 命令:

gcloud org-policies delete-custom-constraint custom.CONSTRAINT_NAME \
  --organization=ORGANIZATION_ID

替换以下内容:

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

  • CONSTRAINT_NAME:自定义限制条件的名称。例如 custom.disableGkeAutoUpgrade

输出类似于以下内容:

Deleted custom constraint [organizations/123456789/customConstraints/custom.disableGkeAutoUpgrade]

如果您删除某个自定义限制条件,则使用该限制条件创建的所有政策都将继续存在,但会被忽略。您无法创建与已删除的自定义限制条件同名的其他自定义限制条件。

测试和分析组织政策变更

我们建议您测试并试运行对组织政策的所有更改,以了解这些更改对环境的影响。

组织 Policy Simulator 可帮助您了解限制条件和组织政策对当前环境的影响。使用此工具,您可以在生产环境中强制执行政策之前,查看所有资源配置,了解哪些资源配置存在违规情况。如需了解详细说明,请参阅使用 Policy Simulator 测试组织政策更改

了解当前效果后,您可以在试运行模式下创建组织政策,以了解政策在未来 30 天内的影响和潜在违规情况。处于试运行模式下的组织政策是一种组织政策,违反该政策的行为会被记录在审核日志中,但不会被拒绝。您可以使用 Google Cloud 控制台或 Google Cloud CLI,根据自定义限制条件创建处于预运行模式的组织政策。如需了解详细说明,请参阅在试运行模式下创建组织政策

强制执行自定义组织政策

设置自定义限制条件后,其运行方式与预定义的布尔值限制条件相同。 Google Cloud 在评估是否允许用户请求时会先检查自定义限制条件。如果有任何自定义组织政策拒绝请求,则请求会被拒绝。然后, Google Cloud检查对该资源强制执行的预定义组织政策。

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

控制台

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

    转到组织政策

  2. 在项目选择器中,选择要为其设置组织政策的项目。
  3. 组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
  4. 如需为该资源配置组织政策,请点击管理政策
  5. 修改政策页面,选择覆盖父级政策
  6. 点击添加规则
  7. 强制执行部分中,选择是否强制执行此组织政策。
  8. (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅设置带有标记的组织政策
  9. 点击测试更改以模拟组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改
  10. 如需在试运行模式下强制执行组织政策,请点击设置试运行政策。如需了解详情,请参阅在试运行模式下创建组织政策
  11. 验证试运行模式下的组织政策是否按预期运行后,点击设置政策来设置现行政策。

gcloud

  1. 如需创建包含布尔值规则的组织政策,请创建引用该限制条件的 YAML 政策文件:
  2.         name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
            spec:
              rules:
              - enforce: true
            
            dryRunSpec:
              rules:
              - enforce: true
            
          

    请替换以下内容:

    • PROJECT_ID:要对其强制执行您的限制条件的项目。
    • CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.disableGkeAutoUpgrade
  3. 如需在试运行模式下强制执行组织政策,请运行以下带有 dryRunSpec 标志的命令:
  4.         gcloud org-policies set-policy POLICY_PATH \
              --update-mask=dryRunSpec
          

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

  5. 验证试运行模式下的组织政策按预期运行后,使用 org-policies set-policy 命令和 spec 标志设置现行政策:
  6.         gcloud org-policies set-policy POLICY_PATH \
              --update-mask=spec
          

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

限制条件示例

您可以定义自定义限制条件,类似于 Google 提供的预定义限制条件。典型的自定义限制条件 YAML 文件如下所示:

name: organizations/1234567890123/customConstraints/custom.disableGkeAutoUpgrade
resourceTypes:
- container.googleapis.com/NodePool
methodTypes:
- CREATE
- UPDATE
condition: "resource.management.autoUpgrade == false"
actionType: ALLOW
displayName: Disable GKE auto upgrade
description: Only allow GKE NodePool resource to be created or updated if
AutoUpgrade is not enabled where this custom constraint is enforced.

通用表达式语言

组织政策服务使用通用表达式语言 (CEL) 来评估自定义限制条件中的条件。CEL 是一种开源的非图灵完备语言,可实现用于表达式求值的通用语义。

支持自定义限制的每项服务都会提供一组特定的资源以及这些资源的字段。可用字段具有强类型,可由自定义限制条件直接引用。

您可以根据服务资源字段的类型构建引用这些字段的 CEL 条件。组织政策服务支持部分 CEL 数据类型、表达式和宏。以下部分列出了可用的数据类型以及可搭配使用这些数据类型的常见表达式和宏。

如需详细了解每项服务可用的表达式和宏,请参阅自定义限制条件支持的服务

以下 JSON 示例展示了您可以使用自定义限制条件引用的每种可能的字段类型:

{
  "integerValue": 1,
  "stringValue": "A text string",
  "booleanValue": true,
  "nestedValue": {
    "nestedStringValue": "Another text string"
  },
  "listValue": ["foo", "bar"],
  "mapValue": {
    "costCenter": "123"
  }
}

对于每个 CEL 表达式,当条件评估结果为 true 时,系统会强制执行自定义约束条件。您可以将表达式与 AND (&&) 和 OR (||) 组合使用,以创建复杂查询。为自定义限制创建 YAML 或 JSON 文件时,请将完整查询内容放在双引号 (") 中。

整数

整数字段(例如上例中的 integerValue)允许在条件中使用比较运算符。例如:

resource.integerValue == 1
resource.integerValue > 5
resource.integerValue < 10

字符串

可以使用字符串字面量、正则表达式或 CEL 表达式来评估字符串字段,例如上例中的 stringValue。例如:

resource.stringValue == "abc"
// stringValue is exactly "abc".

resource.stringValue.matches("dev$")
// stringValue matches a regular expression, which specifies the string ends
// with the word "dev".

resource.stringValue.startsWith("startValue")
// stringValue starts with "startValue".

resource.stringValue.endsWith("endValue")
// stringValue ends with "endValue".

resource.stringValue.contains("fooBar")
// stringValue contains "fooBar".

嵌套字段(例如上例中的 nestedStringValue)必须使用完整路径进行引用。例如:

resource.nestedValue.nestedStringValue == "foo"
// nestedValue contains the object nestedStringValue, which has a value of "foo".

布尔值

布尔值字段(例如上例中的 booleanValue)包含布尔值,即 truefalse

列表

列表字段(例如上例中的 listValue)可以通过列表的大小、列表的内容以及列表中是否存在特定元素来进行评估。

例如:

resource.listValue.size() >= 1 && resource.listValue[0] == "bar"
// listValue has size greater than or equal to one, and the first element is "bar".

resource.listValue.exists(value, value == "foo")
// listValue has at least one element that is exactly "foo".

resource.listValue.all(value, value.contains("foo"))
// listValue is a list of values that are all exactly "foo".

地图

映射字段(例如上例中的 mapValue)是键值对,可以根据特定元素的存在情况和值进行评估。

例如:

has(resource.mapValue.foo) && resource.mapValue.foo == "bar"
// mapValue contains the key "foo", and that key has the value "bar".

排查自定义限制条件方面的问题

以下部分介绍了与创建自定义限制相关的常见问题,并提供了这些问题的权宜解决方法。

方法类型错误

自定义限制条件是使用要强制执行的方法列表创建的,通常是 CREATECREATEUPDATE。如果您指定了资源不支持的方法类型(例如 Compute Engine 映像资源的 UPDATE 方法),则无法保存自定义限制条件。

未评估的标记

自定义限制条件支持组织、文件夹或项目资源上的标记。如需详细了解哪些服务支持标记,请参阅特定于服务的文档

跨服务限制

某些服务(例如 Compute Engine)涉及大量相关资源。发生自定义组织政策违规行为时,系统会显示相应的错误消息,即使自定义限制条件是针对其他服务的也是如此。

例如,Dataproc 操作可能会因 Compute Engine 资源上的自定义限制而被阻止。

排查 CEL 错误

组织政策服务会编译并验证您创建的条件,如果条件在语法上不正确,则会返回错误。如果您无法创建或保存自定义限制条件,则很可能是出现了无效的 CEL 语法错误,您必须先解决此问题。

在 Google Cloud 控制台中,无效的 CEL 语法错误会以 错误图标标记。突出显示此图标会显示一个提示,其中包含有关语法错误的更多信息。

某些条件可能会编译,但在 Google Cloud尝试强制执行限制时会导致错误。例如,如果您设置的限制条件尝试访问不存在的列表索引或映射键,则该限制条件会在强制执行时失败并返回错误,并阻止任何创建相应资源的尝试

以下部分介绍了常见的 CEL 错误以及这些错误的潜在权宜解决方法。

表达式无效或类型不匹配

如果创建的条件包含无效表达式或类型不匹配,则在您尝试设置自定义限制条件时,系统会返回错误。例如,假设有以下无效的自定义限制条件,它将字符串与整数进行比较:

name: organizations/1234567890123/customConstraints/custom.badConfig
resourceTypes:
- dataproc.googleapis.com/Cluster
methodTypes:
- CREATE
- UPDATE
condition: "resource.config.masterConfig.numInstances == 'mismatch'"
actionType: ALLOW
displayName: Number of instances is a string
description: Demonstrate that type mismatches cause an error.

如果您尝试使用 Google Cloud CLI 设置该限制条件,则会产生错误:

ERROR: (gcloud.org-policies.set-custom-constraint) INVALID_ARGUMENT: Custom constraint condition [resource.config.masterConfig.numInstances == "mismatch"] is invalid. Error: ERROR: <input>:1:15: found no matching overload for '_==_' applied to '(int, string)' (candidates: (%A0, %A0))
 | resource.config.masterConfig.numInstances == "mismatch"
 | ..........................................^.

在 Google Cloud 控制台中,无效的 CEL 语法错误会以 错误图标标记。突出显示此图标会显示一个提示,其中包含有关语法错误的更多信息。

组织政策服务会编译并验证您创建的条件,如果条件在语法上不正确,则会返回错误。不过,某些条件可能会通过编译,但在 Google Cloud 尝试强制执行限制时返回错误。例如,如果您设置的限制条件尝试访问不存在的列表索引或映射键,则该限制条件会在强制执行时失败并返回错误,从而阻止任何创建相应资源的尝试

创建依赖于列表或地图元素的条件时,建议先进行检查,确保该条件在所有情况下都有效。例如,在引用特定列表元素之前检查 list.size(),或在引用地图元素之前使用 has()

支持的服务

每项服务都定义了一组自定义限制条件字段,可用于在其服务资源上强制执行组织政策。如需查看支持自定义限制条件的服务列表,请参阅自定义限制条件支持的服务

如需详细了解如何设置组织政策扫描器,请参阅组织政策漏洞和发现结果

强制要求资源具有标记

您可以使用自定义组织政策在资源上实现强制性标记。强制执行强制性标记后,您只能创建符合组织标记政策的资源;也就是说,资源必须与政策中指定的强制性标记键的标记值绑定。如需了解详情,请参阅设置自定义限制条件以强制执行标记

后续步骤