使用自定义限制条件管理 Cloud Storage 资源

组织政策为 Cloud Storage 提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义限制条件并在组织政策中使用这些自定义限制条件。

本页介绍了如何设置自定义限制条件,以便在 Cloud Storage 资源上强制执行政策。

如需在生产环境中强制执行新限制条件之前对其进行测试,请使用 Policy Simulator

政策继承

如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个组织强制执行一项政策,Google Cloud 会对该组织中的所有项目强制执行该政策。如需详细了解此行为及其更改方式,请参阅层次结构评估规则

价格

组织政策服务(包括预定义限制条件和自定义限制条件)可免费使用。

限制

  • 只能使用 Google Cloud 控制台或 Google Cloud CLI 设置 Cloud Storage 资源的自定义限制条件。

  • 只能对 Cloud Storage 资源的 CREATEUPDATE 方法强制执行自定义限制条件。

  • 新强制执行的自定义限制条件不会自动应用于现有资源。必须更新现有资源,才能应用该约束条件。

    如需查找需要更新的现有资源,您可以强制执行试运行组织政策

  • 自定义限制条件不能用于限制对象或存储桶的 ACL 或 IAM 政策。

Cloud Storage 支持的资源

对于 Cloud Storage,您可以对以下资源设置自定义限制条件:

所需的角色

如需了解管理具有自定义限制条件的组织政策所需的角色,请参阅所需的角色

除了管理组织政策之外,您可能还需要测试自己创建的自定义限制条件。如需测试自定义限制条件,建议您使用最宽松的预定义角色或自定义角色,这些角色可提供测试特定限制条件所需的权限。如需查看所需的权限和角色,请参阅适用于 Cloud Storage 的角色权限

设置自定义限制条件

控制台

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

    转到“组织政策”

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

  3. 项目选择器中,选择要为其设置组织政策的资源。

  4. 点击 自定义限制条件

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

  6. 限制条件 ID 框中,为新的自定义限制条件输入所需的名称。自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字,例如 custom.enforceBucketVersioning。该字段的长度上限为 70 个字符,不计算前缀(例如 organizations/123456789/customConstraints/custom.)。

  7. 说明字段中,输入直观易懂的限制条件说明,在违反政策时此说明内容会以错误消息的形式显示。此字段的最大长度为 2000 个字符。

  8. 资源类型字段中,选择包含要限制的对象和字段的 Google Cloud REST 资源的名称。例如 storage.googleapis.com/Bucket

  9. 强制执行方法下,选择是否对 REST CREATEUPDATE 方法强制执行限制条件。

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

    1. 添加条件面板中,创建一个引用受支持的服务资源的 CEL 条件,例如 resource.versioning.enabled == true。此字段的长度上限为 1,000 个字符。

    2. 点击保存

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

  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.enforceBucketVersioning。该字段的最大长度为 70 个字符,不计算前缀,例如 organizations/123456789/customConstraints/custom.

  • RESOURCE_NAME:包含要限制的对象和字段的 Google Cloud REST 资源的完全限定名称。例如 storage.googleapis.com/Bucket

  • METHOD1,METHOD2:要对其强制执行限制条件的 RESTful 方法的列表。可以是 CREATECREATEUPDATE

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

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

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

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

为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用 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。 如需了解详情,请参阅查看组织政策

如果请求成功,则输出类似于以下内容:

CUSTOM_CONSTRAINT             ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
custom.uniformBucketLevelAccess  DENY         CREATE,UPDATE  storage.googleapis.com/Bucket  Enable object versioning

如需详细了解如何设置和管理自定义限制条件,请参阅创建和管理自定义限制条件

强制执行限制条件

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

控制台

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

    转到组织政策

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

gcloud

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

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

请替换以下内容:

  • PROJECT_ID:要对其实施限制条件的项目。
  • CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.uniformBucketLevelAccess

如需强制执行包含限制条件的组织政策,请运行以下命令:

    gcloud org-policies set-policy POLICY_PATH
    

POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。

因违反自定义约束条件而被拒绝的请求会失败,并显示 412 错误:CUSTOM_ORGPOLICY_CONSTRAINT_FAILED

示例:创建一个限制条件以对存储桶强制使用客户管理的加密密钥

gcloud

  1. 创建一个包含以下信息的 enforceCMEK.yaml 限制条件文件:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.customerManagedEncryptionKeys
    resource_types: storage.googleapis.com/Bucket
    method_types: CREATE UPDATE
    condition: "has(resource.encryption.defaultKmsKeyName)"
    action_type: ALLOW
    display_name: Enforce Cloud KMS key
    description: When this constraint is enforced, newly created buckets and newly updated buckets must be encrypted with a
    Cloud KMS key. The Cloud KMS key on existing buckets can be updated but not deleted.
  2. 设置自定义限制条件。

    gcloud org-policies set-custom-constraint enforceCMEK.yaml
    
  3. 创建一个包含以下信息的 enforceCMEK-policy.yaml 政策文件。

    name: projects/PROJECT_ID/policies/custom.customerManagedEncryptionKeys
    spec:
      rules:
    enforce: true

    PROJECT_ID 替换为您的项目 ID。

    在此示例中,我们在项目级层强制执行此限制条件,但您也可以在组织或文件夹级层设置此限制条件。

  4. 强制执行该政策:

    gcloud org-policies set-policy enforceCMEK-policy.yaml
    

常见用例的自定义限制条件示例

以下部分介绍一些可能有用的自定义限制条件的语法:

用例 语法
存储桶保留政策的期限必须在指定时长内
      name: organizations/ORGANIZATION_ID/customConstraints/custom.retentionPolicy
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.retentionPeriod not in [3600, 2678400]"
      action_type: DENY
      display_name: Bucket retention policy is either 3,600 seconds or 2,678,400 seconds
      description: Newly created buckets and newly updated buckets must have a
      retention policy that's either 3,600 seconds or 2,678,400 seconds.
存储桶必须启用对象版本控制
      name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceBucketVersioning
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.versioning.enabled == true"
      action_type: ALLOW
      display_name: Buckets must have Object Versioning enabled
      description: Newly created buckets and newly updated buckets must have Object Versioning enabled.
存储桶必须使用特定的正则表达式命名
      name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketName
      method_types:
CREATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.name.matches('^[a-zA-Z]+$')"
      action_type: ALLOW
      display_name: Bucket names must match the specified regular expression
      description: Newly created buckets must have a name that matches the
      specified regular expression. Only letters are allowed in the bucket name.
存储桶无法启用存储桶锁定
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitBucketLock
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.isLocked == true"
      action_type: DENY
      display_name: Prohibit the use of Bucket Lock
      description: Newly created buckets and newly updated buckets cannot have
      Bucket Lock enabled.
存储桶无法启用对象保留锁定
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitObjectRetentionLock
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.objectRetention.mode == 'Enabled'"
      action_type: DENY
      display_name: Objects cannot have retention configurations
      description: Newly created buckets and newly updated buckets cannot have
      Object Retention Lock enabled.
位于 USEU 多区域的存储桶的保留期限必须为 86,400 秒
      name: organizations/ORGANIZATION_ID/customConstraints/custom.locationRetentionPolicy
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "(resource.location.startsWith('US') || resource.location.startsWith('EU')) && resource.retentionPolicy.retentionPeriod != 86400"
      action_type: DENY
      display_name: All buckets in US and EU must have a retention policy of 86,400 seconds
      description: Newly created buckets and newly updated buckets located in
      US and EU regions must have a retention policy of 86,400 seconds.
存储桶必须具有标签1
      name: organizations/ORGANIZATION_ID/customConstraints/custom.labels
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'my_annotations.data.source' in resource.labels && resource.labels['my_annotations.data.source'] in ['SOURCE_IMAGES','SOURCE_TEXT','SOURCE_VIDEOS']"
      action_type: ALLOW
      display_name: Buckets must have a label classifying the contents of the bucket
      description: Newly created buckets and newly updated buckets must have the
      label my_annotations.data.source with the SOURCE_IMAGES, SOURCE_TEXT, or
      SOURCE_VIDEOS key.
存储桶必须位于双区域
      name: organizations/ORGANIZATION_ID/customConstraints/custom.dualRegionUS
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'US-EAST1' in resource.customPlacementConfig.dataLocations && 'US-EAST4' in resource.customPlacementConfig.dataLocations"
      action_type: ALLOW
      display_name: Buckets must be located in a dual-region
      description: Newly created buckets and newly updated buckets must be located in a dual-region
      composed of the us-east1 and us-east4 regions.
存储桶不能使用旧存储类别
      name: organizations/ORGANIZATION_ID/customConstraints/custom.disableLegacyStorageClass
      method_types:
CREATE
UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.storageClass in ['STANDARD', 'NEARLINE', 'COLDLINE', 'ARCHIVE']"
      action_type: ALLOW
      display_name: Buckets cannot use legacy storage classes
      description: Newly created buckets and newly updated buckets must use
      Standard storage, Nearline storage, Coldline storage, or Archive storage.

1 如果指定不存在的存储桶标签键,则系统会返回 BAD_CONDITION 错误。此错误会阻止 CREATEUPDATE 方法在存储桶上运行。为避免此错误,请始终先使用 "my_annotations.data.source" in resource.labels 检查该标签键是否存在。

条件的表达式字段

下表包含可用于创建条件的表达式字段。条件采用通用表达式语言 (CEL) 编写。请注意,这些表达式字段的值区分大小写。

如需了解以下表达式字段以及您可以指定的值的说明,请参阅 适用于 JSON API 的存储桶资源表示法

“表达式”字段 值类型
billing.requesterPays bool
cors list
cors.maxAgeSeconds int
cors.method list
cors.origin list
cors.responseHeader list
customPlacementConfig.dataLocations1 list
defaultEventBasedHold bool
encryption.defaultKmsKeyName string
iamConfiguration.publicAccessPrevention string
iamConfiguration.uniformBucketLevelAccess.enabled bool
labels map
lifecycle.rule list
lifecycle.rule.action.storageClass1 string
lifecycle.rule.action.type string
lifecycle.rule.condition.age int
lifecycle.rule.condition.createdBefore string
lifecycle.rule.condition.customTimeBefore string
lifecycle.rule.condition.daysSinceCustomTime int
lifecycle.rule.condition.daysSinceNoncurrentTime int
lifecycle.rule.condition.isLive bool
lifecycle.rule.condition.matchesPrefix list
lifecycle.rule.condition.matchesStorageClass list
lifecycle.rule.condition.matchesSuffix list
lifecycle.rule.condition.noncurrentTimeBefore string
lifecycle.rule.condition.numNewerVersions int
location1 string
locationType string
logging.logBucket string
logging.logObjectPrefix string
objectRetention.mode string
name string
projectNumber2 string
retentionPolicy.isLocked bool
retentionPolicy.retentionPeriod int
rpo string
softDeletePolicy.retentionDurationSeconds int
storageClass1 string
versioning.enabled bool
website.mainPageSuffix string
website.notFoundPage string

1 此字段的值必须以大写形式编写。

2 此字段已弃用。

注意事项

不建议在自定义限制条件条件中使用存储桶标签。请改用标记,标记只能由具有所需 IAM 角色的个人设置,所受的控制比标签更严格。