Отказано в доступе к ключу 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-binding добавить roles/cloudkms.cryptoKeyEncrypterDecrypter в cloud-storage-admin.json сервисный аккаунт.

Когда я пытаюсь загрузить файл с ключом kms, все еще возникает эта ошибка разрешения:

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:[email protected]
  role: roles/cloudkms.cryptoKeyEncrypterDecrypter
etag: BwWJ2Pdc5YM=
version: 1
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
3
0
4 588
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

  • Вариант 1: Откройте проводник API, авторизация и выполнение
  • Вариант 2. Установите gcloud, авторизуйтесь в gcloud, установите oauth2l и запустите эту curl команду, заменив [PROJECT_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 или веб-интерфейса.

Извините, до сих пор не знаю, где не так. Я использую gcloud sdk и клиентскую библиотеку @google_cloud/storage nodejs. Обновите вопрос, как видите, я уже предоставил roles/cloudkms.cryptoKeyEncrypterDecrypter своей учетной записи облачного хранилища: cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com

slideshowp2 28.05.2019 13:02
cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com не является правильным сервисным аккаунтом. Похоже, это сервисный аккаунт в вашем проекте. Учетная запись службы Cloud Storage находится за пределами вашего проекта в gcs-project.accounts.iam.gserviceaccount.com. Вам необходимо предоставить разрешение KMS для этой учетной записи службы.
sethvargo 28.05.2019 21:03

Вы имеете в виду, что я должен предоставить cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com сервисному аккаунту cloud KMS admin разрешение в GCP — IAM?

slideshowp2 29.05.2019 04:31

Нет, вы должны предоставить service-[PROJECT_NUMBER]@gs-project-accounts.iam.gserviceacc‌​ount.com роль IAM roles/cloudkms.cryptoKeyEncrypterDecrypter. Вы можете получить номер вашего проекта от gcloud projects list.

sethvargo 29.05.2019 06:38

Разве это не означает, что любой, кто может войти в веб-интерфейс браузера Cloud Storage, имеет возможность шифровать/дешифровать с помощью этого ключа? Я надеялся заблокировать ключ для одной учетной записи службы (той, которую я создал).

Neil C. Obremski 19.06.2019 00:34

не могли бы вы взглянуть на это, пожалуйста stackoverflow.com/questions/69710603/…

eagercoder 25.10.2021 19:01

Можно ли зашифровать файл, используя предоставленную учетную запись службы вместо учетной записи службы облачного хранилища? Это немного сбивает с толку. Если я войду в облачное хранилище, я увижу все расшифрованные файлы (поскольку у учетной записи службы облачного хранилища есть разрешение на их расшифровку). Если я использую свою учетную запись службы, то любой человек, который войдет в облачное хранилище, увидит зашифрованные файлы (конечно, у этого человека не должно быть доступа к ключу KMS).

Я попытался зашифровать этот файл на стороне приложения (используя KMS), но есть ограничение по длине (65 КБ).

Другие вопросы по теме