В облачном ключе KMS отказано в доступе при использовании облачного хранилища - PullRequest
2 голосов
/ 27 мая 2019

Я использую 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:service-16536262744@gs-project-accounts.iam.gserviceaccount.com
  role: roles/cloudkms.cryptoKeyEncrypterDecrypter
etag: BwWJ2Pdc5YM=
version: 1

1 Ответ

3 голосов
/ 27 мая 2019

Когда вы используете kmsKeyName, облачное хранилище Google является объектом, вызывающим KMS, а не вашей учетной записью службы. Это немного сбивает с толку:

  1. У вашей учетной записи службы есть разрешение на вызов API Cloud Storage
  2. Затем учетная запись службы облачного хранилища вызывает API-интерфейс KMS в пути

Вам потребуется получить учетную запись службы Cloud Storage и предоставить этой учетной записи службы возможность вызывать Cloud KMS:

...