我正在使用 云存储
上传一个带有 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.cryptoKeyEncrypterDecrypter
到 cloud-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 的实体,而不是您的服务帐户。这有点令人困惑:
- 您的服务帐号有权调用 Cloud Storage API
- 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/