На данный момент в App Engine Standard Standard нет предоставленного Google решения для хранения секретов приложения.
[ОБНОВЛЕНИЕ]
Я заметил ваш комментарий к другомуответьте, что вы требуете, чтобы переменные среды были действительны до того, как вы получите контроль приложенияВ этом случае у вас нет вариантов для App Engine сегодня. Я бы развернул службу в другом сервисе (Kubernetes), лучше подходящем для целей вашей системы, который может предоставлять управляемые секреты.
[END UPDATE]
У вас есть два варианта выбора секретовдля App Engine Standard:
- Сохраните секреты как переменные среды в app.yaml
- Сохраните секреты где-нибудь еще.
Для обоих вариантов выМожно добавить уровень безопасности, зашифровав их. Однако добавление шифрования добавляет еще один секрет (ключ дешифрования), который вы должны каким-то образом предоставить своему приложению. Ситуация с курицей или яйцом.
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