Храните секретные ключи
Одна из причин анти-шаблона local_settings.py заключается в том, что установка SECRET_KEY, AWS
ключи и т.д. значения в файлах настроек имеют проблемы:
- Секреты часто должны быть такими: секрет! Удержание их в средствах контроля версий
что все с доступом к репозиторию имеют к ним доступ.
Мой вопрос заключается в том, как хранить все ключи в тайне?
Ответы
Ответ 1
Храните ваши данные local_settings.py
в файле, зашифрованном с помощью GPG, предпочтительно, как строго key=value
линии, которые вы анализируете и назначаете dict (другой привлекательный подход должен состоять в том, чтобы он был исполняемым python, но исполняемый код в конфигурации файлы заставляют меня дрожать).
Там есть модуль python gpg, так что это не проблема. Получите ключи от брелка и используйте инструменты управления ключами GPG, чтобы вам не приходилось вводить пароль в цепочку ключей. Убедитесь, что вы читаете данные прямо из зашифрованного файла, а не просто создаете дешифрованный временный файл, который вы читаете. Это рецепт сбоя.
Это просто контур, вам придется его самостоятельно создать.
Таким образом, секретные данные остаются только в пространстве памяти процесса, а не в файле или в переменных среды.
Ответ 2
Я делаю проекты Django с использованием Windows 7 и Powershell, поэтому для меня это было немного иначе, чтобы установить переменную среды. Как только он был установлен, я просто сделал следующее в файле settings.py
:
import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]
Чтобы установить переменную среды в Windows с помощью PowerShell, следуйте инструкциям в приведенной ниже ссылке:
http://technet.microsoft.com/en-us/library/ff730964.aspx
Ответ 3
В идеале, local_settings.py
не следует проверять на сервере производства/развертывания. Вы можете сохранить резервную копию в другом месте, но не в исходном элементе управления.
local_settings.py
можно проверить с помощью конфигурации разработки только для удобства, так что каждый разработчик должен ее изменить.
Решает ли ваша проблема?
Ответ 4
Первоначальный вопрос заключался в том, как хранить секреты в переменных среды. Это подробно обсуждается в книге Два совпадающих Django. Ниже приводится краткое изложение того, что они сказали, после чего следует оговорка об использовании этой техники.
Начиная со страницы 48 (раздел 5.3) издания для версии 1.11:
Каждая операционная система, поддерживаемая Django (и Python), обеспечивает легкая возможность создавать переменные среды.
Вот преимущества использования переменных среды для секретных ключей:
- Сохранение секретов из настроек позволяет хранить все файлы настроек в управлении версиями без колебаний. Весь ваш код Python действительно должны храниться в контроле версий, включая ваши настройки.
- Вместо того, чтобы каждый разработчик поддерживал свою собственную копию и вставную версию local_settings.py.example для разработки, все акции те же параметры, управляемые версиями /local.py.
- Системные администраторы могут быстро развернуть проект без необходимости изменять файлы, содержащие код Python.
- Большинство платформ как сервис рекомендуют использовать переменные среды для конфигурации и имеют встроенные функции для настройки и управляя ими.
На следующей странице книга продолжается:
Прежде чем приступать к настройке переменных окружения, вы должны иметь следующее:
- Способ управления секретной информацией, которую вы собираетесь хранить.
- Хорошее понимание того, как настройки bash работают на серверах или готовность вашего проекта размещаться на платформе как услуга.
Они описывают, как устанавливать переменные среды локально и в процессе производства (например, с Heroku - вам нужно будет проверить, используете ли вы другой хост, это только одна возможность):
Как установить переменные среды на локальном уровне
экспорт SOME_SECRET_KEY = 1c3-cr3am-15-yummy
Как установить переменные среды в производстве
heroku config: set SOME_SECRET_KEY = 1c3-cr3am-15-yummy
Наконец, на стр. 52 они дают инструкции по доступу к ключу. Например, вы можете поместить первые две строки ниже в свой файл настроек, чтобы заменить необработанную строку ключа по умолчанию:
>>> import os
>>> os.environ['SOME_SECRET_KEY']
'1c3-cr3am-15-yummy'
Этот фрагмент просто получает значение среды SOME_SECRET_KEY переменная из операционной системы и сохраняет ее в переменной Python SOME_SECRET_KEY.
Следуя этой схеме, весь код может оставаться в управлении версиями, и все секреты остаются в безопасности.
Обратите внимание, что это не будет работать в некоторых случаях, например, если вы используете сервер Apache. Чтобы справиться с ситуациями, когда этот шаблон не будет работать, вы должны увидеть раздел 5.4 своей книги ( "Когда вы не можете использовать переменные среды" ). В этом случае они рекомендуют использовать секретный файл.
По состоянию на конец 2017 года эта техника хранения секретов в переменных вашей среды является рекомендуемой передовой практикой в Two Scoops и в шаблоне дизайна приложения Twelve Factor. Он также рекомендуется в документах Django. Однако есть некоторые угрозы безопасности: если какой-либо разработчик или какой-либо код имеет доступ к вашей системе, они будут иметь доступ к вашим переменным среды и могут непреднамеренно (или рекламировать) сделать их общедоступными. Этот момент был сделан Майклом Рейншем здесь:
http://movingfast.io/articles/environment-variables-considered-harmful/
Ответ 5
Я написал функцию getcreds(), которая получает секретный ключ из файла. Я сохраняю файл в месте, доступном для www-data, поэтому, когда мне нужны учетные данные в settings.py, я просто делаю вызов getcreds(), передавая имя файла в качестве аргумента. Он возвращает список всех строк в файле и бинго, у меня есть скрытые секреты. Вот код...
from __future__ import unicode_literals, absolute_import
import os
def getcreds(fname, project, credsroot='/var/www/creds', credsdir=None):
""" return a list of userid and password and perhaps other data """
if credsdir is None:
credsdir = os.path.join(credsroot, project)
creds = list()
fname = os.path.join(credsdir, fname).replace("\\", "/")
with open(fname, 'r') as f:
for line in f:
# remove leading/trailing whitespace and append to list
creds.append(line.strip())
assert creds, "The list of credentials is empty"
return creds
Ответ 6
Вам может потребоваться использовать os.environ. получить ( "SOME_SECRET_KEY" )