使用 Policy Simulator 测试组织政策更改

借助 Policy Simulator for Organization Policy,您可以先预览强制执行自定义或托管式限制条件的新自定义限制条件或组织政策的影响,然后再在生产环境中强制执行。Policy Simulator 会在建议的政策强制执行之前提供违反该政策的资源列表,以便您重新配置这些资源、请求例外情况或更改组织政策的适用范围,而不会干扰开发者或导致环境崩溃。

本页面介绍了如何使用 Policy Simulator 测试对组织政策的更改。此外,本页面还介绍了如何解读模拟结果以及如何应用测试的组织政策(如果您选择这样做)。

准备工作

  • 如果您使用的是 Google Cloud CLI,请设置要用于进行 API 调用的项目:

    gcloud config set project PROJECT_ID

    将 PROJECT_ID 替换为项目的名称或 ID。

  • 启用 Policy Simulator API 和 Resource Manager API(如果尚未启用)。

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。

    启用 API

  • 可选:获取组织政策服务简介。

所需的角色

如需获得运行和访问模拟所需的权限,请让您的管理员为您授予组织的 OrgPolicy Simulator Admin (roles/policysimulator.orgPolicyAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

此预定义角色包含运行和访问模拟所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需运行和访问模拟,您需要具备以下权限:

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.get
  • orgpolicy.policies.list
  • cloudasset.assets.searchAllResources
  • cloudasset.assets.listResource
  • cloudasset.assets.listOrgPolicy
  • policysimulator.orgPolicyViolationsPreviews.list
  • policysimulator.orgPolicyViolationsPreviews.get
  • policysimulator.orgPolicyViolationsPreviews.create
  • policysimulator.orgPolicyViolations.list

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

测试政策更改

您可以测试对自定义限制条件、强制执行自定义或托管式限制条件的组织政策或同时对这两者的更改。

测试对自定义限制条件的更改

控制台

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

    转到组织政策

  2. 从组织选择器中,选择您的组织资源。

  3. 执行下列其中一项操作:

    • 如需测试新的自定义限制条件,请点击 自定义限制条件。

    • 如需更改现有自定义限制条件,请从组织政策页面上的列表中选择该限制条件,然后点击 修改限制条件。

  4. 创建或更新要测试的自定义限制条件。

    1. 在显示名称框中,为限制条件输入一个易记的名称。此字段的最大长度为 200 个字符。 请勿在显示名称中使用个人身份信息或敏感数据,因为这些信息可能会在出错提示中公开。

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

      自定义限制条件创建后,其 ID 便无法更改。

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

    4. 在资源类型框中,选择包含要限制的对象和字段的 Google CloudREST 资源的名称,例如 container.googleapis.com/NodePool。大多数资源类型最多可为每个资源设置 20 个自定义限制条件。如果您尝试为已具有自定义限制条件数量上限的资源创建自定义限制条件,操作将失败。

    5. 在强制执行方法部分中,选择是对 REST CREATE 方法强制执行限制条件,还是同时对 CREATE 和 UPDATE 方法强制执行限制条件。并非所有 Google Cloud 服务都支持这两种方法。如需查看每种服务支持的方法,请在支持的服务中找到相应服务。

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

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

    8. 点击保存。

    9. 在操作部分,选择在满足您编写的条件时是允许还是拒绝评估的方法。

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

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

  5. 点击测试限制条件。

  6. 如果这是新限制条件,则会显示配置组织政策窗格。如需定义强制执行自定义限制条件的组织政策,请执行以下操作:

    1. 在选择范围框中,选择要测试自定义限制条件的资源。

    2. 点击覆盖父级资源的政策。

    3. 点击添加规则。

    4. 在强制执行部分,选择开启。

    5. (可选)如需使组织政策成为基于某个标记的条件政策,请点击添加条件。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策。

    6. 点击完成,然后点击继续。

系统会显示模拟历史记录页面,其中列出了您在过去 14 天内执行的模拟。如需了解详情,请参阅本页面上的Policy Simulator 结果。

gcloud

  1. 如需测试强制执行新的或更新后的自定义限制条件,请创建一个 JSON 或 YAML 文件,用于定义要测试的自定义限制条件。

    如果您想测试对现有自定义限制条件的更改,可以使用 organizations.customConstraints.get gcloud CLI 命令检索自定义限制条件的当前 JSON 或 YAML 表示法,然后对该文件进行修改。

    定义自定义限制条件的 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 个自定义限制条件。如果您尝试为已达到自定义限制条件数量上限的资源创建自定义限制条件,操作将失败。如需详细了解可在自定义限制条件中使用的服务资源,请参阅自定义限制条件支持的服务。

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

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

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

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

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

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

    • DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的最大长度为 2000。如需详细了解如何创建自定义限制条件,请参阅创建和管理自定义限制条件。

  2. 创建或修改强制执行自定义限制条件的组织政策。

    • 如需测试强制执行新的或更新后的自定义限制条件,请创建一个 JSON 或 YAML 文件,用于定义要测试的组织政策:

      name: organizations/ORGANIZATION_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
      

      替换以下内容:

      • 将 ORGANIZATION_ID 替换为您的组织 ID,例如 1234567890123。

      • 将 CONSTRAINT_NAME 替换为您要测试的自定义限制条件的名称。例如 custom.EnforceGKEBinaryAuthz。

    • 如需测试根据特定标记的存在有条件地强制执行自定义限制条件,请创建一个定义组织政策的 JSON 或 YAML 文件:

      name: organizations/ORGANIZATION_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - condition:
            expression: CONDITION
          enforce: false
        - enforce: true
      

      替换以下内容:

      • 将 ORGANIZATION_ID 替换为您的组织 ID,例如 1234567890123。

      • 将 CONSTRAINT_NAME 替换为您要测试的自定义限制条件的名称。例如 custom.EnforceGKEBinaryAuthz。

      • CONDITION,其中包含引用受支持的服务资源的 CEL 条件,例如 "resource.matchTag('env', 'dev')"。

      如需详细了解条件组织政策,请参阅设置带有标记的组织政策。

    • 如需测试删除强制执行自定义限制条件的组织政策,请创建一个 JSON 或 YAML 文件,用于定义组织政策,除了从其父级资源继承政策之外,不设置任何规则集:

      name: organizations/ORGANIZATION_ID/policies/CONSTRAINT_NAME
      spec:
        inheritFromParent: true
      

      替换以下内容:

      • 将 ORGANIZATION_ID 替换为您的组织 ID,例如 1234567890123。

      • 将 CONSTRAINT_NAME 替换为您要测试的自定义限制条件的名称。例如 custom.EnforceGKEBinaryAuthz。

  3. 如需模拟对自定义限制条件和/或组织政策的更改,请运行 policy-intelligence simulate orgpolicy 命令:

    gcloud policy-intelligence simulate orgpolicy \
      --organization=ORGANIZATION_ID \
      --custom-constraints=CONSTRAINT_PATH \
      --policies=POLICY_PATH
    

    替换以下内容:

    • ORGANIZATION_ID:您的组织 ID,例如 1234567890123。不支持模拟多个组织的更改。

    • CONSTRAINT_PATH:您已创建或更新的自定义限制条件的完整路径。例如 tmp/constraint.yaml。如果您设置了 --policies 标志,则无需设置 --custom-constraints 标志。

    • POLICY_PATH:您创建或更新的组织政策的完整路径。例如,tmp/policy.yaml。如果您设置了 --custom-constraints 标志,则无需设置 --policies 标志。

几分钟后,该命令会输出违反自定义限制条件、组织政策或两者更改的资源列表。

您还可以在 Google Cloud 控制台的模拟历史记录页面上查看结果。请参阅此页面上的Policy Simulator 结果,了解如何读取结果。

以下是组织政策模拟的示例响应。 此模拟涉及一项自定义限制条件,该限制条件会限制创建未启用 Binary Authorization 的 Google Kubernetes Engine 集群资源。在这种情况下,如果应用了建议的更改,则两个集群资源将违反政策:项目 simulator-test-project 下的 orgpolicy-test-cluster 和项目 orgpolicy-test-0 下的 autopilot-cluster-1。

Waiting for operation [organizations/012345678901/locations/global/orgPolic
yViolationsPreviews/85be9a2d-8c49-470d-a65a-d0cb9ffa8f83/operations/1883a83
c-c448-42e5-a7c5-10a850928f06] to complete...done.
---
customConstraint:
  actionType: ALLOW
  condition: resource.binaryAuthorization.enabled == true
  methodTypes:
  - CREATE
  name: organizations/012345678901/customConstraints/custom.EnforceGKEBinaryAuthz
  resourceTypes:
  - container.googleapis.com/Cluster
name: organizations/012345678901/locations/global/orgPolicyViolationsPreviews/3dd47fd3-6df1-4156-8f10-413a3fc0ed83/orgPolicyViolations/b9fd23a5-7163-46de-9fec-7b9aa6af1113
resource:
  ancestors:
  - organizations/012345678901
  - projects/456789012345
  assetType: container.googleapis.com/Cluster
  resource: //container.googleapis.com/projects/simulator-test-project/locations/us-central1/clusters/orgpolicy-test-cluster
---
customConstraint:
  actionType: ALLOW
  condition: resource.binaryAuthorization.enabled == true
  methodTypes:
  - CREATE
  name: organizations/012345678901/customConstraints/custom.EnforceGKEBinaryAuthz
  resourceTypes:
  - container.googleapis.com/Cluster
name: organizations/012345678901/locations/global/orgPolicyViolationsPreviews/3dd47fd3-6df1-4156-8f10-413a3fc0ed83/orgPolicyViolations/e73896e6-7613-4a8d-8436-5df7a6455121
resource:
  ancestors:
  - organizations/012345678901
  - folders/789012345678
  - projects/456789012345
  assetType: container.googleapis.com/Cluster
  resource: //container.googleapis.com/projects/orgpolicy-test-0/locations/us-central1/clusters/autopilot-cluster-1

测试对托管式限制条件的更改

控制台

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

    转到组织政策

  2. 点击选择项目,然后选择要为其修改组织政策的组织、文件夹或项目资源。

  3. 从列表中,选择要为其更新组织政策的托管式限制条件。在政策详情页面上,您可以查看此组织政策的来源、对此资源的有效政策评估,以及有关托管式限制条件的更多详细信息。

  4. 如需为该资源更新组织政策,请点击管理政策。

  5. 在修改政策页面,选择覆盖父资源的政策。

  6. 点击添加规则。

  7. 在强制执行部分中,选择开启还是关闭此组织政策的强制执行。

  8. (可选)如需使组织政策成为基于某个标记的条件政策,请点击添加条件。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策。

  9. 点击测试更改。

系统会显示模拟历史记录页面,其中列出了您在过去 14 天内执行的模拟。如需了解详情,请参阅本页面上的Policy Simulator 结果。

gcloud

  1. 创建或修改强制执行托管式限制的组织政策。

    • 如需测试创建或更新强制执行托管式限制条件的组织政策,请创建一个定义组织政策的 JSON 或 YAML 文件。

      name: RESOURCE_TYPE/RESOURCE_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: ENFORCEMENT_STATE
      

      替换以下内容:

      • 将 RESOURCE_TYPE 替换为 organizations、folders 或 projects。

      • RESOURCE_ID 替换为您的组织 ID、文件夹 ID、项目 ID 或项目编号,具体取决于 RESOURCE_TYPE 中指定的资源类型。

      • 将 CONSTRAINT_NAME 替换为您要测试的托管式限制条件的名称。例如 iam.managed.disableServiceAccountKeyCreation。

      • 将 ENFORCEMENT_STATE 替换为 true(在设置后强制执行此组织政策)或 false(在设置后停用此组织政策)。

      (可选)如需使组织政策成为基于某个标记的条件性政策,请向 rules 添加 condition 块。如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策。

    • 如需测试删除强制执行托管式限制条件的组织政策,请创建一个 JSON 或 YAML 文件,用于定义组织政策,除了从其父级资源继承政策之外,不设置任何规则集:

      name: organizations/ORGANIZATION_ID/policies/CONSTRAINT_NAME
      spec:
        inheritFromParent: true
      

    替换以下内容:

    • 将 ORGANIZATION_ID 替换为您的组织 ID。

    • 将 CONSTRAINT_NAME 替换为要删除的托管式限制条件的名称。例如 iam.managed.disableServiceAccountKeyCreation。

  2. 运行 policy-intelligence simulate orgpolicy 命令:

    gcloud policy-intelligence simulate orgpolicy \
      --organization=ORGANIZATION_ID \
      --policies=POLICY_PATH
    

    替换以下内容:

    • 将 ORGANIZATION_ID 替换为您的组织 ID,例如 1234567890123。不支持模拟多个组织的更改。

    • 将 POLICY_PATH 替换为组织政策 YAML 文件的完整路径。

    几分钟后,该命令会输出违反自定义限制条件、组织政策或两者更改的资源列表。

    您还可以在 Google Cloud 控制台的模拟历史记录页面上查看结果。请参阅此页面上的Policy Simulator 结果,了解如何读取结果。

Policy Simulator 结果

Policy Simulator 会将自定义限制条件或组织政策更改的结果报告为违反模拟政策的列表。Google Cloud 控制台会存储您在过去 14 天内生成的模拟结果。

如需查看模拟结果,请前往模拟历史记录页面。

前往“模拟运行的历史记录”

对于每个模拟,该页面都会列出模拟所针对的组织政策、您开始模拟的日期以及模拟的状态。

模拟可能具有以下状态:

  • 正在进行:模拟正在运行,但尚未完成。您最多可以同时运行 50 个模拟。
  • 已完成:模拟已完成。
  • 错误:由于出错,模拟未能完成。

选择一个模拟练习即可查看详情。在模拟报告页面上,您可以查看违规行为预览,其中列出了由新自定义限制条件或组织政策导致的总违规次数、在模拟范围内检查的资源数量以及模拟完成的时间。

如果您模拟了自定义限制条件,则可以点击限制条件详细信息,查看模拟的具体配置。如果您模拟了组织政策,政策详情标签页会显示模拟的配置。

所有违规行为都会列在资源表中。系统会列出违反新自定义限制条件或组织政策的每个资源,并提供指向 Cloud Asset Inventory 中资源条目的链接。项目、文件夹和组织资源会显示其在层次结构中违反新自定义限制条件或组织政策的资源总数。

应用经过测试的政策更改

测试自定义限制条件和/或组织政策后,您可以设置自定义限制条件并强制执行组织政策。您可以在 Google Cloud 控制台中查看所有 Policy Simulator 结果,无论这些结果是如何生成的。如果您的模拟报告包含对不超过一项组织政策的更改,则可以直接通过模拟结果强制执行组织政策。如需在多项组织政策中强制执行测试更改,请使用 Google Cloud CLI。

控制台

  1. 如需强制执行自定义限制条件 Policy Simulator 结果,请前往模拟运行的历史记录页面。

    前往“模拟运行的历史记录”

  2. 选择要应用的自定义限制条件或组织政策的模拟报告。

  3. 如果此模拟报告包含自定义限制条件,请点击保存限制条件。

  4. 如果此模拟报告包含对不超过一项组织政策的更改,您可以将该组织政策作为试运行政策应用,以便监控生产环境中的行为,而不会通过点击设置试运行政策来引入风险。系统会显示新组织政策页面的政策详情页面。

    您可以立即强制执行组织政策,方法是点击 ,然后点击设置政策。

gcloud

  1. 如需强制执行自定义限制条件,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:

    gcloud org-policies set-custom-constraint CONSTRAINT_PATH
    

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

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

  2. 如需设置组织政策,请使用 gcloud org-policies set-policy 命令:

    gcloud org-policies set-policy POLICY_PATH
    

    将 POLICY_PATH 替换为组织政策 YAML 文件的完整路径。

    该政策最多可能需要 15 分钟才能生效。

保存模拟结果

控制台

如果您使用的是 Google Cloud 控制台,则可以将 Policy Simulator 结果另存为 CSV 文件。

  1. 如需保存 Policy Simulator 结果,请前往模拟历史记录页面。

    前往“模拟运行的历史记录”

  2. 选择要保存的模拟报告。

  3. 点击 导出完整结果。

gcloud

如果您使用的是 gcloud CLI,则可以将 Policy Simulator 结果另存为 JSON 或 YAML 文件。

默认情况下,Google Cloud CLI 中的测试结果会以 YAML 格式输出。如需将测试结果另存为 YAML 文件,请在运行模拟时重定向 simulate orgpolicy 命令的输出:

> FILENAME

将 FILENAME 替换为输出文件的名称。

如需将测试结果另存为 JSON 文件,请在运行模拟时将以下标志添加到 simulate orgpolicy 命令:

--format=json > FILENAME

将 FILENAME 替换为输出文件的名称。

错误

以下错误可能会导致模拟失败:

  • 超出并发模拟数量上限:用户已有 50 个正在进行的模拟,这是用户可以拥有的正在进行的模拟数量上限。如需解决此问题,请等待其中一个正在进行的模拟完成,然后尝试再次运行模拟。
  • 超时:模拟运行时间过长,已超时。任何耗时超过 4 小时的模拟都会自动超时。如需解决此问题,请尝试再次运行模拟或减小模拟的大小。
  • 模拟构造无效:建议的组织政策无效。例如,建议的政策包含无效的条件表达式。 如需解决此问题,请更正政策,然后重试。
  • 权限遭拒:您无权运行模拟。如需解决此问题,请确保您已被授予所需角色,然后重试。

后续步骤