Является ли использование переменных ENV хорошей идеей?

Фон

Наше приложение использует базу данных MySQL и еще пару сервисов.

Чтобы подключить наше приложение к этим серверам, у нас есть имена пользователей и пароли, сохраненные в prod.config файл. Если мы находимся в dev, мы используем dev.config файл и так далее...

Недавно я изучал передовой опыт в отрасли (например, https://12factor.net/), и большинство из них (если не все) указывают, что такая информация, как имена пользователей и pwd для подключения к БД и другим службам, не должна быть в файлах conifg, а скорее в переменных ENV.

Если вы не знаете, что такое 12-факторная спецификация, вы можете проверить этот бесплатный учебник:

проблема

Теперь, сначала это выглядит хорошо. Многие инструменты CI, такие как Travis или CircleCI, уже заставляют вас делать это. Проблема здесь в том, что ваше самое маленькое приложение использует несколько сервисов.

В нашем случае для самого маленького приложения нам понадобится 13 переменных ENV. Переменные, которых нет в каком-либо конкретном файле, все они должны быть в ENV машины, на которой они работают.

Я не понимаю, как это можно рассматривать как хорошую практику. Я понимаю основную идею не выдвигать файлы confg со всеми этими конфиденциальными данными, но этот подход ставит несколько вопросов:

  1. Когда машина перезагружается, вы теряете все переменные ENV.
  2. Если вы хотите избежать предыдущей проблемы, вам нужно запустить сценарий при запуске компьютера, который устанавливает эти переменные, что означает, что вы должны хранить их в файле, что наносит ущерб всей цели.
  3. Где вы сохраняете эти переменные? Они должны быть где-то еще, кроме вашей хрупкой головы!

Вопросы

  • Как бы я решил предыдущие проблемы?
  • Почему сохранение частной информации в переменных ENV считается хорошей идеей?

1 ответ

Решение

Я собираюсь сделать шаг назад и задать вам вопрос: почему вы пытаетесь подключиться к производственной базе данных из среды тестирования?

Прелесть инструментов CI в том, что они позволяют вам раскручивать контейнеры Docker, чтобы они служили сервисами тестирования. В вашем рабочем коде рекомендуется хранить ваши пароли в переменных среды по двум основным причинам: 1.) Если кто-то когда-нибудь получит ваш код, он получит доступ к вашей базе данных. Требуется дополнительный уровень безопасности, который просто нереален. 2.) Если кто-то заполучил ваши пароли, вы хотите быстро их изменить. Это легче сделать, если ваш код ссылается на переменные среды вместо жестко закодированных строк.

При переходе к системе CI, точка #2 становится спорным, но пункт #1 становится чрезвычайно важным. С Travis и CircleCI ваш конфигурационный файл общедоступен. Если вы введете свой рабочий пароль в свой конфигурационный файл, я (или кто-то еще более злонамеренный) мог бы просто просканировать ваш файл и перейти в вашу базу данных. Я слышал истории о том, как хакеры взломали публичные репозитории для паролей в конфигурационных файлах. Это даже проще с таким инструментом, как CircleCI.

Переменные среды, которые вы устанавливаете в Travis и CircleCI, должны храниться на уровне хранилища - вам не нужно перемещать переменные или сохранять их.

Переменные среды в производственной системе должны быть настроены как часть сценария запуска. Это сильно зависит от того, какой сервис вы используете, поэтому я не буду вдаваться в подробности.

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