使用云存储时对 Cloud KMS 密钥的权限被拒绝

sli*_*wp2 3 google-cloud-storage google-cloud-platform google-cloud-kms

我正在使用cloud storage带有 kms 密钥的上传文件。这是我的代码:

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'
});
Run Code Online (Sandbox Code Playgroud)

我有一个cloud-storage-admin.json获得cloud storage admin许可的服务帐户。storage使用此服务帐户初始化。

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

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

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

Cloud KMS 密钥的权限被拒绝。请确保您的 Cloud Storage 服务帐户已被授权使用此密钥。

更新

?  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
Run Code Online (Sandbox Code Playgroud)

set*_*rgo 6

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

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

您需要获取 Cloud Storage 服务帐户并授予该服务帐户调用 Cloud KMS 的能力:

  • 方案一:打开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"
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项 3:相信我,它采用格式service-[PROJECT_NUMBER]@gs-project-accounts.iam.gserviceaccount.com[PROJECT_NUMBER]gcloud projects listWeb 界面获取。

  • 不可以,您应该向“service-[PROJECT_NUMBER]@gs-project-accounts.iam.gserviceaccount.com”授予 IAM 角色“roles/cloudkms.cryptoKeyEncrypterDecrypter”。您可以从“gcloud 项目列表”获取您的项目编号。 (2认同)