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

问题描述 投票:0回答:3

我正在使用

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'
});

我有一个具有

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')
});

并且,我使用

gcloud kms keys add-iam-policy-binding
roles/cloudkms.cryptoKeyEncrypterDecrypter
添加到
cloud-storage-admin.json
服务帐户。

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

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

更新

☁  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:[email protected]
  role: roles/cloudkms.cryptoKeyEncrypterDecrypter
etag: BwWJ2Pdc5YM=
version: 1
google-cloud-platform google-cloud-storage google-cloud-kms
3个回答
8
投票

当您使用

kmsKeyName
时,Google Cloud Storage 是调用 KMS 的实体,而不是您的服务帐户。有点混乱:

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

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

  • 选项 1:打开 API 资源管理器,授权并执行
  • 选项 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

0
投票

是否可以使用提供的服务帐户而不是云存储服务帐户来加密文件?这有点令人困惑。如果我登录到云存储,那么我可以看到所有解密的文件(因为云存储服务帐户有权解密它)。如果我使用我的服务帐户,那么任何登录云存储的人都会看到加密的文件(当然这个人不应该访问 KMS 密钥)。

我尝试在应用程序端加密此文件(使用 KMS),但有长度限制(65KB)。


0
投票

您是否已在成员部分将服务帐户(应类似于“[email protected]”)添加到 iam 绑定中?

对于用例,我的 terraform 代码如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.