Как обращаться с секретами в Google App Engine? - PullRequest
0 голосов
/ 14 октября 2019

Мое приложение нуждается в куче секретов для запуска: учетные данные базы данных, учетные данные API и т. Д. Оно работает в Google App Engine Standard Java 11. Мне нужны эти секреты в качестве переменных среды или в качестве аргументов моего приложения , так что мой фреймворк может подобрать их и соответственно установить соединения. Моя конкретная среда - Spring Boot, но я считаю, что Django, Rails и многие другие используют те же методы.

Какой лучший способ сделать это?

Один из ответов, которые я получаю на этот вопрос использовать Google Cloud Key Management , что выглядит многообещающе, но я не могу понять, как превратить эти значения в переменные среды в App Engine. Является ли это возможным? Я прочитал Настройка аутентификации для серверных производственных приложений , но я не вижу там никаких указаний о том, как превратить секреты в переменные среды в App Engine (я их пропускаю?).

Другие альтернативы, которые я видел, включают жесткое кодирование их в app.yaml или другом файле, который никогда не сохраняется и хранится на моей машине, что означает, что я единственный, кто может развернуть ... Я могудаже развернуть с другой машины. Это проблематично для меня.

Другое потенциальное решение, которое я видел, - это делегировать проблему в Google Cloud Build, чтобы она выбирала значение / файл из CKM и передавала его в App Engine ( 1, 2 ). Я не использую GCB, и я сомневаюсь, что так и будет, потому что это так просто.

Мне бы очень хотелось, чтобы у App Engine была страница переменных среды, как у Heroku.

Ответы [ 4 ]

2 голосов
/ 17 октября 2019

На данный момент в App Engine Standard Standard нет предоставленного Google решения для хранения секретов приложения.

[ОБНОВЛЕНИЕ]

Я заметил ваш комментарий к другомуответьте, что вы требуете, чтобы переменные среды были действительны до того, как вы получите контроль приложенияВ этом случае у вас нет вариантов для App Engine сегодня. Я бы развернул службу в другом сервисе (Kubernetes), лучше подходящем для целей вашей системы, который может предоставлять управляемые секреты.

[END UPDATE]

У вас есть два варианта выбора секретовдля App Engine Standard:

  1. Сохраните секреты как переменные среды в app.yaml
  2. Сохраните секреты где-нибудь еще.

Для обоих вариантов выМожно добавить уровень безопасности, зашифровав их. Однако добавление шифрования добавляет еще один секрет (ключ дешифрования), который вы должны каким-то образом предоставить своему приложению. Ситуация с курицей или яйцом.

App Engine Standard использует служебную учетную запись. Эта учетная запись службы может использоваться в качестве удостоверения для управления доступом к другим ресурсам. Примерами других ресурсов являются KMS и Cloud Storage. Это означает, что вы можете получить безопасный доступ к KMS или облачному хранилищу без добавления другого секрета в App Engine.

Предположим, что ваша компания хочет, чтобы все секреты приложений были зашифрованы. Мы можем использовать учетную запись службы App Engine в качестве удостоверения, авторизованного для доступа к KMS для одного ключа.

Примечание. В следующих примерах используется синтаксис Windows. Замените продолжение строки ^ на \ для Linux / macOS.

Создайте KMS Keyring. Невозможно удалить цепочки ключей, поэтому это одноразовая операция.

set GCP_KMS_KEYRING=app-keyring
set GCP_KMS_KEYNAME=app-keyname

gcloud kms keyrings create %GCP_KMS_KEYRING% --location global

Создание ключа KMS.

gcloud kms keys create %GCP_KMS_KEYNAME% ^
--location global ^
--keyring %GCP_KMS_KEYRING% ^
--purpose encryption

Добавитьучетная запись службы для политики KMS для созданного нами набора ключей и ключа.

Это позволит App Engine дешифровать данные, не требуя секретов для KMS. Учетная запись службы обеспечивает контроль доступа. Для KMS роли не требуются. Вам потребуется предоставить KMS Keyring и Keyname, которые могут быть включены в app.yaml.

set GCP_SA=<replace with the app engine service acccount email adddress>
set GCP_KMS_ROLE=roles/cloudkms.cryptoKeyDecrypter

gcloud kms keys add-iam-policy-binding %GCP_KMS_KEYNAME% ^
--location global ^
--keyring %GCP_KMS_KEYRING% ^
--member serviceAccount:%GCP_SA% ^
--role %GCP_KMS_ROLE%

Для этого примера давайте предположим, что вам необходим доступ к базе данных MySQL. Мы будем хранить учетные данные в файле JSON и шифровать его. Файл называется config.json.

{
        "DB_HOST": "127.0.0.1",
        "DB_PORT": "3306",
        "DB_USER": "Roberts",
        "DB_PASS": "Keep-This-Secret"
}

Зашифруйте config.json с помощью Cloud KMS и сохраните зашифрованные результаты в config.enc:

call gcloud kms encrypt ^
--location=global ^
--keyring %GCP_KMS_KEYRING% ^
--key=%GCP_KMS_KEYNAME% ^
--plaintext-file=config.json ^
--ciphertext-file=config.enc

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

Последним этапом является написание кода на Java, который является частью вашей программы и использует KMS для расшифровкифайл config.enc с использованием KMS. У Google есть несколько примеров дешифрования KMS:

Расшифровка Java KMS

Образцы Java

1 голос
/ 15 октября 2019

Для секретного управления я лично фанат проекта Berglas . Он основан на KMS и, кроме того, управляет DEK и KEK

. Сегодня он написан на Go и не совместим с Java. Я написал библиотеку Python для некоторых коллег. Я могу написать пакет Java, если вы планируете его использовать. Это не очень сложно.

Дайте мне знать

0 голосов
/ 23 октября 2019

Berglas выглядит интересно.

Другой вариант - поместить секреты в файл (ы) app.yaml (их может быть больше одного) и зашифровать их перед передачей на контроль версий.

Существует множество инструментов для шифрования секретов перед их контролем версий, например https://github.com/StackExchange/blackbox

Плюсы:

  • Очень универсально
  • Я считаю,это просто понять по сравнению с другими вариантами
  • Легко начать

Минусы:

  • Вы не можете действительно удалить доступ для человека (так какфайл всегда может быть скопирован), поэтому иногда вы можете вращать секреты
  • Может быть трудно сохранить незашифрованные файлы вне хранилища. Когда вы привыкаете к этому и игнорируете файлы и / или сценарии, обычно это нормально.
0 голосов
/ 14 октября 2019

Варианты более или менее соответствуют тому, что вы упомянули. Управление облачным ключом Google - отличный способ справиться с учетными данными и секретной информацией в целом. Он имеет REST API с методами , который должен использоваться для достижения ваших целей с его помощью. Например, у вас есть метод «get» для получения cryptokeys, keyRings, cryptoKeysVersions и т. Д.

Например, здесь есть руководство о том, как настроить аутентификацию для вашего приложения. Здесь также есть хороший пример кода для этого на github .

Если вы считаете, что требуется дополнительная безопасность, вы также можете использовать секретную технику вращения .

Жесткое кодирование значений в app.yaml также является опцией, хотя и не рекомендуется в качестве лучшей практики. app.yaml не будет жить только на вашем компьютере. Он также будет развернут, и вы даже сможете увидеть его из движка приложения, панели «Версии» -> «Конфигурация» в консоли GCP. Таким образом, вам не нужно беспокоиться об этом.

...