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

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. 资源类型框中,选择包含要限制的对象和字段的 Google Cloud REST 资源的名称,例如 container.googleapis.com/NodePool。每种资源类型最多可有 20 个自定义限制条件。如果您尝试为已具有 20 个自定义限制条件的资源类型创建自定义限制条件,操作将失败。

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

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

    1. 添加条件面板中,创建一个引用受支持的服务资源的 CEL 条件,例如 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()

支持的服务

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

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

后续步骤