客戶代管的加密金鑰 (CMEK)

使用 Dataproc 時,叢集和工作資料會儲存在與叢集中的 Compute Engine VM 相關聯的永久磁碟中,以及 Cloud Storage 暫存值區中。這個永久磁碟和值區資料會經過 Google 產生的資料加密金鑰 (DEK) 和金鑰加密金鑰 (KEK) 加密。

CMEK 功能可讓您建立、使用及撤銷金鑰加密金鑰 (KEK)。Google 仍會控管資料加密金鑰 (DEK)。如要進一步瞭解 Google 資料加密金鑰,請參閱「靜態資料加密」。

搭配叢集資料使用 CMEK

您可以使用客戶自行管理的加密金鑰 (CMEK) 加密下列叢集資料:

  • 連結至 Dataproc 叢集中 VM 的永久磁碟資料
  • 提交至叢集的工作引數資料,例如透過 Spark SQL 工作提交的查詢字串
  • 叢集中繼資料、工作驅動程式輸出內容,以及寫入您建立的 Dataproc 暫存值區的其他資料

請按照下列步驟,搭配使用 CMEK 與叢集資料加密功能:

  1. 使用 Cloud Key Management Service 建立一或多個金鑰。您在後續步驟中使用的資源名稱 (也稱為金鑰的資源 ID) 的結構如下:
    projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
    
  2. 將下列角色指派給下列服務帳戶:

    1. 請遵循 Compute Engine→使用 Cloud KMS 金鑰保護資源→事前準備中第 5 項的說明,將 Cloud KMS CryptoKey Encrypter/Decrypter 角色指派給 Compute Engine 服務代理人 服務帳戶。
    2. 將 Cloud KMS CryptoKey Encrypter/Decrypter 角色指派給 Cloud Storage 服務代理人 服務帳戶。

    3. 將 Cloud KMS CryptoKey Encrypter/Decrypter 角色指派給 Dataproc 服務代理人 服務帳戶。您可以使用 Google Cloud CLI 指派角色:

        gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
        --member serviceAccount:service-PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyEncrypterDecrypter
      

      更改下列內容:

      KMS_PROJECT_ID:執行 Cloud KMS 的 Google Cloud 專案 ID。這項專案也可以是執行 Dataproc 資源的專案。

      PROJECT_NUMBER:執行 Dataproc 資源的 Google Cloud 專案編號 (而非專案 ID)。

    4. 在執行 Dataproc 資源的專案中啟用 Cloud KMS API。

    5. 如果未將 Dataproc 服務代理人角色附加至 Dataproc 服務代理人服務帳戶,請將 serviceusage.services.use 權限新增至附加至 Dataproc 服務代理人服務帳戶的自訂角色。如果 Dataproc 服務代理人角色已附加至 Dataproc 服務代理人服務帳戶,您可以略過這個步驟。

  3. 將金鑰的資源 ID 傳遞至 Google Cloud CLI 或 Dataproc API,以便與叢集資料加密功能搭配使用。

    gcloud CLI

    • 如要使用金鑰為叢集永久磁碟資料加密,請在建立叢集時,將金鑰的資源 ID 傳遞至 --gce-pd-kms-key 標記。
      gcloud dataproc clusters create CLUSTER_NAME \
          --region=REGION \
          --gce-pd-kms-key='projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME' \
          other arguments ...
      

      您可以使用 gcloud 指令列工具驗證金鑰設定。

      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION
      

      指令輸出程式碼片段:

      ...
      configBucket: dataproc- ...
      encryptionConfig:
      gcePdKmsKeyName: projects/project-id/locations/region/keyRings/key-ring-name/cryptoKeys/key-name
      ...
      
    • 如要使用金鑰加密叢集的永久磁碟資料和工作引數資料,請在建立叢集時,將金鑰的資源 ID 傳遞至 --kms-key 旗標。如要查看使用 --kms-key 標記加密的工作類型和引數清單,請參閱 Cluster.EncryptionConfig.kmsKey
      gcloud dataproc clusters create CLUSTER_NAME \
          --region=REGION \
          --kms-key='projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME' \
          other arguments ...
        

      您可以使用 gcloud CLI dataproc clusters describe 指令驗證金鑰設定。在 gcePdKmsKeyNamekmsKey 上設定的金鑰資源 ID,可讓您在叢集永久磁碟和工作引數資料的加密作業中使用金鑰。

      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION
        

      指令輸出程式碼片段:

      ...
      configBucket: dataproc- ...
      encryptionConfig:
      gcePdKmsKeyName: projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
      kmsKey: projects/PROJECT_ID/locations/REGION/keyRings/key-KEY_RING_NAME-name/cryptoKeys/KEY_NAME
      ...
      

    • 如要將叢集中繼資料、工作驅動程式和其他輸出資料加密,並寫入 Cloud Storage 中的 Dataproc 暫存值區:
      gcloud dataproc clusters create CLUSTER_NAME \
          --region=REGION \
          --bucket=CMEK_BUCKET_NAME \
          other arguments ...
          

      如果工作採用值區引數,您還可以將啟用 CMEK 功能的值區傳送至 `gcloud dataproc jobs submit` 指令,如以下 `cmek-bucket` 範例所示:

      gcloud dataproc jobs submit pyspark gs://cmek-bucket/wordcount.py \
          --region=region \
          --cluster=cluster-name \
          -- gs://cmek-bucket/shakespeare.txt gs://cmek-bucket/counts
        

    REST API

    • 如要使用金鑰加密叢集 VM 永久磁碟資料,請將 ClusterConfig.EncryptionConfig.gcePdKmsKeyName 欄位納入 cluster.create 要求。

      您可以使用 gcloud CLI dataproc clusters describe 指令驗證金鑰設定。

      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION
      

      指令輸出程式碼片段:

      ...
      configBucket: dataproc- ...
      encryptionConfig:
      gcePdKmsKeyName: projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
      ...
      
    • 如要使用金鑰加密叢集 VM 永久磁碟資料和工作引數資料,請在 cluster.create 要求中加入 Cluster.EncryptionConfig.kmsKey 欄位。如要查看使用 --kms-key 欄位加密的工作類型和引數清單,請參閱 Cluster.EncryptionConfig.kmsKey

      您可以使用 gcloud CLI dataproc clusters describe 指令驗證金鑰設定。在 gcePdKmsKeyNamekmsKey 上設定的金鑰資源 ID,可讓您在叢集永久磁碟和工作引數資料的加密作業中使用金鑰。

      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION
      

      指令輸出程式碼片段:

      ...
      configBucket: dataproc- ...
      encryptionConfig:
      gcePdKmsKeyName: projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
      kmsKey: projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
      
    • To encrypt cluster metadata, job driver, and other output data written to your Dataproc staging bucket in Cloud Storage:
      gcloud dataproc clusters create CLUSTER_NAME \
          --region=REGION \
          --bucket=CMEK_BUCKET_NAMEt \
          other arguments ...
      

      如果工作採用值區引數,您還可以將啟用 CMEK 功能的值區傳送至 `gcloud dataproc jobs submit` 指令,如以下 `cmek-bucket` 範例所示:

      gcloud dataproc jobs submit pyspark gs://cmek-bucket/wordcount.py \
          --region=region \
          --cluster=cluster-name \
          -- gs://cmek-bucket/shakespeare.txt gs://cmek-bucket/counts
        

搭配工作流程範本資料使用 CMEK

您可以使用 CMEK 對 Dataproc 工作流程範本工作引數資料進行加密,例如 Spark SQL 工作的查詢字串。請按照本節的步驟 1、2 和 3,將 CMEK 與 Dataproc 工作流程範本搭配使用。如要查看啟用此功能時,使用 CMEK 加密的工作流程範本工作類型和引數清單,請參閱 WorkflowTemplate.EncryptionConfig.kmsKey

  1. 使用 Cloud Key Management Service (Cloud KMS) 建立金鑰。您在後續步驟中使用的金鑰資源名稱,其名稱的建構方式如下:
    projects/project-id/locations/region/keyRings/key-ring-name/cryptoKeys/key-name
    
  2. 如要讓 Dataproc 服務帳戶使用您的金鑰:

    1. 將 Cloud KMS CryptoKey Encrypter/Decrypter 角色指派給 Dataproc 服務代理人服務帳戶。您可以使用 gcloud CLI 指派角色:

       gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
       --member serviceAccount:service-PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \
       --role roles/cloudkms.cryptoKeyEncrypterDecrypter
      

      更改下列內容:

      KMS_PROJECT_ID:執行 Cloud KMS 的 Google Cloud 專案 ID。這項專案也可以是執行 Dataproc 資源的專案。

      PROJECT_NUMBER:執行 Dataproc 資源的 Google Cloud 專案編號 (而非專案 ID)。

    2. 在執行 Dataproc 資源的專案中啟用 Cloud KMS API。

    3. 如果未將 Dataproc 服務代理人角色附加至 Dataproc 服務代理人服務帳戶,請將 serviceusage.services.use 權限新增至附加至 Dataproc 服務代理人服務帳戶的自訂角色。如果 Dataproc 服務代理人角色已附加至 Dataproc 服務代理人服務帳戶,您可以略過這個步驟。

  3. 您可以使用 Google Cloud CLI 或 Dataproc API,在工作流程中設定您在步驟 1 中建立的金鑰。在工作流程中設定金鑰後,系統會使用 WorkflowTemplate.EncryptionConfig.kmsKey 中列出的任何工作類型和引數的金鑰,對所有工作流程工作引數和查詢進行加密。

    gcloud CLI

    使用 gcloud dataproc workflow-templates create 指令建立工作流程範本時,請將金鑰的資源 ID 傳送至 --kms-key 標記。

    範例:

    gcloud dataproc workflow-templates create my-template-name \
        --region=region \
        --kms-key='projects/project-id/locations/region/keyRings/key-ring-name/cryptoKeys/key-name' \
        other arguments ...
    
    您可以使用 gcloud 指令列工具驗證金鑰設定。
    gcloud dataproc workflow-templates describe TEMPLATE_NAME \
        --region=REGION
    
    ...
    id: my-template-name
    encryptionConfig:
    kmsKey: projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
    ...
    

    REST API

    workflowTemplates.create 要求中使用 WorkflowTemplate.EncryptionConfig.kmsKey

    您可以發出 workflowTemplates.get 要求來驗證金鑰設定。傳回的 JSON 包含 kmsKey 清單:

    ...
    "id": "my-template-name",
    "encryptionConfig": {
      "kmsKey": "projects/project-id/locations/region/keyRings/key-ring-name/cryptoKeys/key-name"
    },
    

Cloud External Key Manager

Cloud External Key Manager (Cloud EKM) (EKM) 可讓您使用支援的外部金鑰管理合作夥伴管理的金鑰來保護 Dataproc 資料。在 Dataproc 中使用 EKM 的步驟與設定 CMEK 金鑰的步驟相同,但有以下差異:金鑰會指向外部管理金鑰的 URI (請參閱 Cloud EKM 簡介)。

Cloud EKM 錯誤

使用 Cloud EKM 時,建立叢集的嘗試可能會失敗,原因是與輸入內容、Cloud EKM、外部金鑰管理合作夥伴系統或 EKM 與外部系統之間的通訊相關的錯誤。如果您使用的是 REST API 或 Google Cloud 控制台,錯誤會記錄在「Logging」中。您可以透過「查看記錄檔」分頁檢視失敗叢集的錯誤。