托管式限制

托管式限制是基于现代平台构建的预定义组织政策,可让您以程序化方式集中控制 Compute Engine 资源。它们内置了对安全发布工具(例如 Policy Simulator 和试运行)的支持。

托管式限制条件以 compute.managed.* 为前缀,可直接替代旧版 compute.* 限制条件。

优势

  • 安全发布和监控:利用完善的工具实现政策,更快地控制变更,并使用模拟和试运行功能逐步部署。
  • 一致的日志记录:强制执行日志记录和错误消息的统一性,从而简化集中式监控并简化审核。

政策继承

您在资源上设置的组织政策会由资源层次结构中该资源的后代继承。例如,如果您对某个文件夹强制执行一项政策, Google Cloud 会对该文件夹中的所有项目强制执行该政策。

价格

组织政策服务(包括预定义 [旧版]、托管式和自定义组织政策)可免费使用。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init

      如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  • 设置默认区域和可用区
  • REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。

      安装 Google Cloud CLI。

      如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

    如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

  • 请确保您知道您的组织 ID
  • 如果您尚未安装 gcloud CLI,请先安装,然后运行 gcloud init 对其进行初始化。
  • 为测试设置默认项目。

所需的角色

如需获得管理具有托管式限制的组织政策所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含管理具有托管式限制的组织政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

管理具有托管式限制的组织政策需要以下权限:

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set
  • 如需测试限制条件,则需要具备以下权限:
    • 针对项目的 compute.instances.create 权限
    • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
    • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
    • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
    • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
    • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
    • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
    • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
    • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
    • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
    • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
    • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
    • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
    • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
    • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
    • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限

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

可用的托管式限制

Compute Engine 提供以下受管理的组织政策限制条件:

限制条件 说明
允许的 VLAN 连接加密设置

此列表限制条件定义了新 VLAN 连接允许的加密设置。
默认情况下,VLAN 连接可以使用任何加密设置。
将 IPSEC 设置为允许的值,以强制执行仅创建已加密的 VLAN 连接。

constraints/compute.managed.allowedVlanAttachmentEncryption
Compute Engine 预览版功能

此限制可确保除非明确允许,否则预览版功能会被屏蔽。设置为允许后,您可以控制为项目单独启用或停用哪些预览功能。只有已启用的预览版功能才能在项目中访问。随后停用该政策不会更改已设置的各个预览版功能的状态,并且可以单独停用这些功能。此限制仅适用于 Compute Alpha API 功能。

constraints/compute.managed.blockPreviewFeatures
屏蔽项目范围的 SSH 密钥

预览版:此限制条件会阻止在组织、项目或文件夹(此限制条件在其中强制执行)内的 Compute Engine 虚拟机的项目级、项目可用区级或实例级将 block-project-ssh-keys 元数据键设置为 false。默认情况下,系统允许使用项目范围的 SSH 密钥,但您可以使用此元数据键在项目、项目区域或实例级停用该功能。如需允许特定虚拟机使用项目范围的 SSH 密钥,您可以使用标记和条件规则将这些虚拟机从该政策中排除。
重要提示:强制执行此限制不会影响已将 block-project-ssh-keys 设置为 false 的现有虚拟机;除非更新这些虚拟机的元数据,否则它们将保留访问权限。

constraints/compute.managed.blockProjectSshKeys
停用 Compute Engine 元数据的访客属性

预览:强制执行此限制条件后,系统会禁止通过 Compute Engine API 访问 Compute Engine 虚拟机的访客属性
默认情况下,系统允许使用 Compute Engine API 访问 Compute Engine 虚拟机的客机特性。
您可以允许特定虚拟机实例使用客机特性。首先,应用标记来标记实例,然后使用基于标记值的条件规则将这些实例正确地排除在强制执行范围之外。

constraints/compute.managed.disableGuestAttributesAccess
禁用 VM 嵌套虚拟化

设置为 True 时,此布尔值限制条件会对属于相应组织、项目或文件夹的所有 Compute Engine 虚拟机停用硬件加速的嵌套虚拟化功能。
默认情况下,在 Intel Haswell 或更新的 CPU 平台上运行的所有 Compute Engine 虚拟机都可以使用硬件加速的嵌套虚拟化功能。

constraints/compute.managed.disableNestedVirtualization
停用不符合 FIPS 要求的机器类型

预览版:强制执行此限制条件时,系统会禁止创建或更新使用不符合 FIPS 标准的机器类型的虚拟机实例。默认情况下,允许使用所有机器类型。您可以使用标记和条件规则来排除特定虚拟机。

constraints/compute.managed.disableNonFIPSMachineTypes
限制启用虚拟机串行端口访问权限元数据

此限制条件会禁止将串行端口启用元数据键设置为 true,以防止组织、项目或文件夹(此限制条件在其中强制执行)中的 Compute Engine 虚拟机启用串行端口。默认情况下,可以使用此元数据键以每个虚拟机、每个可用区或每个项目为基础启用串行端口访问。如需允许特定虚拟机访问串行端口,您可以使用标记和条件规则将这些虚拟机从相应政策中排除。
重要提示:强制执行此限制不会影响已将 serial-port-enable 设置为 true 的现有虚拟机;除非更新这些虚拟机的元数据,否则它们将保留访问权限。

constraints/compute.managed.disableSerialPortAccess
禁止虚拟机串行端口输出记录到 Stackdriver

此限制条件在强制执行时,会禁止串行端口从 Compute Engine 虚拟机输出日志记录到 Stackdriver。
默认情况下,Compute Engine 虚拟机的串行端口输出日志记录功能处于停用状态,您可以使用元数据特性针对单个虚拟机或项目有选择地启用此功能。停用串行端口输出日志记录功能可能会导致依赖于它的某些服务(如 Google Kubernetes Engine 集群)无法正常运行。在强制执行此限制条件之前,请确认项目中的产品不依赖于串行端口输出日志记录功能。您可以允许特定虚拟机实例使用串行端口日志记录功能。首先,应用标记来标记实例,然后使用基于标记值的条件规则将这些实例正确地排除在强制执行范围之外。

constraints/compute.managed.disableSerialPortLogging
禁止创建使用已弃用的容器启动代理 (konlet) 的 Compute Engine 实例。

预览版:此布尔值限制条件可防止创建使用已弃用的容器启动代理 konlet 的 Compute Engine 实例。启用后,您将无法创建具有 `gce-container-declaration` 元数据键的计算实例。此限制还会阻止您基于包含 `gce-container-declaration` 元数据键的实例模板创建计算实例,这会影响使用此类实例模板的托管式实例组 (MIG)。

constraints/compute.managed.disableVmsWithContainerStartupAgent
针对具有 ZonalOnly DNS 设置的项目限制了全球内部 DNS (gDNS) 的使用。

强制执行此限制条件时,系统会限制 gDNS 使用。此限制会禁止创建 gDNS 虚拟机,并禁止更新虚拟机以使用 gDNS。将 zDNS 项目恢复为 gDNS 不会被阻止,但会导致在后续的实例 API 调用期间强制执行政策。

constraints/compute.managed.disallowGlobalDns
需要操作系统配置

如果强制执行此限制条件,系统会要求在所有新项目中启用虚拟机管理器(操作系统配置)。对于新项目和现有项目,此限制条件将阻止会在项目、项目级可用区或实例级别停用虚拟机管理器的元数据更新。您可以允许特定虚拟机实例停用虚拟机管理器。首先,应用标记来标记实例,然后使用基于标记值的条件规则将这些实例正确地排除在强制执行范围之外。

constraints/compute.managed.requireOsConfig
要求 OS Login

强制执行此限制条件时,系统会要求在所有新创建的项目中启用 OS Login。如果在新项目和现有的项目中设置此限制,将无法进行会在项目级、项目-可用区级或实例级停用 OS Login 的元数据更新。您可以允许特定虚拟机实例停用 OS Login。首先,应用标记来标记实例,然后使用基于标记值的条件规则将这些实例正确地排除在强制执行范围之外。

constraints/compute.managed.requireOsLogin
限制非机密计算

预览版:要求所有新虚拟机在创建时启用机密计算。默认情况下,新虚拟机不需要使用机密计算。您可以使用标记来标记虚拟机实例,然后根据应用的标记通过条件规则强制执行此限制条件,从而应用/免除此限制条件。

constraints/compute.managed.restrictNonConfidentialComputing
限制协议转发的使用

此限制条件可让您限制可以在组织中创建的协议转发部署类型(内部或外部)。如需配置此限制条件,您可以指定要允许的协议转发部署类型的许可名单。许可名单只能包含以下值:

  • INTERNAL
  • 外部
。例如,如果许可名单设置为“内部”,则用户只能设置内部协议转发。也就是说,与目标实例关联的任何转发规则都仅限于使用 INTERNAL 负载均衡方案,并且必须仅使用内部 IP 地址。

constraints/compute.managed.restrictProtocolForwardingCreationForTypes
限制虚拟机 IP 转发

此限制条件定义了 Compute Engine 虚拟机实例是否可以启用 IP 转发。默认情况下,如果未指定政策,任何虚拟机都可以在任何虚拟网络中启用 IP 转发。如果强制执行此限制条件,系统将拒绝创建或更新已启用 IP 转发的虚拟机实例。您可以允许特定虚拟机实例启用 IP 转发。首先,应用标记来标记实例,然后使用基于标记值的条件规则将这些实例正确地排除在强制执行范围之外。

constraints/compute.managed.vmCanIpForward
限制虚拟机实例的外部 IP

此限制条件用于定义 Compute Engine 虚拟机实例是否可以使用 IPv4 外部 IP 地址。默认情况下,所有虚拟机实例都可以使用外部 IP 地址。如果强制执行此限制条件,系统将拒绝创建或更新具有 IPv4 外部 IP 地址的虚拟机实例。此限制条件不会限制 IPv6 外部 IP 地址的使用。您可以允许特定虚拟机实例使用外部 IPv4 IP 地址。首先,应用标记来标记实例,然后使用基于标记值的条件规则将这些实例正确地排除在强制执行范围之外。

constraints/compute.managed.vmExternalIpAccess

分层元数据评估

依赖于预定义元数据键(例如 OS Login 或串行端口访问权限)的托管式限制支持分层评估。当 Compute Engine 评估这些限制条件时,它会检查在虚拟机实例、项目或可用区级层设置的元数据值。

通过在项目级或可用区级设置元数据值,您可以大规模管理虚拟机实例。不过,限制强制执行仅在虚拟机实例创建或更新 API 调用期间发生。因此,对项目或区域元数据的更改仅在创建或更新虚拟机实例时才会影响该实例的限制条件合规性。

基于元数据的限制和级别

限制条件 元数据键 元数据层次结构级别
compute.managed.disableSerialPortAccess serial-port-enable 项目、可用区、实例
compute.managed.requireOsLogin enable-oslogin 项目、可用区、实例
compute.managed.disableGuestAttributesAccess enable-guest-attributes 项目、可用区、实例
compute.managed.requireOsConfig enable-osconfig 项目、可用区、实例
compute.managed.disallowGlobalDns VmDnsSetting 项目、实例

安全发布:政策生命周期

为防止在逐步实施新限制时出现服务中断,Google 建议您按照以下步骤实施托管式限制:

使用 Policy Simulator 进行分析

在强制执行政策之前,请使用 Policy Simulator 查看哪些现有资源违反了该政策。请按照以下步骤操作:

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

    转到组织政策

  2. 在过滤栏中搜索您的限制条件,然后点击该限制条件的名称以前往其政策详情页面。

  3. 点击测试更改以生成模拟报告。

  4. 分层元数据更改可能需要几个小时才能反映在虚拟机元数据设置限制的模拟报告中。

  5. 查看报告,重新配置不合规的资源或申请豁免。

通过试运行进行验证

试运行模式会将违规行为记录到 Cloud Logging 中,但不会强制执行限制。

如需测试限制条件,请使用 gcloud org-policies set-policy 命令,如下所示:

  1. 创建一个包含 dryRunSpec 的 YAML 格式的政策文件(例如 dry-run-policy.yaml):

    name: projects/PROJECT_ID/policies/compute.managed.requireOsLogin
    dryRunSpec:
      rules:
      - enforce: true
    

    PROJECT_ID 替换为您的项目 ID。

  2. 应用政策:

    gcloud org-policies set-policy dry-run-policy.yaml
    

全面强制执行

模拟并测试政策后,您可以对资源强制执行该政策。政策更改最长可能需要 15 分钟才能在所有Google Cloud 系统中传播。

测试限制条件执行情况

设置政策后,您可以使用 gcloud CLI 验证政策执行情况。例如,如需测试 compute.managed.requireOsLogin 限制条件,请按以下步骤操作:

  1. 列出现有政策以确认您的配置:

    gcloud org-policies list --project=PROJECT_ID
    
  2. 使用 YAML 文件应用强制执行政策:

    gcloud org-policies set-policy enforce_managed_constraint.yaml
    
  3. 通过调用 mutation API 来验证强制执行情况。尝试创建具有不合规元数据的虚拟机实例应会失败:

    gcloud compute instances create VM_NAME \
        --machine-type=MACHINE_TYPE \
        --image-family=IMAGE_FAMILY \
        --image-project=IMAGE_PROJECT \
        --metadata=enable-oslogin=false
    

    替换以下内容:

    • VM_NAME:新虚拟机实例的名称。
    • MACHINE_TYPE:有效的机器类型,例如 e2-micro
    • IMAGE_FAMILY:有效的映像系列,例如 debian-11
    • IMAGE_PROJECT:映像系列的项目,例如 debian-cloud
  4. 查看错误消息。您应该会看到一条拒绝消息,其中指明了违反的具体限制:ERROR: (gcloud.compute.instances.create) Could not fetch resource: - Operation denied by org policy: [constraints/compute.managed.requireOsLogin]

有条件的豁免(使用标记)

您可以根据业务需求,使用标记为特定资源授予例外权限。在此示例中,我们使用名为 osLoginOptional 的标记来标识免于遵守 OS Login 要求的资源。当您将此标记与值为 true 的资源绑定时,组织政策允许该特定资源在未启用 OS Login 的情况下存在,即使该政策在您的环境中的其余部分仍处于严格强制执行状态。

如需使用标记授予例外情况,请按以下步骤操作:

  1. 创建标记:使用 gcloud CLI 创建标记键和标记值。

    1. 创建标记键:

      gcloud resource-manager tags keys create osLoginOptional \
          --parent=organizations/ORGANIZATION_ID
      
    2. 创建标记值:

      gcloud resource-manager tags values create true \
          --parent=organizations/ORGANIZATION_ID/tagKeys/osLoginOptional
      

    ORGANIZATION_ID 替换为您的组织 ID。

  2. 将标记绑定到资源。如需使项目免受 compute.managed.requireOsLogin 限制条件的约束,请使用 gcloud resource-manager tags bindings create 命令osLoginOptional=true 标记绑定到项目:

    gcloud resource-manager tags bindings create \
        --tag-value=ORGANIZATION_ID/osLoginOptional/true \
        --parent=//cloudresourcemanager.googleapis.com/projects/PROJECT_ID \
        --location=global
    

    ORGANIZATION_ID 替换为您的组织 ID,并将 PROJECT_ID 替换为您要豁免的项目 ID。

    如需了解如何将标记绑定到其他资源,请参阅将标记绑定到资源

  3. 更新政策:创建或更新政策 YAML 文件(例如 policy.yaml),以添加条件规则。

    name: projects/PROJECT_ID/policies/compute.managed.requireOsLogin
    spec:
      rules:
      - condition:
          expression: "resource.matchTag('ORGANIZATION_ID/osLoginOptional', 'true')"
        enforce: false
      - enforce: true
    

    替换以下内容:

    • PROJECT_ID:您的项目 ID。
    • ORGANIZATION_ID:您的组织 ID。
  4. 应用政策:使用以下 gcloud CLI 命令激活配置:

    gcloud org-policies set-policy policy.yaml
    

从旧版限制迁移

迁移时请注意,托管式限制在旧版政策的基础上有所改进,但并不能完全复制旧版政策的行为。托管式限制仅在创建或修改资源的 API 请求期间检查违规情况,因此可提供更高的可预测性。如果请求违反了限制条件,API 调用会失败并显示明确的错误。这与旧版政策不同,旧版政策可在操作的各个阶段强制执行,也可用作资源属性,因此强制执行行为的可预测性较低。

从旧版 compute.* 约束迁移到新版 compute.managed.* 等效约束时,请按以下步骤操作,以防止意外收紧限制:

  1. 探索:确定新的受管理限制替代方案。
  2. 分析和验证:使用 Policy Simulator 和试运行,如前所述。
  3. 强制执行受管理的限制条件:将新的受管理的限制条件与旧的限制条件一起应用。
  4. 删除旧版政策:
    • 前往 Google Cloud 控制台中的“资产清单”,按 orgpolicy.Policy 和旧版限制条件名称进行过滤,以识别使用旧版限制条件的所有政策。
    • 删除使用旧版限制条件的所有政策。删除政策会将相应限制条件的政策重置为 Google 管理的默认行为。

后续步骤