客戶代管的加密金鑰 (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
      ...
      
    • 如要使用金鑰加密叢集 Persistent Disk 資料和工作引數資料,請在建立叢集時,將金鑰的資源 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 指令驗證金鑰設定。金鑰資源 ID 會在 gcePdKmsKeyNamekmsKey 上設定,以便使用金鑰加密叢集永久磁碟和工作引數資料。

      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 永久磁碟資料,請在 cluster.create 要求中加入 ClusterConfig.EncryptionConfig.gcePdKmsKeyName 欄位。

      您可以使用 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 指令驗證金鑰設定。金鑰資源 ID 會在 gcePdKmsKeyNamekmsKey 上設定,以便使用金鑰加密叢集永久磁碟和工作引數資料。

      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 與工作流程範本資料

Dataproc 工作流程範本工作引數資料 (例如 Spark SQL 工作的查詢字串) 可以使用 CMEK 加密。請按照本節中的步驟 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

    使用 WorkflowTemplate.EncryptionConfig.kmsKey 做為 workflowTemplates.create 要求的一部分。

    您可以發出 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) 可讓您使用支援的外部金鑰管理合作夥伴代管的金鑰,保護 Dataproc 資料。在 Dataproc 中使用 EKM 的步驟與設定 CMEK 金鑰的步驟相同,但有以下差異:您的金鑰會指向外部管理金鑰的 URI (請參閱「Cloud EKM 總覽」)。

Cloud EKM 錯誤

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