Я использую 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
Когда вы используете kmsKeyName
, Google Cloud Storage является объектом, вызывающим KMS, а не вашей служебной учетной записью. Это немного сбивает с толку:
Вам потребуется получить учетную запись службы облачного хранилища и предоставить этой учетной записи службы возможность вызывать Cloud KMS:
Вариант 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"
service-[PROJECT_NUMBER]@gs-project-accounts.iam.gserviceaccount.com
и получить [PROJECT_NUMBER]
от gcloud projects list
или веб-интерфейса.cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com
не является правильным сервисным аккаунтом. Похоже, это сервисный аккаунт в вашем проекте. Учетная запись службы Cloud Storage находится за пределами вашего проекта в gcs-project.accounts.iam.gserviceaccount.com
. Вам необходимо предоставить разрешение KMS для этой учетной записи службы.
Вы имеете в виду, что я должен предоставить cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com
сервисному аккаунту cloud KMS admin
разрешение в GCP — IAM?
Нет, вы должны предоставить service-[PROJECT_NUMBER]@gs-project-accounts.iam.gserviceaccount.com
роль IAM roles/cloudkms.cryptoKeyEncrypterDecrypter
. Вы можете получить номер вашего проекта от gcloud projects list
.
Разве это не означает, что любой, кто может войти в веб-интерфейс браузера Cloud Storage, имеет возможность шифровать/дешифровать с помощью этого ключа? Я надеялся заблокировать ключ для одной учетной записи службы (той, которую я создал).
не могли бы вы взглянуть на это, пожалуйста stackoverflow.com/questions/69710603/…
Можно ли зашифровать файл, используя предоставленную учетную запись службы вместо учетной записи службы облачного хранилища? Это немного сбивает с толку. Если я войду в облачное хранилище, я увижу все расшифрованные файлы (поскольку у учетной записи службы облачного хранилища есть разрешение на их расшифровку). Если я использую свою учетную запись службы, то любой человек, который войдет в облачное хранилище, увидит зашифрованные файлы (конечно, у этого человека не должно быть доступа к ключу KMS).
Я попытался зашифровать этот файл на стороне приложения (используя KMS), но есть ограничение по длине (65 КБ).
Извините, до сих пор не знаю, где не так. Я использую gcloud sdk и клиентскую библиотеку @google_cloud/storage nodejs. Обновите вопрос, как видите, я уже предоставил
roles/cloudkms.cryptoKeyEncrypterDecrypter
своей учетной записи облачного хранилища:cloud-storage-admin@<PROJECT_ID>.iam.gserviceaccount.com