重新加密違反強制加密規則的物件

本頁面說明如何使用 Storage Intelligence 建議工具,找出並重新加密違反 bucket 加密強制執行設定的物件。

強制執行或限制 bucket 的加密類型時,Cloud Storage 會對 bucket 中所有新物件或重寫物件強制執行該設定。不過,Cloud Storage 不會自動重新加密您在設定生效前上傳的現有物件。這些物件會維持原有的加密方式。如要進一步瞭解可用的加密方法,請參閱「資料加密選項」。

如果 bucket 含有使用受限加密方法的物件,Storage Intelligence 建議工具會顯示「Objects violate enforced encryption rules」(物件違反強制加密規則) 發現項目。發現項目是指從指標和物件中繼資料偵測到的異常狀況或安全性設定落差,需要您留意。如要概略瞭解 Storage Intelligence 建議工具,請參閱「關於 Storage Intelligence 建議工具」。如需完整的發現項目清單,請參閱「發現項目參考目錄」。

觸發發現項目的門檻

啟用 Storage Intelligence 後,Cloud Storage 會自動評估物件層級加密中繼資料,並與專案、資料夾或組織的值區層級加密強制執行設定進行比較。如果 bucket 同時符合下列兩項條件,Storage Intelligence 建議工具就會產生發現項目:

  • 值區會限制 enforcedEncryptionAllowedTypes 設定中的一或多種加密方法,例如標準加密 (Google 預設加密或 GMEK)、客戶自行管理的加密金鑰 (CMEK) 或客戶提供的加密金鑰 (CSEK)。
  • 值區至少包含一個物件,且該物件的 encryptionType 中繼資料欄位不在值區的 enforcedEncryptionAllowedTypes 清單中。

啟用 Storage Intelligence 後,初始基準發現項目會在 48 小時內顯示,並每 24 小時更新一次。為減少警告數量,Storage Intelligence 建議工具會在資訊主頁上,依 bucket 匯總物件層級的違規事項。您可以在 Storage Insights 資料集中,查詢物件層級的加密中繼資料。

回應發現項目

如要回應發現項目,請找出各值區中受影響的物件,並使用允許的加密方法重寫不符合規定的物件:

  1. 查看發現項目詳細資料,找出受影響的值區及其允許的加密類型 (CMEK、GMEK 或 CSEK)。

  2. 選用:如要列出受影響 bucket 中違反強制執行加密設定的物件,請在 BigQuery 中查詢 儲存空間分析 資料集。如果尚未設定連結的資料集,請參閱「設定儲存空間分析資料集」。

    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:以半形逗號分隔的清單,列出 bucket 允許的加密類型,例如 'CMEK' 或 'CMEK', 'GMEK'。
  3. 請參閱下表,選取使用中物件的重新加密方法:

    情境 建議做法 詳細資料
    值區允許客戶自行管理的加密金鑰 (CMEK) 使用 CMEK 重新加密物件 如果是 GMEK 物件,請從 BigQuery 匯出 CSV 資訊清單檔案,並執行儲存空間批次作業,使用 Cloud KMS 金鑰重寫物件。如果是 CSEK 加密物件,請執行 gcloud storage objects update 指令。
    bucket 允許標準加密 (GMEK) 使用標準加密 (GMEK) 重新加密物件 確認 bucket 沒有預設 Cloud KMS 金鑰,然後使用 gcloud storage objects update 指令搭配 --clear-encryption-key 旗標,以標準加密方式重寫受影響的物件。
    值區僅允許客戶提供的加密金鑰 (CSEK) 使用 CSEK 重新加密物件 使用 gcloud storage objects update 指令和 --encryption-key 旗標,以 AES-256 加密金鑰重新寫入受影響的物件。

    重新加密 bucket 中所有不符合規定的物件後,系統會在下一個 24 小時重新整理週期內,清除該 bucket 的發現項目。不過,在下列情況下,發現項目會保持啟用狀態,直到您或 Cloud Storage 永久刪除保留的物件版本:

使用 CMEK 重新加密物件

如果 bucket 允許客戶自行管理的加密金鑰 (CMEK),請根據受影響物件目前的加密方法,重新加密這些物件。

使用儲存空間批次作業,大規模重新加密以 GMEK 加密的物件

如要使用 CMEK 大規模重新加密 GMEK 加密物件,請從 BigQuery 匯出 CSV 資訊清單檔案,並執行儲存空間批次作業工作:

  1. 在 BigQuery 中執行下列 EXPORT DATA 查詢,使用 Storage Insights 資料集建立 CSV 資訊清單,找出使用標準加密 (GMEK) 的受影響現行物件:

    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 bucket 名稱。
    • DATASET_NAME:BigQuery 中儲存空間分析連結資料集的名稱。
    • BUCKET_NAME:受影響值區的名稱。
  2. 完成儲存空間批次作業必要條件,並請管理員將 Cloud KMS 金鑰的 Cloud KMS CryptoKey 加密者/解密者角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予下列兩個服務代理:

    • 儲存空間批次作業服務代理 (service-PROJECT_NUMBER@gcp-sa-storagebatchoperations.iam.gserviceaccount.com)
    • Cloud Storage 服務代理 (service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com)

    將 PROJECT_NUMBER 替換為 bucket 所在專案的專案編號。

  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:存放匯出資訊清單檔案的 bucket 名稱。
    • KMS_KEY:要用來加密物件的 Cloud KMS 金鑰資源名稱。金鑰必須與 bucket 位於相同位置,且格式須為 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) 重新加密物件,請確認 bucket 沒有預設 Cloud KMS 金鑰,並清除每個受影響物件的自訂加密金鑰:

  1. 確認 bucket 沒有預設 Cloud KMS 金鑰。清除物件的自訂加密金鑰時,如果 bucket 沒有預設的 Cloud KMS 金鑰,Cloud Storage 會使用標準加密 (GMEK) 加密物件。如果 bucket 有預設的 Cloud KMS 金鑰,Cloud Storage 會改用該金鑰加密物件。如果 bucket 也限制 CMEK,重寫作業就會失敗。

    如要從 bucket 中移除預設 Cloud KMS 金鑰,請執行 gcloud storage buckets update 指令並加上 --clear-default-encryption-key 旗標:

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

    將 BUCKET_NAME 替換為受影響的值區名稱。

  2. 使用 gcloud storage objects update 指令搭配 --clear-encryption-key 旗標,以標準加密方式重新寫入受影響的物件。如果物件是以客戶提供的加密金鑰 (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 重新加密物件

如果 bucket 只允許客戶提供的加密金鑰 (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 旗標。

後續步驟