Является ли использование переменных ENV хорошей идеей?
Фон
Наше приложение использует базу данных MySQL и еще пару сервисов.
Чтобы подключить наше приложение к этим серверам, у нас есть имена пользователей и пароли, сохраненные в prod.config
файл. Если мы находимся в dev, мы используем dev.config
файл и так далее...
Недавно я изучал передовой опыт в отрасли (например, https://12factor.net/), и большинство из них (если не все) указывают, что такая информация, как имена пользователей и pwd для подключения к БД и другим службам, не должна быть в файлах conifg, а скорее в переменных ENV.
Если вы не знаете, что такое 12-факторная спецификация, вы можете проверить этот бесплатный учебник:
проблема
Теперь, сначала это выглядит хорошо. Многие инструменты CI, такие как Travis или CircleCI, уже заставляют вас делать это. Проблема здесь в том, что ваше самое маленькое приложение использует несколько сервисов.
В нашем случае для самого маленького приложения нам понадобится 13 переменных ENV. Переменные, которых нет в каком-либо конкретном файле, все они должны быть в ENV машины, на которой они работают.
Я не понимаю, как это можно рассматривать как хорошую практику. Я понимаю основную идею не выдвигать файлы confg со всеми этими конфиденциальными данными, но этот подход ставит несколько вопросов:
- Когда машина перезагружается, вы теряете все переменные ENV.
- Если вы хотите избежать предыдущей проблемы, вам нужно запустить сценарий при запуске компьютера, который устанавливает эти переменные, что означает, что вы должны хранить их в файле, что наносит ущерб всей цели.
- Где вы сохраняете эти переменные? Они должны быть где-то еще, кроме вашей хрупкой головы!
Вопросы
- Как бы я решил предыдущие проблемы?
- Почему сохранение частной информации в переменных ENV считается хорошей идеей?
1 ответ
Я собираюсь сделать шаг назад и задать вам вопрос: почему вы пытаетесь подключиться к производственной базе данных из среды тестирования?
Прелесть инструментов CI в том, что они позволяют вам раскручивать контейнеры Docker, чтобы они служили сервисами тестирования. В вашем рабочем коде рекомендуется хранить ваши пароли в переменных среды по двум основным причинам: 1.) Если кто-то когда-нибудь получит ваш код, он получит доступ к вашей базе данных. Требуется дополнительный уровень безопасности, который просто нереален. 2.) Если кто-то заполучил ваши пароли, вы хотите быстро их изменить. Это легче сделать, если ваш код ссылается на переменные среды вместо жестко закодированных строк.
При переходе к системе CI, точка #2 становится спорным, но пункт #1 становится чрезвычайно важным. С Travis и CircleCI ваш конфигурационный файл общедоступен. Если вы введете свой рабочий пароль в свой конфигурационный файл, я (или кто-то еще более злонамеренный) мог бы просто просканировать ваш файл и перейти в вашу базу данных. Я слышал истории о том, как хакеры взломали публичные репозитории для паролей в конфигурационных файлах. Это даже проще с таким инструментом, как CircleCI.
Переменные среды, которые вы устанавливаете в Travis и CircleCI, должны храниться на уровне хранилища - вам не нужно перемещать переменные или сохранять их.
Переменные среды в производственной системе должны быть настроены как часть сценария запуска. Это сильно зависит от того, какой сервис вы используете, поэтому я не буду вдаваться в подробности.