Как читать переменные из файла, расшифрованного во время сборки, с помощью Google Cloud Build и Google Cloud KMS

Я следую этому учебник по получению зашифрованных ключей в файл YAML для облачной сборки. Я пытаюсь понять, как я должен «использовать переменные расшифрованного... файла в каталоге рабочей области» в последующих шагах моего файла YAML.

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

- name: gcr.io/cloud-builders/gcloud
  args: ['kms', 'decrypt', '--ciphertext-file=<encrypted_file>', '--plaintext-file=<decrypted_file>', '--location=<location>', '--keyring=<keyring>', '--key=<key>']

В учебнике не ясно, как это сделать, и я не могу найти ничего в Интернете, связанного с этим.

Любая помощь очень ценится.

Спасибо.


person Pedromlm    schedule 26.07.2019    source источник


Ответы (1)


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

# replace with your values
gcloud kms encrypt \
  --location=global \
  --keyring=my-kr \
  --key=my-key \
  --plaintext-file=./data-to-encrypt \
  --ciphertext-file=./encrypted-data

Где ./data-to-encrypt – это файл на диске, содержащий ваш секретный открытый текст, а ./encrypted-data – путь назначения на диске, куда должен быть записан зашифрованный зашифрованный текст.

При работе напрямую с API взаимодействие выглядит так:

plaintext -> kms(encrypt) -> ciphertext

Однако при работе с gcloud это выглядит так:

plaintext-file -> gcloud(read) -> kms(encrypt) -> ciphertext -> gcloud(write)

Когда вы вызываете Cloud Build, он фактически получает архив вашего приложения за вычетом всех файлов, указанных в файле .gcloudignore. Это означает, что ./encrypted-data будет доступен в файловой системе внутри шага контейнера:

steps:
# decrypt the value in ./my-secret
- name: gcr.io/cloud-builders/gcloud
  args:
  - kms
  - decrypt
  - --location=global
  - --keyring=my-kr
  - --key=my-key
  - --ciphertext=file=./encrypted-data
  - --plaintext-file=./my-secret

- name: gcr.io/my-project/my-image
  steps: 
  - my-app start --secret=./my-secret

В настоящее время единственный способ обмена данными между этапами в Cloud Build — это файлы, но все этапы сборки имеют одну и ту же общую файловую систему.

person sethvargo    schedule 26.07.2019
comment
Большое спасибо за ваш ответ. В качестве последнего шага после создания образа я выполняю развертывание в службе Cloud Run. Как я могу передать файл my-secret службе? Например, если предположить, что расшифрованный файл был json, как я могу передать этот json как, например, переменную среды с --set-env-vars? - person Pedromlm; 26.07.2019
comment
Вам нужно будет убедиться, что вы используете базовый образ с инструментами bash и unix и cat содержимое файла во флаг. Однако обратите внимание, что переменные среды не считаются частью модели угроз для Cloud Run. Любой пользователь с правами проекта/просмотрщика или более высокими правами может видеть переменные среды в веб-интерфейсе. Также очень легко утечь переменные среды открытого текста. См. sethvargo.com/secrets-in-serverless и проверьте github.com/GoogleCloudPlatform/berglas для более безопасных альтернатив. - person sethvargo; 26.07.2019
comment
И можно ли передать в качестве переменной среды путь к файлу (это вообще возможно?!), а затем загрузить файл в коде? В качестве альтернативы предложенным вами решениям. - person Pedromlm; 26.07.2019
comment
Вы можете передавать переменные среды, но они не сохраняются между шагами. Единственное, что разделяется между этапами, — это файловая система. - person sethvargo; 26.07.2019
comment
Сетварго, еще раз спасибо за вашу поддержку. Я следил за сообщением, которое вы связали с вашим предыдущим комментарием, и теперь все работает, как ожидалось. Я отмечу ваш ответ как принятый. Спасибо еще раз! - person Pedromlm; 27.07.2019
comment
Один из моих коллег только что опубликовал это сегодня, которое иллюстрирует, как обмениваться (большими) объемами данных между шагами GCB: medium.com/google-cloud/ - person sethvargo; 29.07.2019