google-cloud-platform - 使用云存储时对 Cloud KMS key 的权限被拒绝

标签 google-cloud-platform google-cloud-storage google-cloud-kms

我正在使用 云存储 上传一个带有 kms key 的文件。这是我的代码:

await storage.bucket(config.bucket).upload(file, {
  kmsKeyName: `projects/${process.env.PROJECT_ID}/locations/global/keyRings/test/cryptoKeys/nodejs-gcp`,
  destination: 'mmczblsq.kms.encrypted.doc'
});

我有一个具有 cloud storage admin 权限的 cloud-storage-admin.json 服务帐户。使用此服务帐户初始化存储

const storage: Storage = new Storage({
  projectId: process.env.PROJECT_ID,
  keyFilename: path.resolve(__dirname, '../.gcp/cloud-storage-admin.json')
});

并且,我使用 gcloud kms keys add-iam-policy-binding 添加 roles/cloudkms.cryptoKeyEncrypterDecryptercloud-storage-admin.json 服务帐户。

当我尝试使用 kms key 上传文件时,仍然出现此权限错误:

Permission denied on Cloud KMS key. Please ensure that your Cloud Storage service account has been authorized to use this key.

更新

☁  nodejs-gcp [master] ⚡  gcloud kms keys get-iam-policy nodejs-gcp --keyring=test --location=global
bindings:
- members:
  - serviceAccount:cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com
  - serviceAccount:service-16536262744@gs-project-accounts.iam.gserviceaccount.com
  role: roles/cloudkms.cryptoKeyEncrypterDecrypter
etag: BwWJ2Pdc5YM=
version: 1

最佳答案

当您使用 kmsKeyName 时,Google Cloud Storage 是调用 KMS 的实体,而不是您的服务帐户。这有点令人困惑:

  1. 您的服务帐号有权调用 Cloud Storage API
  2. Cloud Storage 服务帐户然后调用传输中的 KMS API

您需要 get the Cloud Storage service account并授予该服务帐户调用 Cloud KMS 的能力:

  • 选项 1:Open the API explorer 、授权和执行
  • 选项 2:安装 gcloud ,向 gcloud 进行身份验证,安装 oauth2l ,然后运行此 curl 命令,将 [PROJECT_ID] 替换为您的项目 ID:

    curl -X GET -H "$(oauth2l header cloud-platform)" \
      "https://www.googleapis.com/storage/v1/projects/[PROJECT_ID]/serviceAccount"
    
  • 选项 3:相信我,它的格式为 service-[PROJECT_NUMBER]@gs-project-accounts.iam.gserviceaccount.com 并获取您的[PROJECT_NUMBER]来自 gcloud projects list或网络界面。

关于google-cloud-platform - 使用云存储时对 Cloud KMS key 的权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56320241/

相关文章:

node.js - 已部署的 Bookshelf 教程应用程序 (App Engine/NodeJS) 的 CloudSQL 连接问题

google-cloud-storage - 使用路由在 Google Cloud Storage 中托管静态站点单页应用程序

python - 如何将 Google Cloud Storage base64 md5sum 转换为十六进制版本?

google-cloud-kms - 我应该如何存储在 Google Cloud Platform 中使用的 secret ?

google-cloud-kms - 我应该多久轮换一次加密 key ?我可以使用 Cloud KMS 自动轮换 key 吗?

google-api - 可以将 Google Speech API 配置为仅返回数字/字母吗?

ios - Firebase 使用苹果登录。新用户和回头客

google-bigquery - gcp.bigquery 引用页面不再可用?

google-app-engine - 通过命令行(如 gsutil cp)将文件复制到本地谷歌存储

google-cloud-platform - Cloud Function 使用 KMS key 解密的权限被拒绝