创建和管理自定义组织政策

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

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

本页面介绍了如何查看、创建和管理自定义组织 政策。管理员创建自定义组织政策 更精细、可自定义地控制受流量限制的特定字段, 受组织政策限制

准备工作

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

所需的角色

如需获取管理组织政策所需的权限, 请让管理员授予您 Organization Policy Administrator (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)。

设置自定义限制条件

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

控制台

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

    转到“组织政策”

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

  3. 从项目选择器中,选择您要使用的资源 设置组织政策

  4. 点击 自定义限制条件

  5. 显示名称框中,为限制条件输入一个易记的名称。此字段的最大长度为 200 个字符。 请勿在显示名称中使用个人身份信息或敏感数据,否则 都可能出现在错误消息中

  6. 限制条件 ID 框中,为新的自定义限制条件输入所需的名称。自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字,例如 custom.disableGkeAutoUpgrade。此字段的最大长度 是 70 个字符(不包括前缀),例如 organizations/123456789/customConstraints/custom.。 请勿在限制条件 ID 中包含个人身份信息或敏感数据, 都可能会出现在错误消息中

  7. 说明框中,输入直观易懂的限制条件说明,在违反政策时此说明内容会以错误消息的形式显示。此字段的最大长度为 2000 个字符。 请勿在说明中包含个人身份信息或敏感数据, 都可能会出现在错误消息中

  8. Resource type 框中,选择 Google Cloud 的名称 包含您要限制的对象和字段的 REST 资源, 示例 container.googleapis.com/NodePool。最多可以有 20 个 每个资源类型的自定义限制条件。如果您尝试创建自定义 为已包含 20 个自定义限制条件的资源类型。 操作失败。

  9. 强制执行方法下,选择是否强制执行限制条件 或者同时用于 CREATEUPDATE 方法。CREATE 并非所有 Google Cloud 服务都支持这两种方法。要查看受支持的 方法,请在支持的服务中找到相应服务。

  10. 如需定义条件,请点击 修改条件

    1. 添加条件面板中,创建一个引用 支持的服务资源,例如 resource.management.autoUpgrade == false。此字段的最大长度为 1,000 个字符。如需详细了解 CEL 用法,请参阅 通用表达式语言。有关 有关您可以在自定义 限制条件,请参阅自定义限制条件支持的服务

    2. 点击保存

  11. 操作下,选择在满足上述条件时是允许还是拒绝评估的方法。

    拒绝操作表示 如果条件结果为 true,则会被屏蔽。

    允许操作是指创建或更新 则只有在条件计算结果为 true 时才允许访问资源。每个 除了条件中明确列出的情况以外,其他情况都会被阻止。

  12. 点击创建限制条件

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

gcloud

如需使用 Google Cloud CLI 创建自定义限制条件,请为自定义限制条件创建 YAML 文件:

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

请替换以下内容:

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

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

  • RESOURCE_NAME: Google Cloud REST 资源,其中包含您要 限制。例如 container.googleapis.com/NodePool。存在 每种资源类型 20 个自定义限制条件如果您尝试创建自定义 已经有 20 个自定义限制条件的资源类型, 操作失败。如需详细了解您可以使用的服务资源 请参阅自定义限制条件支持的服务

  • METHOD1,METHOD2:要对其强制执行限制条件的 RESTful 方法的列表。可以是 CREATECREATEUPDATE。并非所有 Google Cloud 服务都支持这两种方法。接收者 查看每项服务支持的方法,在以下位置找到相应服务: 支持的服务

  • CONDITION:一个 CEL 条件,用于引用 支持的服务资源,例如 "resource.management.autoUpgrade == false"。此字段的最大长度为 1,000 个字符。如需详细了解 CEL 用法,请参阅 通用表达式语言

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

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

    允许操作意味着如果条件计算结果为“true”, 允许创建或更新资源的操作。这也 指除了 条件。

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

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

使用 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。如需了解详情,请参阅查看组织政策

更新自定义限制条件

您可以通过在 Google Cloud 控制台,或者创建一个新的 YAML 文件并使用 set-custom-constraint gcloud CLI 命令。没有任何 对自定义限制条件进行版本控制,这样它会覆盖现有的 限制条件。如果自定义限制条件已强制执行,则更新后的自定义 的约束条件会立即生效。

控制台

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

    转到“组织政策”

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

  3. 从项目选择器中,选择您要使用的资源 更新组织政策

  4. 组织政策页面。政策详情页面 限制条件。

  5. 点击 修改限制条件

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

  7. 点击保存更改

gcloud

如需使用 Google Cloud CLI 修改现有的自定义限制条件,请创建一个新的 YAML 文件,其中包含您要进行的更改:

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

替换以下内容:

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

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

  • RESOURCE_NAME: Google Cloud REST 资源,其中包含您要 限制。例如 container.googleapis.com/NodePool。有关 有关您可以在自定义 限制条件,请参阅自定义限制条件支持的服务

  • METHOD1,METHOD2:要对其强制执行限制条件的 RESTful 方法的列表。可以是 CREATECREATEUPDATE。并非所有 Google Cloud 服务都支持这两种方法。接收者 查看每项服务支持的方法,在以下位置找到相应服务: 支持的服务

  • CONDITION:一个 CEL 条件,用于引用 支持的服务资源,例如 "resource.management.autoUpgrade == false"。此字段的最大长度为 1,000 个字符。如需详细了解 CEL 用法,请参阅 通用表达式语言

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

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

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

使用 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。如需了解详情,请参阅查看组织政策

删除自定义限制条件

您可以使用 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 测试组织政策更改

了解当前影响后,您可以创建组织政策 试运行模式下,以了解政策的影响和可能的违规行为 。试运行模式下的组织政策是一种 组织政策,其中违规行为会记录在案, 因此,违规操作不会被拒绝。您可以在以下位置创建组织政策 使用 Google Cloud 控制台或 Google Cloud CLI有关详细说明,请参阅 在试运行模式下创建组织政策

强制执行自定义组织政策

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

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

控制台

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

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

    转到“组织政策”

  2. 选择页面顶部的项目选择器。
  3. 在项目选择器中,选择要设置组织政策的项目。
  4. 组织政策页面的列表中选择限制条件。 此时应显示该限制条件的政策详情页面。
  5. 如需为该资源配置组织政策,请点击管理政策
  6. 修改政策页面,选择覆盖父级政策
  7. 点击添加规则
  8. 强制执行下,选择开启还是关闭此组织政策的强制执行。
  9. (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策
  10. 如果是自定义限制条件,您可以点击测试更改来模拟此组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改
  11. 若要完成并应用组织政策,请点击设置政策。该政策将在 15 分钟内生效。

gcloud

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

      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 替换为组织政策 YAML 文件的完整路径。该政策将在 15 分钟内生效。

限制条件示例

您可以定义与所提供的预定义限制条件类似的自定义限制条件 。典型的自定义限制条件 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

字符串

可以对字符串字段(例如上例中的 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".

布尔值

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

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()

支持的服务

每项服务都定义了一组自定义限制条件字段,可用于 对服务资源强制执行组织政策服务列表 请参见 自定义限制条件支持的服务

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

后续步骤