创建和管理自定义约束

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

组织政策针对各种 Google Cloud 服务提供了预定义限制。但是,如果您希望更好地掌控组织政策,可以创建自定义限制条件,并在组织政策中使用这些自定义限制条件。

本页面介绍如何查看、创建和管理自定义组织政策限制条件。自定义限制条件由管理员创建,可以针对组织政策限制的特定字段提供更精细且可自定义的控制。

准备工作

如需详细了解组织政策和限制条件的工作原理,请参阅组织政策服务简介

所需的角色

如需获取管理组织政策所需的权限,请让管理员授予您组织的组织政策管理员 (roles/orgpolicy.policyAdmin) IAM 角色。 如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含管理组织政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

您也可以使用自定义角色或其他预定义角色来获取这些权限。

自定义约束条件

自定义限制条件是在 YAML 文件中创建的,用于指定受该限制条件约束的资源、方法、条件和操作。这些政策专用于您正在执行组织政策的服务。使用通用表达式语言 (CEL) 定义自定义约束的条件。

为自定义限制条件创建 YAML 文件:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resource_types: RESOURCE_NAME
method_types:
- METHOD1
- METHOD2
condition: CONDITION
action_type: ACTION
display_name: DISPLAY_NAME
description: DESCRIPTION

替换以下内容:

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

  • CONSTRAINT_NAME:您想要为新的自定义约束条件指定的名称。例如 custom.disableGkeAutoUpgrade

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

  • METHOD1,METHOD2:强制执行此限制条件的 RESTful 方法列表。可以是 CREATE 和/或 UPDATE。并非所有 Google Cloud 服务都支持这两种方法。如需查看每项服务支持的方法,请在支持的服务中查找该服务。

  • CONDITION:表示受支持的服务资源的 CEL 条件,例如 resource.management.autoUpgrade == false。如需详细了解 CEL 用法,请参阅通用表达式语言

  • ACTION:在满足 condition 条件时要执行的操作。这可以是 ALLOWDENY

  • DISPLAY_NAME:限制条件的易于理解的名称。

  • DESCRIPTION:限制条件的说明,在违反政策时显示为错误消息。

如需详细了解您可以在自定义限制条件中使用的服务资源,请参阅自定义限制条件支持的服务

通用表达式语言

组织政策服务使用通用表达式语言 (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 时,系统会强制执行自定义限制条件。您可以将表达式与 (&&) 和/或 (||) 结合使用,以创建复杂查询。

整数

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

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

字符串

字符串字段(如上述示例中的 stringValue)可以使用字符串字面量、正则表达式或 CEL 表达式来求值。例如:

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".

定价

列表字段(例如上述示例中的 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".

Map

映射字段(例如上述示例中的 mapValue)是可基于特定元素是否存在以及相应值进行评估的键值对。

例如:

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

排查 CEL 错误

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

name: organizations/1234567890123/customConstraints/custom.badConfig
resource_types: dataproc.googleapis.com/Cluster
method_types:
- CREATE
- UPDATE
condition: resource.config.masterConfig.numInstances == "mismatch"
action_type: ALLOW
display_name: Number of instances is a string
description: Demonstrate that type mismatches will cause an error.

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

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 尝试强制执行限制条件时会导致错误。例如,如果您设置了某个限制条件,但其条件是尝试访问某个列表索引或不存在的映射键,该限制条件会失败并在执行时返回错误,并将阻止任何尝试创建资源的操作

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

限制条件示例

您可以定义与 Google 提供的预定义限制条件类似的自定义限制条件。典型的自定义约束条件如下所示:

name: organizations/1234567890123/customConstraints/custom.disableGkeAutoUpgrade
resource_types: container.googleapis.com/NodePool
method_types:
- CREATE
- UPDATE
condition: resource.management.autoUpgrade == false
action_type: ALLOW
display_name: 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.

设置自定义约束条件

如需为组织中的组织政策使用新的自定义限制条件,您必须使用 Google Cloud CLI 进行设置。如需设置自定义约束条件,请使用 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。 输出内容类似如下:
CONSTRAINT: custom.disableGkeAutoUpgrade
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: COCsm5QGENiXi2E=
如需了解详情,请参阅查看组织政策

更新自定义约束条件

您可以通过修改 YAML 文件并再次使用 set-custom-constraint gcloud CLI 命令来更新自定义限制条件。系统不会对自定义限制条件进行版本控制,因此这会覆盖现有的自定义限制条件。如果已经强制执行自定义限制条件,则更新后的自定义限制条件会立即生效。

删除自定义约束条件

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

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

CONSTRAINT_NAME 替换为您的自定义限制条件的名称。例如 custom.disableGkeAutoUpgrade。输出内容类似如下:

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

如果您删除自定义限制条件,则使用该限制条件创建的任何政策仍然存在,但会被忽略。

如果您创建同名的其他自定义限制条件,这些忽略的组织政策限制条件会使用新的自定义限制条件,并且不会再被忽略。

强制执行自定义限制条件

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

您可以通过创建引用该组织政策的组织政策,并将该组织政策应用于 Google Cloud 资源来强制执行布尔值限制条件。

控制台

如需强制执行布尔值限制条件,请执行以下操作:

  1. 打开 Google Cloud 控制台中的组织政策页面。

    打开“组织政策”页面

  2. 选择页面顶部的项目选择器
  3. 项目选择器中,选择要为其设置组织政策的项目。
  4. 组织政策页面上的列表中选择您的限制条件。 系统会显示该限制条件的政策详情页面。
  5. 如需自定义此资源的组织政策,请点击修改
  6. 修改页面上,选择自定义
  7. 点击添加规则
  8. 强制执行下,选择是应该启用还是停用此组织政策。
  9. (可选)要为标记设置组织政策条件,请点击添加条件。请注意,如果向组织政策添加条件规则,则必须至少添加一条无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策
  10. 要完成并应用组织政策,请点击保存。此政策最长可能需要 15 分钟才能生效。

gcloud

如需创建强制执行布尔值限制条件的组织政策,请创建一个引用此限制条件的政策 JSON 文件:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

请替换以下内容:

  • PROJECT_ID:您要对其实施限制条件的项目。
  • CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如 custom.disableGkeAutoUpgrade

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

    gcloud org-policies set-policy POLICY_PATH
    

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

支持的服务

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

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

后续步骤