本文档介绍了管理员如何查看、创建和管理自定义组织政策。借助自定义组织政策,您可以自定义对组织政策限制的特定字段的控制。
准备工作
- 如需详细了解组织政策和限制条件及其工作原理,请参阅Organization Policy Service 简介。
所需的角色
如需获得管理组织政策所需的权限,请让管理员向您授予组织的以下 IAM 角色:
- Organization Policy Administrator (
roles/orgpolicy.policyAdmin) -
启用 Cloud de Confiance API:
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您可以通过向 Organization Policy Administrator 角色绑定添加 IAM 条件来委托组织政策的管理。如需控制主账号可在哪些资源中管理组织政策,您可以根据特定标记设置角色绑定条件。如需了解详情,请参阅创建组织政策。
自定义限制条件
自定义限制条件是在 YAML 文件中定义的,该文件指定了受限制条件约束的资源、方法、条件和操作。自定义限制条件行为和支持的参数因服务而异。自定义限制条件的条件使用通用表达式语言 (CEL) 进行定义。
设置自定义限制条件
您可以使用 Cloud de Confiance 控制台或 Google Cloud CLI 创建自定义限制条件并将其设置为在组织政策中使用。
控制台
如需创建自定义限制条件,请执行以下操作:
- 在 Cloud de Confiance 控制台中,转到组织政策页面。
- 在项目选择器中,选择要为其设置组织政策的项目。
- 点击 自定义限制条件。
- 在显示名称框中,为限制条件输入一个人类可读名称。此名称会在错误消息中使用,并可用于识别和调试用途。请勿在显示名称中使用个人身份信息 (PII) 或敏感数据,因为此名称可能会在出错提示中公开。此字段最多可包含 200 个字符。
-
在限制条件 ID 框中,为新的自定义限制条件输入所需的 ID。自定义限制条件只能包含字母(包括大写和小写)或数字,例如
custom.disableGkeAutoUpgrade。此字段最多可包含 70 个字符,不计算前缀 (custom.),例如organizations/123456789/customConstraints/custom。请勿在限制条件 ID 中包含个人身份信息或敏感数据,因为该 ID 可能会在错误消息中公开。 - 在说明框中,输入人类可读的限制条件说明。当违反政策时,此说明将用作错误消息。请包含有关发生违规的原因以及如何解决违规问题的详细信息。请勿在说明中包含个人身份信息或敏感数据,因为该说明可能会在错误消息中公开。 此字段最多可包含 2000 个字符。
-
在资源类型框中,选择包含要限制的对象和字段的 Cloud de Confiance REST 资源的名称,例如
container.googleapis.com/Cluster。大多数资源类型最多支持 20 个自定义限制条件。如果您尝试创建更多自定义限制条件,操作将会失败。 -
此限制条件只能对 REST
CREATE方法强制执行。 - 如需定义条件,请点击 修改条件。
-
在添加条件面板中,创建一个引用受支持服务资源的 CEL 条件,例如
resource.management.autoUpgrade == false。此字段最多可包含 1,000 个字符。如需详细了解 CEL 用法,请参阅通用表达式语言。 如需详细了解可在自定义限制条件中使用的服务资源,请参阅自定义限制条件支持的服务。 - 点击保存。
- 在操作下,选择在满足条件时是允许还是拒绝评估的方法。
- 点击创建限制条件。
如需查看每种服务支持的方法,请在 支持自定义限制条件的服务中找到相应服务。
拒绝操作意味着,如果条件计算结果为 true,则创建或更新资源的操作会被阻止。
允许操作意味着,仅当条件计算结果为 true 时,才允许执行创建或更新资源的操作。除了条件中明确列出的情况之外,其他所有情况都会被阻止。
在每个字段中输入值后,右侧将显示此自定义限制条件的等效 YAML 配置。
gcloud
- 如需创建自定义限制条件,请使用以下格式创建 YAML 文件:
ORGANIZATION_ID:您的组织 ID,例如123456789。-
CONSTRAINT_NAME:新的自定义限制条件的名称。自定义限制条件只能包含字母(包括大写和小写)或数字,例如custom.disableGkeAutoUpgrade。此字段最多可包含 70 个字符,不计算前缀 (custom.),例如organizations/123456789/customConstraints/custom。请勿在限制条件 ID 中包含个人身份信息或敏感数据,因为该 ID 可能会在出错提示中泄露。 -
RESOURCE_NAME:包含要限制的对象和字段的 Cloud de Confiance资源的完全限定名称。例如container.googleapis.com/NodePool。 大多数资源类型最多支持 20 个自定义限制条件。如果您尝试创建更多自定义限制条件,操作将会失败。 -
methodTypes:强制执行限制条件的 REST 方法。 只能是CREATE。 -
CONDITION:针对受支持服务资源的表示形式编写的 CEL 条件。此字段最多可包含 1,000 个字符。例如"resource.management.autoUpgrade == false"。 -
ACTION:满足condition时要执行的操作。 可能的值包括ALLOW和DENY。 -
DISPLAY_NAME:限制条件的人类可读名称。此名称会在出错提示中使用,并可用于识别和调试用途。请勿在显示名称中使用个人身份信息或敏感数据,因为此名称可能会在出错提示中公开。此字段最多可包含 200 个字符。 -
DESCRIPTION:直观易懂的限制条件说明,当违反政策时会作为错误消息显示。此字段最多可包含 2000 个字符。 -
为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用
gcloud org-policies set-custom-constraint命令: - 如需验证自定义限制条件是否存在,请使用
gcloud org-policies list-custom-constraints命令:
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: RESOURCE_NAME methodTypes: - CREATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION
请替换以下内容:
如需查看每种服务支持的方法,请在 支持自定义限制条件的服务中找到相应服务。
允许操作意味着,如果条件计算结果为 true,则允许执行创建或更新资源的操作。这也意味着,除了条件中明确列出的情况之外,其他所有情况都会被阻止。
拒绝操作意味着,如果条件计算结果为 true,则创建或更新资源的操作会被阻止。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
将 CONSTRAINT_PATH 替换为自定义限制条件文件的完整路径。例如 /home/user/customconstraint.yaml。
此操作完成后,您的自定义限制条件将作为组织政策显示在您的 Cloud de Confiance by S3NS 组织政策列表中。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
将 ORGANIZATION_ID 替换为您的组织资源的 ID。
如需了解详情,请参阅查看组织政策。
更新自定义限制条件
如需更新自定义限制条件,您可以在Cloud de Confiance 控制台中修改限制条件,也可以创建新的 YAML 文件并再次使用 set-custom-constraint gcloud CLI 命令。自定义限制条件没有版本控制,因此这会覆盖现有的自定义限制条件。如果自定义限制条件已强制执行,则更新后的自定义限制条件会立即生效。
控制台
在 Cloud de Confiance 控制台中,转到组织政策页面。
选择页面顶部的项目选择器。
在项目选择器中,选择要为其更新组织政策的资源。
从组织政策页面的列表中选择要修改的限制条件,以打开该限制条件的政策详情页面。
点击 修改限制条件。
更改显示名称、说明、强制执行方法、条件和操作。创建限制条件后,您便无法更改限制条件 ID 或资源类型。
点击保存更改。
gcloud
使用
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:允许政策的格式。请使用json或yaml。PATH:指向自定义限制条件的新输出文件的路径。
修改自定义限制条件的本地副本,以反映您要对显示名称、说明、强制执行方法、条件和操作进行的更改。创建限制条件后,您便无法更改限制条件 ID 或资源类型。
更新自定义限制条件的 YAML 文件后,请对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用
gcloud org-policies set-custom-constraint命令:gcloud org-policies set-custom-constraint CONSTRAINT_PATH将
CONSTRAINT_PATH替换为自定义限制条件文件的完整路径。
更新完成后,更新后的自定义限制条件可用于您的组织政策。如果原始限制条件已强制执行,则更新后的限制条件会立即生效。
删除自定义限制条件
您可以使用 Cloud de Confiance 控制台或 Google Cloud CLI 删除自定义限制条件。
控制台
在 Cloud de Confiance 控制台中,转到组织政策页面。
选择页面顶部的项目选择器。
在项目选择器中,选择要为其删除组织政策的资源。
从组织政策页面的列表中选择要删除的限制条件,以打开该限制条件的政策详情页面。
点击 删除。
如需确认要删除限制条件,请点击删除。
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 for Organization Policy 可帮助您了解限制条件和组织政策对当前环境的影响。使用此工具,您可以在生产环境中强制执行政策之前,查看所有资源配置,了解哪些地方存在违规行为。如需了解详细说明,请参阅使用 Policy Simulator 测试组织政策更改。
了解当前效果后,您可以在试运行模式下创建组织政策,以了解未来 30 天内政策的影响和潜在违规行为。试运行模式下的组织政策是一种组织政策,其中违反政策的行为会被记录在审核日志中,但违反政策的操作不会被拒绝。您可以使用 Cloud de Confiance 控制台或 Google Cloud CLI,通过自定义限制条件在试运行模式下创建组织政策。如需详细说明,请参阅测试组织政策。
强制执行自定义组织政策
设置自定义限制条件后,其运行方式与预定义的布尔值限制条件相同。 Cloud de Confiance by S3NS 在评估是否允许用户请求时会先检查自定义限制条件。如果有任何自定义组织政策拒绝请求,则请求会被拒绝。 Cloud de Confiance随后会检查对该资源强制执行的预定义组织政策。
如需强制执行限制条件,您可以创建引用该限制条件的组织政策,并将该组织政策应用于 Cloud de Confiance by S3NS 资源。控制台
- 在 Cloud de Confiance 控制台中,前往组织政策页面。
- 在项目选择器中,选择要为其设置组织政策的项目。
- 从组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
- 如需为该资源配置组织政策,请点击管理政策。
- 在修改政策页面,选择覆盖父级政策。
- 点击添加规则。
- 在强制执行部分中,选择是否强制执行此组织政策。
- (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅 使用标记限定组织政策的范围。
- 点击测试更改以模拟组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改。
- 如需在试运行模式下强制执行组织政策,请点击设置试运行政策。如需了解详情,请参阅 测试组织政策。
- 验证试运行模式下的组织政策按预期运行后,点击设置政策来设置现行政策。
gcloud
- 如需创建包含布尔值规则的组织政策,请创建引用该限制条件的 YAML 政策文件:
-
PROJECT_ID:要对其强制执行您的限制条件的项目。 -
CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.disableGkeAutoUpgrade。 -
如需在试运行模式下强制执行组织政策,请运行以下带有
dryRunSpec标志的命令: -
验证试运行模式下的组织政策按预期运行后,使用
org-policies set-policy命令和spec标志设置现行政策:
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true dryRunSpec: rules: - enforce: true
请替换以下内容:
gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
将 POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。
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.
通用表达式语言
Organization Policy Service 使用通用表达式语言 (CEL) 来评估自定义限制条件的条件。CEL 是一种开源的非图灵完备语言,可实现表达式求值的通用语义。
支持自定义限制条件的每项服务都会提供一组特定的资源以及这些资源的字段。可用字段是强类型字段,可由自定义限制条件直接引用。
您可以根据字段类型,构建引用服务资源字段的 CEL 条件。Organization Policy Service 支持一部分 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)包含布尔值,即 true 或 false。
列表
列表字段(例如上一个示例中的 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".
排查自定义限制条件问题
以下部分介绍了与创建自定义限制条件相关的常见问题,并介绍了这些问题的解决方法。
方法类型错误
自定义限制条件是使用要强制执行的方法列表创建的,通常为 CREATE 或 CREATE 和 UPDATE。如果您指定了资源不支持的方法类型(例如 Compute Engine 映像资源的 UPDATE 方法),则无法保存自定义限制条件。
未评估的代码数
自定义限制条件支持组织、文件夹或项目资源上的标记。如需详细了解哪些服务支持标记,请参阅特定于服务的文档。
跨服务限制
某些服务(例如 Compute Engine)涉及大量相关资源。当发生违反自定义组织政策的行为时,系统会显示错误消息,即使自定义限制条件针对的是其他服务也是如此。
例如,Managed Service for Apache Spark 操作可能会被 Compute Engine 资源上的自定义限制条件阻止。
排查 CEL 错误
Organization Policy Service 会编译并验证您创建的条件,如果条件语法不正确,则会返回错误。如果您无法创建或保存自定义限制条件,则可能是发生了无效的 CEL 语法错误,您必须先解决该错误。
在 Cloud de Confiance 控制台中,无效的 CEL 语法错误将带有 错误图标。突出显示此图标会显示一条提示,其中包含有关语法错误的更多信息。
某些条件可能会编译,但在 Cloud de Confiance by S3NS尝试强制执行限制条件时会导致错误。例如,如果您设置的限制条件包含尝试访问不存在的列表索引或映射键的条件,则该限制条件会在强制执行时失败并返回错误,并阻止任何创建资源的尝试。
以下部分介绍了常见的 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"
| ..........................................^.
在 Cloud de Confiance 控制台中,无效的 CEL 语法错误将带有 错误图标。突出显示此图标会显示一条提示,其中包含有关语法错误的更多信息。
Organization Policy Service 会编译并验证您创建的条件,如果条件语法不正确,则会返回错误。不过,某些条件可能会编译,但在 Cloud de Confiance by S3NS 尝试强制执行限制条件时会返回错误。例如,如果您设置的限制条件包含尝试访问不存在的列表索引或映射键的条件,则该限制条件会在强制执行时失败并返回错误,并阻止任何创建资源的尝试。
创建依赖于列表或映射元素的条件时,我们建议在条件开头进行检查,以确保条件在所有情况下都有效。例如,在引用特定列表元素之前检查 list.size(),或在引用映射元素之前使用 has()。
支持的服务
每项服务都定义了一组自定义限制条件字段,可用于对其服务资源强制执行组织政策。如需查看支持自定义限制条件的服务列表,请参阅自定义限制条件支持的服务。
如需详细了解如何设置组织政策扫描器,请参阅组织政策漏洞发现结果。
对资源强制执行强制性标记
您可以使用自定义组织政策在资源上实现强制性标记。强制执行强制性标记后,您只能创建符合组织标记政策的资源,即资源会与政策中指定的强制性标记键的标记值绑定。如需了解详情,请参阅设置自定义限制条件以强制执行标记。