使用 Dataproc 时,集群和作业数据存储在 与集群中的 Compute Engine 虚拟机关联的磁盘,以及 存储到 暂存存储桶。 此永久性磁盘和存储桶数据使用 Google 生成的数据加密密钥进行加密 (DEK) 和密钥加密密钥 (KEK)。
借助 CMEK 功能,您可以创建、使用 并撤消密钥加密密钥 (KEK)。Google 仍然掌控着数据 加密密钥 (DEK)。如需详细了解 Google 数据加密密钥,请参阅 静态加密。
将 CMEK 用于集群数据
您可以使用客户管理的加密密钥 (CMEK) 对以下集群数据进行加密:
- 挂接到 Dataproc 集群中虚拟机的永久性磁盘上的数据
- 作业参数数据提交到您的集群,例如提交的查询字符串 (使用 Spark SQL 作业)
- 集群元数据、作业驱动程序输出 以及写入 Dataproc 暂存存储桶 由您自己创建的
请按照以下步骤使用 CMEK 加密集群数据:
- 使用 Cloud Key Management Service 创建一个或多个密钥。
资源名称(也称为密钥的资源 ID)是您将在后续步骤中使用的
的构建方式如下:
projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
将以下角色分配给以下服务账号:
- 关注以下视频中的第 5 项: Compute Engine→使用 Cloud KMS 密钥保护资源→准备工作 将 Cloud KMS 分配给 加密密钥加密者/解密者 Compute Engine Service Agent 服务账号。
分配 Cloud KMS 加密密钥加密者/解密者 角色分配给 Cloud Storage 服务代理 服务账号。
分配 Cloud KMS 加密密钥加密者/解密者 角色分配给 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
:您执行创建工作的 Google Cloud 项目的 ID Cloud KMS此项目也可以是运行 Dataproc 资源的项目。PROJECT_NUMBER
:运行 Dataproc 资源的 Google Cloud 项目的项目编号(不是项目 ID)。对运行 Dataproc 资源的项目启用 Cloud KMS API。
如果 Dataproc Service Agent 角色未附加到 Dataproc Service Agent 服务账号 然后将
serviceusage.services.use
权限添加到自定义 连接到 Dataproc 服务代理。如果 Dataproc 服务代理角色为 连接到 Dataproc 服务代理,则可以跳过此步骤。
将密钥的资源 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
标志。 请参阅 Cluster.EncryptionConfig.kmsKey 获取使用--kms-key
标志加密的作业类型和参数的列表。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 设置于gcePdKmsKeyName
和kmsKey
,以将您的密钥用于 集群永久性磁盘和作业参数数据。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 暂存存储桶:
<ph type="x-smartling-placeholder">
- </ph>
- 使用 CMEK 创建您自己的存储桶。时间 将密钥添加到存储桶 请使用您在第 1 步中创建的密钥。
- 创建集群时,请将存储桶名称传递给
--bucket
标志。
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --bucket=CMEK_BUCKET_NAME \ other arguments ...
您还可以将支持 CMEK 的存储分区传递给“gcloud gclid 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
- 如需使用您的密钥加密集群虚拟机永久性磁盘数据,请添加
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 ...
- 使用以下代码加密集群虚拟机永久性磁盘数据和作业参数数据:
您的密钥,请将
Cluster.EncryptionConfig.kmsKey
字段作为 cluster.create 请求。请参阅 Cluster.EncryptionConfig.kmsKey 获取使用--kms-key
字段加密的作业类型和参数的列表。您可以使用 gcloud CLI 验证密钥设置
dataproc clusters describe
命令。密钥资源 ID 设置于gcePdKmsKeyName
和kmsKey
,以将您的密钥用于 集群永久性磁盘和作业参数数据。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:
- Create your own bucket with CMEK. When adding the key to the bucket, use a key that you created in Step 1.
- Pass the bucket name to the ClusterConfig.configBucket field as part of a cluster.create request.
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --bucket=CMEK_BUCKET_NAMEt \ other arguments ...
您还可以将支持 CMEK 的存储分区传递给“gcloud gclid 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
- 如需使用您的密钥加密集群永久性磁盘数据,请将以下代码传递
将密钥的资源 ID 添加到
将 CMEK 与工作流模板数据结合使用
Dataproc 工作流模板作业参数数据, 例如 Spark SQL 作业的查询字符串,可以使用 CMEK。请按照本部分中的第 1 步、第 2 步和第 3 步操作,将 CMEK 用于您的 Dataproc 工作流模板。请参阅 WorkflowTemplate.EncryptionConfig.kmsKey 获取使用 CMEK 加密的工作流模板作业类型和参数列表 。
- 使用 Cloud Key Management Service (Cloud KMS) 创建密钥。
密钥的资源名称,将在后续步骤中使用。
名称的结构如下:
projects/project-id/locations/region/keyRings/key-ring-name/cryptoKeys/key-name
要让 Dataproc 服务账号能够使用您的密钥,请执行以下操作:
将 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
:您执行创建工作的 Google Cloud 项目的 ID Cloud KMS此项目也可以是运行 Dataproc 资源的项目。PROJECT_NUMBER
:运行 Dataproc 资源的 Google Cloud 项目的项目编号(不是项目 ID)。对运行 Dataproc 资源的项目启用 Cloud KMS API。
如果 Dataproc 服务代理角色未关联到 Dataproc Service Agent 服务账号, 然后将
serviceusage.services.use
权限添加到自定义 连接到 Dataproc 服务代理。如果 Dataproc 服务代理角色为 连接到 Dataproc 服务代理,则可以跳过此步骤。
您可以使用 Google Cloud CLI 或 Dataproc API 以便在工作流中设置您在第 1 步中创建的密钥。在工作流上设置密钥后 所有工作流作业参数和查询均使用任何作业类型的密钥进行加密 和参数中列出的参数, WorkflowTemplate.EncryptionConfig.kmsKey.
gcloud CLI
将密钥的资源 ID 传递给
--kms-key
标志,以指定 gcloud dataproc workflow-templates create 命令。示例:
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) (EKM) 让您可以使用由 受支持的外部密钥管理合作伙伴。 您在 Dataproc 中使用 EKM 所遵循的步骤与您用于设置 CMEK 密钥的步骤相同,但不同之处在于:您的密钥指向外部管理的密钥的 URI(请参阅Cloud EKM 概览)。
Cloud EKM 错误
使用 Cloud EKM 时,尝试创建集群的操作可能会失败 因为与输入、Cloud EKM、外部密钥相关的错误 管理合作伙伴系统,即 EKM 与外部系统之间的通信。 如果您使用 REST API 或 Google Cloud 控制台,系统会记录错误 (在日志记录中)。您可以检查失败集群的 查看日志标签页中查看日志信息。