重新加密违反强制加密规则的对象

本页面介绍了如何使用 Storage Intelligence Advisor 识别并重新加密违反其存储桶加密强制执行配置的对象。

当您强制执行或限制存储桶的加密类型时,Cloud Storage 会对存储桶中的所有新对象或重写对象强制执行该配置。不过,Cloud Storage 不会自动重新加密您在配置生效之前上传的现有对象。这些对象仍使用其原始加密方法进行加密。如需详细了解可用的加密方法,请参阅数据加密选项。

如果存储桶中包含使用受限加密方法的对象,Storage Intelligence Advisor 会显示对象违反了强制加密规则这一发现结果。发现结果是指从指标和对象元数据中检测到的异常或安全配置差距,需要您注意。如需简要了解 Storage Intelligence Advisor,请参阅 Storage Intelligence Advisor 简介。如需查看发现结果的完整列表,请参阅发现结果参考目录。

触发发现结果的阈值

启用 Storage Intelligence 后,Cloud Storage 会自动根据项目、文件夹或组织中的存储桶级加密强制执行配置,评估对象级加密元数据。当存储桶同时满足以下两个条件时,Storage Intelligence Advisor 会生成发现结果:

  • 该存储桶在其 enforcedEncryptionAllowedTypes 配置中限制了一种或多种加密方法,例如标准加密(Google 默认加密或 GMEK)、客户管理的加密密钥 (CMEK) 或客户提供的加密密钥 (CSEK)。
  • 存储桶包含至少一个对象,其 encryptionType 元数据字段不在存储桶的 enforcedEncryptionAllowedTypes 列表中。

初始基准发现结果会在您启用 Storage Intelligence 后的 48 小时内显示,并每 24 小时刷新一次。为了减少提醒数量,Storage Intelligence Advisor 会在信息中心内按存储桶汇总对象级违规行为。您可以在 Storage Insights 数据集中查询对象级加密元数据。

响应发现结果

如需响应发现结果,请找出每个存储桶中受影响的对象,并使用允许的加密方法重写不合规的对象:

  1. 查看发现结果详情,以确定受影响的存储桶及其允许的加密类型(CMEK、GMEK 或 CSEK)。

  2. 可选:如需列出受影响存储桶中违反强制执行的加密配置的对象,请在 BigQuery 中查询 Storage Insights 数据集。如果您尚未配置关联的数据集,请参阅配置 Storage Insights 数据集。

    SELECT
      bucket,
      name,
      encryptionType
    FROM
      `DATASET_NAME.object_attributes_latest_snapshot_view`
    WHERE
      bucket = 'BUCKET_NAME'
      AND encryptionType NOT IN (ALLOWED_ENCRYPTION_TYPES)
      AND timeDeleted IS NULL
      AND softDeleteTime IS NULL;

    替换以下内容:

    • DATASET_NAME:BigQuery 中存储空间分析关联数据集的名称。
    • BUCKET_NAME:受影响的存储桶的名称。
    • ALLOWED_ENCRYPTION_TYPES:存储桶允许的加密类型的英文逗号分隔列表,例如 'CMEK' 或 'CMEK', 'GMEK'。
  3. 使用下表为您的实时对象选择重新加密方法:

    场景 建议采取的操作 详细信息
    存储桶允许使用客户管理的加密密钥 (CMEK) 使用 CMEK 重新加密对象 对于活跃的 GMEK 对象,请从 BigQuery 导出 CSV 清单文件,然后运行存储批量操作作业,以使用 Cloud KMS 密钥重写这些对象。对于 CSEK 加密对象,请运行 gcloud storage objects update 命令。
    存储桶允许标准加密 (GMEK) 使用标准加密 (GMEK) 重新加密对象 验证该存储桶没有默认 Cloud KMS 密钥,然后使用带有 --clear-encryption-key 标志的 gcloud storage objects update 命令,通过标准加密重写受影响的对象。
    存储桶仅允许使用客户提供的加密密钥 (CSEK) 使用 CSEK 重新加密对象 使用带有 --encryption-key 标志的 gcloud storage objects update 命令,通过 AES-256 加密密钥重写受影响的对象。

    在您重新加密存储桶中的所有不合规对象后,该存储桶的发现结果将在下一个 24 小时刷新周期内清除。不过,在以下情况下,发现结果会保持有效,直到您或 Cloud Storage 永久删除保留的对象版本:

使用 CMEK 重新加密对象

如果存储桶允许使用客户管理的加密密钥 (CMEK),请根据受影响对象的当前加密方法对其进行重新加密。

使用存储批量操作大规模重新加密 GMEK 加密的对象

如需使用 CMEK 大规模重新加密 GMEK 加密的对象,请从 BigQuery 导出 CSV 清单文件,并运行存储批量操作作业:

  1. 在 BigQuery 中运行以下 EXPORT DATA 查询, 使用存储空间分析集为使用标准加密 (GMEK) 的受影响 实时对象创建 CSV 清单:

    EXPORT DATA OPTIONS(
      uri='gs://DESTINATION_BUCKET/manifests/objects_violating_enforced_policies_*.csv',
      format='CSV',
      overwrite=true,
      header=true
    ) AS
    SELECT
      bucket,
      name
    FROM
      `DATASET_NAME.object_attributes_latest_snapshot_view`
    WHERE
      bucket = 'BUCKET_NAME'
      AND encryptionType = 'GMEK'
      AND timeDeleted IS NULL
      AND softDeleteTime IS NULL;

    替换以下内容:

    • DESTINATION_BUCKET:您要存储导出的 CSV 清单文件的 Cloud Storage 存储桶的名称。
    • DATASET_NAME:BigQuery 中存储空间分析关联数据集的名称。
    • BUCKET_NAME:受影响的存储桶的名称。
  2. 完成存储批量操作前提条件,并让您的管理员向以下两个服务代理授予 Cloud KMS 密钥的 Cloud KMS CryptoKey Encrypter/Decrypter 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter):

    • 存储批量操作服务代理 (service-PROJECT_NUMBER@gcp-sa-storagebatchoperations.)
    • Cloud Storage 服务代理 (service-PROJECT_NUMBER@gs-project-accounts.)

    将 PROJECT_NUMBER 替换为包含存储桶的项目的项目编号。

  3. 运行 gcloud storage batch-operations jobs create 命令,使用清单文件创建 Storage 批量操作作业,并使用 Cloud KMS 密钥重写对象。如需在修改对象之前验证作业配置,请添加 --dry-run 标志:

    gcloud storage batch-operations jobs create JOB_NAME \
      --bucket="BUCKET_NAME" \
      --manifest-location="gs://DESTINATION_BUCKET/manifests/objects_violating_enforced_policies_*.csv" \
      --rewrite-object="kms-key=KMS_KEY"

    替换以下内容:

    • JOB_NAME:批量作业的唯一 ID,例如 re-encrypt-objects-job。
    • BUCKET_NAME:受影响的存储桶的名称。
    • DESTINATION_BUCKET:包含导出的清单文件的存储桶的名称。
    • KMS_KEY:您要用于加密对象的 Cloud KMS 密钥的资源名称。密钥必须与存储桶位于同一位置,并使用 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY 格式。

使用 Google Cloud CLI 重新加密 CSEK 加密的对象

由于 Google Cloud 不会存储客户提供的加密密钥 (CSEK),因此存储批量操作无法解密 CSEK 加密的对象。如需使用 CMEK 重新加密 CSEK 加密的对象,请运行 gcloud storage objects update 命令,并同时使用 --decryption-keys 和 --encryption-key 标志:

gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME \
  --decryption-keys=DECRYPTION_KEY \
  --encryption-key=KMS_KEY

替换以下内容:

  • BUCKET_NAME:受影响的存储桶的名称。
  • OBJECT_NAME:要重新加密的 CSEK 加密对象的名称。如需在单个命令中更新多个对象,请使用 URI 通配符或 --read-paths-from-stdin (-I) 标志。
  • DECRYPTION_KEY:用于加密对象的 RFC 4648 base64 编码 AES-256 密钥。
  • KMS_KEY:您要用于加密对象的 Cloud KMS 密钥的资源名称,格式为 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY。

使用标准加密 (GMEK) 重新加密对象

如需使用标准加密(Google 默认加密或 GMEK)重新加密对象,请验证存储桶是否没有默认 Cloud KMS 密钥,并清除每个受影响对象上的自定义加密密钥:

  1. 验证存储桶没有默认 Cloud KMS 密钥。当您清除对象的自定义加密密钥时,仅当存储桶没有默认 Cloud KMS 密钥时,Cloud Storage 才会使用标准加密 (GMEK) 对对象进行加密。如果存储桶具有默认 Cloud KMS 密钥,则 Cloud Storage 会改用该密钥对对象进行加密。如果存储桶也限制 CMEK,则重写会失败。

    如需从存储桶中移除默认 Cloud KMS 密钥,请运行带有 --clear-default-encryption-key 标志的 gcloud storage buckets update 命令:

    gcloud storage buckets update gs://BUCKET_NAME \
      --clear-default-encryption-key

    将 BUCKET_NAME 替换为受影响存储桶的名称。

  2. 使用带有 --clear-encryption-key 标志的 gcloud storage objects update 命令,通过标准加密重写受影响的对象。如果对象使用客户提供的加密密钥 (CSEK) 进行加密,请同时添加 --decryption-keys 标志:

    gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME \
      --clear-encryption-key \
      [--decryption-keys=DECRYPTION_KEY]

    替换以下内容:

    • BUCKET_NAME:受影响的存储桶的名称。
    • OBJECT_NAME:您要重新加密的对象的名称。如需在单个命令中更新多个对象,请使用 URI 通配符(例如 gs://BUCKET_NAME/**)或 --read-paths-from-stdin (-I) 标志。
    • DECRYPTION_KEY:如果对象使用 CSEK 加密,则为加密对象的 RFC 4648 base64 编码 AES-256 密钥。如果对象使用 CMEK 加密,请省略 --decryption-keys 标志。

使用 CSEK 重新加密对象

如果存储桶仅允许使用客户提供的加密密钥 (CSEK),请使用 gcloud storage objects update 命令和 --encryption-key 标志,通过 AES-256 加密密钥重写受影响的对象。如果对象使用其他 CSEK 加密,请同时添加 --decryption-keys 标志:

gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME \
  --encryption-key=YOUR_ENCRYPTION_KEY \
  [--decryption-keys=DECRYPTION_KEY]

替换以下内容:

  • BUCKET_NAME:受影响的存储桶的名称。
  • OBJECT_NAME:您要重新加密的对象的名称。如需在单个命令中更新多个对象,请使用 URI 通配符或 --read-paths-from-stdin (-I) 标志。
  • YOUR_ENCRYPTION_KEY:您的 RFC 4648 base64 编码 AES-256 加密密钥字符串。
  • DECRYPTION_KEY:如果对象使用不同的 CSEK 加密,则为加密对象的 RFC 4648 base64 编码 AES-256 密钥。如果对象使用 GMEK 或 CMEK 加密,请省略 --decryption-keys 标志。

后续步骤