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

时间:2019-05-27 05:42:20

标签: google-cloud-platform google-cloud-storage 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'
});

我有一个拥有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-bindingroles/cloudkms.cryptoKeyEncrypterDecrypter添加到cloud-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

2 个答案:

答案 0 :(得分:2)

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

  1. 您的服务帐户有权调用Cloud Storage API
  2. 然后,Cloud Storage Service帐户在传输过程中调用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,并从gcloud projects list或网络界面获取[PROJECT_NUMBER]

答案 1 :(得分:0)

是否可以使用提供的服务帐户而不是云存储服务帐户来加密文件?这有点令人困惑。如果我登录到Cloud Storage,则可以看到所有文件都已解密(因为Cloud Storage Service帐户有权对其进行解密)。如果我使用我的服务帐户,那么任何登录到云存储的人都将看到加密的文件(当然,该人不能访问KMS密钥)。

我尝试在应用程序端(使用KMS)对该文件进行加密,但存在长度限制(65KB)。