Безопасно ли хранить пароли в качестве переменных среды (а не как обычный текст) в файлах конфигурации?
Я работаю над несколькими приложениями в rails, django (и немного php), и одна из вещей, которые я начал делать в некоторых из них, - это хранение базы данных и других паролей в качестве переменных окружения, а не обычного текста в определенных config (или в settings.py, для приложений django).
Обсуждая это с одним из моих сотрудников, он предположил, что это плохая практика - возможно, это не так прекрасно, как может показаться на первый взгляд.
Итак, я хотел бы знать - это безопасная практика? Безопаснее ли хранить пароли в виде обычного текста в этих файлах (конечно, не оставлять эти файлы в публичных репозиториях или что-то еще)?
Ответы
Ответ 1
На более теоретическом уровне я склонен думать о уровнях безопасности следующим образом (в порядке возрастания силы):
- Нет безопасности. Простой текст. Любой, кто знает, где искать, может получить доступ к данным.
- Защита от обфускации. Вы произвольно храните данные (обычный текст), как переменную среды, или в файле, который должен выглядеть как файл конфигурации. Злоумышленник в конечном итоге выяснит, что происходит или наткнется на него.
- Безопасность обеспечивается путем шифрования, которое тривиально прерывать (думаю, цезарный шифр!).
- Безопасность обеспечивается путем шифрования, которое может быть прервано с некоторыми усилиями.
- Безопасность обеспечивается путем шифрования, которое нецелесообразно прерывать данное текущее оборудование.
- Самая безопасная система - это тот, который нельзя использовать!:)
Переменные среды более безопасны, чем файлы открытого текста, поскольку они являются неустойчивыми/одноразовыми, а не сохраненными; то есть, если вы установите только локальную переменную среды, например "set pwd = whatever", а затем запустите script, с чем-то, выходящим из командной оболочки в конце script, тогда эта переменная больше не существует.
Ваше дело попадает в первые два, что, я бы сказал, довольно неуверенно. Если бы вы собирались это сделать, я бы не рекомендовал развертывать за пределами вашей внутренней сети/внутренней сети, а затем только для целей тестирования.
Ответ 2
Как уже упоминалось ранее, оба метода не предоставляют ни одного уровня дополнительной "безопасности", как только ваша система будет скомпрометирована. Я считаю, что одной из самых сильных причин благоприятствовать переменным среды является контроль версий. Я видел слишком много конфигураций баз данных и т.д., случайно хранящихся в системе управления версиями, например GIT для каждого другого разработчика видеть (и вопль это случилось со мной...).
Не хранить ваши пароли в файлах делает невозможным их сохранение в системе управления версиями.
Ответ 3
В любое время, когда вы должны хранить пароль, он небезопасен. Период. Невозможно безопасно хранить незашифрованный пароль. Теперь какая из переменных окружения и файлов конфигурации более "безопасна", возможно, спорна. IMHO, если ваша система скомпрометирована, на самом деле не имеет значения, где она хранится, прилежный хакер может отслеживать ее.
Ответ 4
Извините, мне не хватало комментариев для комментариев, но я также хотел добавить, что если вы не будете осторожны, ваша оболочка может захватить этот пароль и в этой истории команд. Так что запуск чего-то вроде $ pwd=mypassword my_prog
вручную не столь эфемерен, как вы могли бы надеяться.