【问题标题】:Google Cloud Platform - Dataflow doesn't decrypt data with KMS keyGoogle Cloud Platform - Dataflow 不使用 KMS 密钥解密数据
【发布时间】:2020-04-29 16:04:00
【问题描述】:

我有一个使用 Apache Beam 编写的 Dataflow 作业。它看起来类似于这个模板,但它将数据从 JDBC 保存到 Cloud Storage:

https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/JdbcToBigQuery.java

我的问题是,每个人都可以在 Dataflow UI 中看到数据库凭据。于是我找到了文章

https://medium.com/google-cloud/using-google-cloud-key-management-service-with-dataflow-templates-71924f0f841f

社区展示了如何加密这些数据。我做了本文中的所有操作,但我的 Dataflow 作业不想使用给定的 KMS 密钥解密凭据(当我使用 Cloud Function 运行它时)。

所以我尝试在 Cloud Shell 中运行它

gcloud dataflow jobs run JOB_NAME \
--region=us-west1 \
--gcs-location=TEMPLATE_LOCATION \
--dataflow-kms-key=projects/PROJECT_ID/locations/us-west1/keyRings/KEY_RING/cryptoKeys/KEY_NAME \
--parameters=...,KMSEncryptionKey=projects/PROJECT_ID/locations/us-west1/keyRings/KEY_RING/cryptoKeys/KEY_NAME,...

但我有一个错误

Error message from worker: java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Permission 'cloudkms.cryptoKeyVersions.useToDecrypt' denied on resource 'projects/PROJECT_ID/locations/us-west1/keyRings/KEY_RING/cryptoKeys/KEY_NAME' (or it may not exist).

我完全被困住了。有没有人遇到过同样的问题,可以帮忙吗?

【问题讨论】:

  • 您是否已授予对 KMS 密钥的数据流访问权限?
  • @sethvargo 是的,我授予了 service-SERVICE_ID@dataflow-service-producer-prod.iam.gserviceaccount.com 的权限

标签: google-cloud-platform google-cloud-dataflow google-cloud-kms


【解决方案1】:

您需要确保已将 Cloud KMS CryptoKey Encrypter/Decrypter 角色分配给 Dataflow 服务帐号以及 Compute Engine 服务帐号。

请参阅此文档,Cloud Key Management Service (Cloud KMS) encryption key with Dataflow

如果使用云功能,可能还需要为 Google Cloud Functions service agent service account 分配使用 KMS 加密和解密的权限。

确保调用加密和解密方法的用户拥有 clAssign 将 Cloud KMS CryptoKey Encrypter/Decrypter 角色分配给 数据流服务 account.oudkms.cryptoKeyVersions.useToEncrypt 和 cloudkms.cryptoKeyVersions.useToDecrypt 对用于密钥的权限 加密或解密。

允许用户加密或解密的一种方法是将用户添加到 角色/cloudkms.cryptoKeyEncrypter, 角色/cloudkms.cryptoKeyDecrypter,或 角色/cloudkms.cryptoKeyEncrypterDecrypter

还要确保传递的参数正确;

Python

python -m apache_beam.examples.wordcount \
  --input gs://dataflow-samples/shakespeare/kinglear.txt \
  --output gs://STORAGE_BUCKET/counts \
  --runner DataflowRunner \
  --project PROJECT_ID \
  --temp_location gs://STORAGE_BUCKET/tmp/ \
  --dataflow_kms_key=KMS_KEY

JAVA

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount \
  -Dexec.args="--inputFile=gs://dataflow-samples/shakespeare/kinglear.txt \
               --output=gs://STORAGE_BUCKET/counts \
               --runner=DataflowRunner --project=PROJECT_ID \
               --gcpTempLocation=gs://STORAGE_BUCKET/tmp \
               --dataflowKmsKey=KMS_KEY"
  -Pdataflow-runner

Specifying pipeline execution parameters

【讨论】:

  • 我之前授予了这个角色,但没有帮助
  • 阅读官方文档你在哪里找到这个参数... KMSEncryptionKey=projects/PROJECT_ID/locations/us-west1/keyRings/KEY_RING/cryptoKeys/KEY_NAME,...cloud.google.com/dataflow/docs/guides/specifying-exec-params
  • 您好,我将 gcpTempLocation=gs://BUCKET_NAME/tmp/ 添加到我的 --parameters 中,它起作用了 ;) 谢谢您的帮助
  • 欢迎您对答案进行投票,因为它很有用 :-)
  • 如何加密多个值?文档指出,用户名、密码和 connectionURL 应通过加密密钥传递,但我不确定如何将它们全部加密。
猜你喜欢
  • 2018-01-23
  • 2020-06-30
  • 2020-03-31
  • 2019-03-08
  • 2019-05-30
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多