客户管理的加密密钥 (CMEK)

当您使用 Dataproc 时,集群和作业数据存储在与集群中的 Compute Engine 虚拟机相关联的永久性磁盘上以及 Cloud Storage 暂存存储桶中。此永久性磁盘和存储桶数据均采用 Google 生成的数据加密密钥 (DEK) 和密钥加密密钥 (KEK) 进行了加密。

借助 CMEK 功能,您可以创建、使用和撤消密钥加密密钥 (KEK)。Google 仍然负责控制数据加密密钥 (DEK)。如需详细了解 Google 数据加密密钥,请参阅静态加密

将 CMEK 与集群数据搭配使用

您可以使用客户管理的加密密钥 (CMEK) 来加密以下集群数据:

  • 挂接到 Dataproc 集群中的虚拟机的永久性磁盘上的数据
  • 提交到集群的作业参数数据,例如随 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 Service Agent 角色未附加到 Dataproc Service Agent 服务账号,请将 serviceusage.services.use 权限添加到附加到 Dataproc Service Agent 服务账号的自定义角色。如果 Dataproc Service Agent 角色已附加到 Dataproc Service Agent 服务账号,则可以跳过此步骤。

  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

    • 如需使用您的密钥加密集群虚拟机永久性磁盘数据,请在 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
      ...
      
    • 如需使用您的密钥加密集群虚拟机永久性磁盘数据和作业参数数据,请将 Cluster.EncryptionConfig.kmsKey 字段包含在 cluster.create 请求中。如需查看使用 --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 与工作流模板数据搭配使用

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 Service Agent 服务账号。您可以使用 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 Service Agent 角色未附加到 Dataproc Service Agent 服务账号,请将 serviceusage.services.use 权限添加到附加到 Dataproc Service Agent 服务账号的自定义角色。如果 Dataproc Service Agent 角色已附加到 Dataproc Service Agent 服务账号,则可以跳过此步骤。

  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 中记录错误。您可以通过查看日志标签页检查失败集群的错误。