使用客戶自行管理的加密金鑰設定加密功能

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

本頁面說明如何使用客戶代管的加密金鑰 (CMEK) 保護 Cloud Composer 環境。

關於客戶自行管理的加密金鑰 (CMEK)

根據預設,Cloud Composer 會加密靜態儲存的客戶內容。Cloud Composer 會處理加密作業,您不必採取任何其他動作。這個選項稱為「Google 預設加密」

如果您想控制加密金鑰,可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),並搭配使用整合 CMEK 的服務,例如 Cloud Composer。使用 Cloud KMS 金鑰可讓您控制金鑰的保護等級、位置、輪替時間表、使用權限和存取權,以及加密範圍。使用 Cloud KMS 還可讓您查看稽核記錄,並控管金鑰生命週期。您可以在 Cloud KMS 中控制及管理用來保護資料的對稱金鑰加密金鑰 (KEK),而非由 Google 擁有及管理這些金鑰。

使用 CMEK 設定資源後,存取 Cloud Composer 資源的體驗就會類似於使用 Google 預設加密功能。如要進一步瞭解加密選項,請參閱「客戶管理的加密金鑰 (CMEK)」。

使用 CMEK 加密保護的資料

Cloud Composer 會使用 CMEK 加密技術保護下列資料:

  • Airflow 資料庫的內容和結構定義
  • Cloud Logging 中的環境和 Airflow 工作記錄檔
  • 環境值區的內容
  • 儲存在環境叢集中的密鑰
  • 工作佇列使用的永久磁碟
  • 儲存在 Artifact Registry 存放區中的環境元件容器映像檔

如要進一步瞭解資料加密方式,請參閱:

未使用 CMEK 加密功能保護的資料

Cloud Monitoring 不支援 CMEK 加密功能。環境名稱和 DAG 名稱會以 Google-owned and Google-managed encryption keys的加密格式儲存在 Monitoring 資料庫中。

Cloud Composer 會儲存以下資訊,並以Google-owned and Google-managed encryption keys進行保護,而非客戶管理的金鑰:

  • 環境名稱
  • Airflow 設定覆寫
  • 環境變數

  • 允許的 IP 範圍說明

  • IP 範圍

  • 標籤

  • Cloud Composer 儲存的部分參數名稱可能包含環境名稱的子字串。

輪替 Cloud Composer 的 CMEK 金鑰

使用 CMEK 金鑰在環境中設定加密功能後,您可能也要考慮定期輪替這些金鑰,如 KMS 說明文件所述。

輪替 CMEK 金鑰時,系統不會使用新金鑰版本,為先前金鑰版本加密的資料重新加密。詳情請參閱「重新加密資料」。

具體來說,這項規定適用於:

  • 儲存在環境值區中的物件。
  • 儲存在 Airflow 資料庫中的資料。
  • 在 Cloud Composer 環境中,使用 CMEK 加密的所有其他資料物件
  • 環境元件容器映像檔,儲存在 Artifact Registry 存放區中。

為環境使用客戶自行管理的加密金鑰

事前準備

  • 您只能在建立環境時設定 CMEK。無法為現有環境啟用 CMEK。

  • Cloud Composer 支援使用儲存在外部金鑰管理工具中的金鑰進行 CMEK 加密。

  • 您必須在與環境所在地區相同的地區中建立 CMEK 金鑰。您無法使用多區域或全域金鑰。

  • 如果您希望環境在 VPC Service Controls 範圍內執行,就必須將 Cloud Key Management Service API 和 Artifact Registry API 新增至範圍。

  • 啟用 Artifact Registry API。

    主控台

    Enable the Artifact Registry API.

    Enable the API

    gcloud

    Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com

步驟 1:建立客戶自行管理的加密金鑰

請按照「建立對稱加密金鑰」一文的步驟,在環境所在的區域建立金鑰。

步驟 2:將角色授予服務代理人

主控台

略過這個步驟。指定環境金鑰時,您會將權限授予服務代理程式

gcloud

下列服務代理人必須在您用於環境的金鑰上具備 Cloud KMS CryptoKey 加密者/解密者 角色。

PROJECT_NUMBER 替換為專案編號

服務代理名稱 服務帳戶電子郵件地址 API 服務名稱
Cloud Composer 服務代理人 service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com composer.googleapis.com
Artifact Registry 服務代理人 service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com artifactregistry.googleapis.com
Kubernetes Engine 服務代理人 service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com container.googleapis.com
Pub/Sub 服務代理 service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com pubsub.googleapis.com
Compute Engine 服務代理人 service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com compute.googleapis.com
Cloud Storage 服務代理人 service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com 使用 gcloud storage service-agent --authorize-cmek 授予加密/解密權限
  1. (如有必要) 如果您的專案中沒有部分服務帳戶,表示您尚未為這項服務建立身分。舉例來說,如果您尚未在專案中建立任何 Cloud Composer 環境,就可能會發生這種情況。

    如要新增這些服務帳戶,請使用下列指令為所列服務建立身分:

    gcloud beta services identity create \
      --service=API_SERVICE_NAME
    

    API_SERVICE_NAME 替換為專案中沒有服務帳戶的服務的 API 服務名稱

    範例:

    gcloud beta services identity create \
      --service=composer.googleapis.com
    
  2. 授予服務專員權限:

    1. 將角色授予 Cloud Composer 服務代理程式:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    2. 將角色授予 Artifact Registry 服務代理:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    3. 將角色授予 GKE 服務代理:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    4. 將角色授予 Pub/Sub 服務代理:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    5. 將角色授予 Compute Engine 服務代理人:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    6. 授予 Cloud Storage 服務代理加密/解密權限。如果您使用自訂環境的儲存空間,可以略過這個步驟。

      gcloud storage service-agent \
        --authorize-cmek=projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
      

    取代:

    • PROJECT_ID 替換為您的專案 ID
    • KEY_PROJECT_ID 與儲存客戶管理金鑰的專案 ID 相關聯。如果您使用其他專案的金鑰,這個值就會與專案 ID 不同。如果您使用的是同一專案的金鑰,這個值就是專案 ID。
    • PROJECT_NUMBER 換成您的專案編號
    • KEY_LOCATION 與您的客戶管理金鑰位置。這個位置必須與環境位置相同。
    • KEY_NAME 替換為您的客戶管理金鑰名稱。
    • KEY_RING_NAME 與用於儲存客戶管理金鑰的鑰匙圈。

    如要取得這些值,您可以執行 gcloud projects describegcloud kms keyrings listgcloud kms keys describe 指令。

步驟 3:使用 CMEK 建立環境

建立客戶代管的加密金鑰後,您就可以使用該金鑰建立 Cloud Composer 環境。

主控台

建立環境時:

  1. 展開「進階設定」部分。 在「Data encryption」(資料加密) 區段中,選取「Cloud Key Management Service key」(Cloud Key Management Service 金鑰)

  2. 在「選取 Cloud Key Management Service 金鑰」下拉式清單中,選取金鑰。

  3. 如果需要額外設定,系統會顯示訊息通知你。在這種情況下:

    1. 按一下「開啟設定精靈」

    2. 在「準備 CMEK 金鑰,以便在 Cloud Composer 中使用」對話方塊中,查看必須在金鑰上具備 Cloud KMS CryptoKey Encrypter/Decrypter 角色的服務代理人清單。

    3. 如要授予必要的角色和權限,請按一下「授予」

gcloud

--kms-key 引數會為環境指定客戶管理的加密金鑰。

如要進一步瞭解如何建立環境,請參閱「建立環境」。例如,您可能需要為環境指定其他參數。

gcloud composer environments create ENVIRONMENT_NAME \
  --location LOCATION \
  --image-version IMAGE_VERSION \
  --kms-key projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • IMAGE_VERSION 改為 Cloud Composer 映像檔的名稱。
  • KEY_PROJECT_ID 與金鑰所在專案的 ID。如果您使用其他專案的鍵,這個值就會與專案 ID 不同。如果您使用的是同一專案的金鑰,這個值就是專案 ID。
  • LOCATION 改成環境所在的地區。
  • KEY_LOCATION 與客戶管理金鑰的位置。這個位置必須與環境的位置相同。
  • KEY_NAME 替換為您的客戶管理金鑰名稱。
  • KEY_RING_NAME 與用於儲存客戶管理金鑰的鑰匙圈。

範例:

gcloud composer environments create example-environment \
  --location us-central1 \
  --image-version composer-2.13.4-airflow-2.10.5 \
  --kms-key projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key

查看環境的加密設定

您可以查看現有環境的加密設定:

主控台

  1. 前往 Google Cloud 控制台的「Environments」頁面。

    前往「環境」

  2. 在環境清單中,按一下環境名稱。「環境詳細資料」頁面隨即開啟。

  3. 前往「環境設定」分頁。

  4. 加密功能的詳細資料會列在「資料加密金鑰」項目中。

gcloud

執行下列 gcloud 指令,查看加密設定

gcloud composer environments describe \
  ENVIRONMENT_NAME \
  --location LOCATION \
  --format="value(config.encryptionConfig)"

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • LOCATION 改成環境所在的地區。

範例:

gcloud composer environments describe \
  example-environment \
  --location us-central1 \
  --format="value(config.encryptionConfig)"

使用 CMEK 管理 Cloud Composer 記錄檔

Cloud Logging 支援使用 CMEK 金鑰加密日誌儲存空間。建議您使用標準 CMEK 程序,透過 CMEK 金鑰加密記錄。

如要使用 CMEK 金鑰加密記錄,請按照「管理用於保護記錄儲存空間資料的金鑰」一文中的指示操作。

將 Cloud Composer 記錄重新導向至使用 CMEK 加密的 Cloud Storage 值區

如果您認為記錄檔可能含有機密資料,建議您使用記錄路由器,將 Cloud Composer 記錄重新導向至使用 CMEK 加密的 Cloud Storage bucket。這麼做可避免系統將您的記錄傳送至監控。

如果您需要 Cloud Customer Care 的支援服務,可能需要授予 Google 支援工程師存取 Cloud Storage 中儲存的 Cloud Composer 記錄檔的權限。

gcloud

  1. 建立新的 Cloud Storage 值區來儲存記錄。

    gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
    

    取代:

    • LOCATION 改成環境所在的地區。
    • BUCKET_NAME 替換為值區的名稱。

    範例:

    gcloud storage buckets create gs://composer-logs-us-central1-example-environment --location=us-central1
    
  2. 使用 CMEK 金鑰加密儲存桶。

    gcloud storage buckets update gs://BUCKET_NAME \
      --default-encryption-key=projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
    

    取代:

    • KEY_PROJECT_ID 與金鑰所在專案的 ID。如果您使用的是其他專案的金鑰,這個值就會與專案 ID 不同。如果您使用同一專案的金鑰,這個值就是專案 ID。
    • KEY_LOCATION 與客戶管理金鑰的位置。這個位置必須與環境的位置相同。
    • KEY_RING_NAME 與用於儲存客戶管理金鑰的鑰匙圈。
    • KEY_NAME 替換為您的客戶管理金鑰名稱。
    • BUCKET_NAME 替換為值區的名稱。

    範例:

    gcloud storage buckets update gs://composer-logs-us-central1-example-environment \
      --default-encryption-key=projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key
    
  3. 建立新的記錄接收器。

    gcloud logging sinks create \
    composer-log-sink-ENVIRONMENT_NAME \
    storage.googleapis.com/BUCKET_NAME \
    --log-filter "resource.type=cloud_composer_environment AND resource.labels.environment_name=ENVIRONMENT_NAME AND resource.labels.location=LOCATION"
    

    取代:

    • ENVIRONMENT_NAME 替換為環境的名稱。
    • LOCATION 改成環境所在的地區。
    • BUCKET_NAME 替換為值區的名稱。

    範例:

    gcloud logging sinks create \
    composer-log-sink-example-environment \
    storage.googleapis.com/composer-logs-us-central1-example-environment \
    --log-filter "resource.type=cloud_composer_environment AND resource.labels.environment_name=example-environment AND resource.labels.location=us-central1"
    
  4. Storage 物件建立者角色授予這個值區的服務帳戶。服務帳戶會顯示在上一個指令的結果中)。

    gcloud projects add-iam-policy-binding \
      PROJECT_ID \
      --member="serviceAccount:LOGGING_SERVICE_AGENT" \
      --role="roles/storage.objectCreator" \
      --condition=None
    

    取代:

    • PROJECT_ID 替換為專案 ID
    • LOGGING_SERVICE_AGENT 與這個值區的 Logging 服務代理人帳戶。這個帳戶的名稱是在前一個步驟中取得。

    範例:

    gcloud projects add-iam-policy-binding \
      example-project \
      --member="serviceAccount:example-sa@gcp-sa-logging.iam.gserviceaccount.com" \
      --role="roles/storage.objectCreator" \
      --condition=None
    
  5. 將新環境的記錄從監控中排除。

    gcloud beta logging sinks update _Default \
      --add-exclusion name=ENVIRONMENT_NAME-exclusion,filter="resource.type=cloud_composer_environment AND resource.labels.environment_name=ENVIRONMENT_NAME AND resource.labels.location=LOCATION"
    

    取代:

    • ENVIRONMENT_NAME 替換為環境的名稱。
    • LOCATION 改成環境所在的地區。

    範例:

    gcloud beta logging sinks update _Default \
      --add-exclusion name=example-environment-exclusion,filter="resource.type=cloud_composer_environment AND resource.labels.environment_name=example-environment AND resource.labels.location=us-central1"
    
  6. 將機構層級的 CMEK 加密功能新增至記錄檔路由器。

    gcloud logging cmek-settings describe \
      --organization=ORGANIZATION_ID
    
    gcloud kms keys add-iam-policy-binding \
          --project=KEY_PROJECT_ID \
          --member LOGGING_SERVICE_AGENT \
          --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
          --location=KEY_LOCATION \
          --keyring=KEY_RING_NAME \
          KEY_NAME
    
    gcloud logging cmek-settings update \
      --organization=ORGANIZATION_ID \
      --kms-project=KEY_PROJECT_ID \
      --kms-keyring=KEY_RING_NAME \
      --kms-location=KEY_LOCATION \
      --kms-key-name=KEY_NAME
    

    取代:

    • ORGANIZATION_ID 改成您的機構 ID
    • KEY_PROJECT_ID 與金鑰所在專案的 ID。如果您使用的是其他專案的金鑰,這個值就會與專案 ID 不同。如果您使用同一專案的金鑰,這個值就是專案 ID。
    • KEY_RING_NAME 與用於儲存客戶管理金鑰的鑰匙圈。
    • KEY_LOCATION 與客戶管理金鑰的位置。這個位置必須與環境的位置相同。
    • KEY_NAME 替換為您的客戶管理金鑰名稱。

後續步驟