2013-02-09 2 views
25

Одна из причин local_settings.py антишаблона является то, что ввод secret_key, AWS ключей и т.д .. значений в файлы настройки имеет проблему:Держите секретные ключи Out

  • Секретов часто должны быть только что : секрет! Сохранение их в контроле версий означает , что доступ к ним у всех с доступом к хранилищу.

Вопрос в том, как хранить все ключи в тайне?

+1

Принятый ответ был удален за плагиат, но я ставлю @ вклад нейросеть (в попытке исправить этот вопрос) в сообщество вики ниже. –

+0

Удаление «с переменными окружения» из названия изменяет вопрос, достаточный от исходного Q, который, вероятно, не должен был быть выполнен. – neuronet

ответ

3

В идеале, local_settings.py не должен быть проверен для производства/развертывания сервера. Вы можете сохранить резервную копию в другом месте, но не в исходном управлении.

local_settings.py может быть проверен с помощью конфигурации разработки только для удобства, так что каждый разработчик должен его изменить.

Это решение проблемы?

+2

Это лучшее решение, чем использование переменных окружения, и один из простых. Я не знаю, почему наши ответы проголосовали без объяснений. Просто добавьте local_settings.py в ваш .gitignore и проделанную работу. Можете ли вы сказать git, чтобы держать вещи в локальном репо, а не продвигаться вверх по течению? Это было бы лучше. OP не уточняет их систему VC ... – Spacedman

5

Храните данные local_settings.py в файле в зашифрованном виде с помощью GPG - предпочтительно в виде строго key=value линии, которые вы анализирующие и назначаемые в Словаре (другой привлекательный подход будет иметь его как исполняемый питона, но исполняемый код в файлах конфигурации делает меня дрожь).

Есть модуль gpg python, так что это не проблема. Получите ключи от брелка и используйте инструменты управления ключами GPG, чтобы вам не приходилось вводить пароль в цепочку ключей. Убедитесь, что вы читаете данные прямо из зашифрованного файла, а не просто создаете расшифрованный временный файл, который вы читаете. Это рецепт сбоя.

Это всего лишь контур, вам нужно будет построить его самостоятельно.

Таким образом, секретные данные остаются исключительно в пространстве памяти процесса, а не в файле или в переменных среды.

+2

Проголосовали почему? потому что его просто контур, и я не передал OP решение на тарелку? Безопасность жесткая. – Spacedman

+0

также в других языках зашифрованный ключ, файлы значений являются обычной практикой. Только зависимость от ключевого слова GPG и правильность их настройки - это то, что я постараюсь избежать. – sassman

4

Я занимаюсь проектами 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

-1

Вы возможно, потребуется использовать os.environ. get («SOME_SECRET_KEY»)

+0

Должно быть 'os.environ.get (" SOME_SECRET_KEY ")' –

1

Я написал функцию 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 
1

Оригинальный вопрос был о том, как хранить секреты в переменных среды. Об этом подробно говорится в книге Two Scoops of Django. Ниже приводится краткое изложение того, что они сказали, после чего следует оговорка об использовании этой техники.

Начиная со страницы 48 (Раздел 5.3) издания за 1.11:

Каждая операционная система, поддерживаемая Django (и Python), предоставляет возможность легко создавать переменные среды .

Вот преимущество использования переменной среды для секретных ключей:

  • Сохранения тайны из настроек позволяет сохранять файл каждые настроек в системе управления версиями без колебаний. Весь ваш код Python действительно должен храниться в контроле версий, включая ваши настройки.
  • Вместо того, чтобы каждый разработчик сохранял свою собственную копию и вставляемую версию local_settings.py.example для разработки, все используют те же параметры, что и для версии/local.py.
  • Системные администраторы могут быстро развернуть проект без необходимости изменять файлы, содержащие код Python.
  • Большинство платформ как сервис рекомендуют использовать переменные среды для конфигурации и имеют встроенные функции для настройки и , управляющие ими.

На следующей странице, книга продолжает:

Перед тем, как приступить к настройке переменных окружения, вы должны иметь следующее:

  • способ управления секретной информации вы собираетесь хранить.
  • Хорошее понимание того, как настройки bash работают на серверах или готовность вашего проекта размещаться на платформе как услуга.

Они описывают, как установить переменные среды локально, так и в производстве (с Heroku как пример - вам нужно будет проверить, если вы используете другой хост это только одна возможность):

Как установить переменные среды локально
экспорт SOME_SECRET_KEY = 1С3-cr3am-15-вкуснятина

Как установить переменные окружения я н Производство
Heroku конфигурации: установка SOME_SECRET_KEY = 1С3-cr3am-15-вкуснятина

Наконец, на странице 52, они дают указания о том, как получить доступ к ключу. Например, вы могли бы поставить первые две строчки ниже в файле настроек, чтобы заменить необработанный ключевую строку, которая ставится там по умолчанию:

>>> import os 
>>> os.environ['SOME_SECRET_KEY'] 
'1c3-cr3am-15-yummy' 

Этот фрагмент кода просто получает значение среды SOME_SECRET_KEY переменной от операционной системы и сохраняет его в переменной Python под названием SOME_SECRET_KEY.

Следуя этой схеме, весь код может оставаться в управлении версиями, и все секреты остаются в безопасности.

Примечание: в некоторых случаях это не сработает, например, если вы используете сервер Apache. Чтобы справиться с ситуациями, когда этот шаблон не будет работать, вы должны увидеть раздел 5.4 своей книги («Когда вы не можете использовать переменные среды»). В этом случае они рекомендуют использовать секретный файл.

По состоянию на конец 2017 года эта техника хранения секретов в переменных среды является рекомендуемой передовой практикой в ​​двух совках и в шаблоне дизайна приложения Twelve Factor. Он также рекомендуется в документах Django. Однако есть некоторые угрозы безопасности: если какой-либо разработчик или какой-либо код имеет доступ к вашей системе, они будут иметь доступ к вашим переменным среды и могут непреднамеренно (или рекламировать) сделать их общедоступными. Этот пункт был сделан Майклом Рейнш здесь:
http://movingfast.io/articles/environment-variables-considered-harmful/

+0

На вопрос безопасности: если кто-то имеет доступ к моей системе, то у меня проблемы, независимо от того, что я делаю. Использование среды vars, кажется, в моде, рекомендуется в качестве жизнеспособного варианта в документах Django, рекомендуется в книге Two Scoops. Он просто чувствует себя более питоническим. Например, по сравнению с хранением секретного файла, который хранится вне контроля версий (поэтому каждый имеет другой локальный файл: простой лучше, чем сложный). Обсуждение нескольких лет назад на эту тему: https://stackoverflow.com/questions/12461484/is-it-secure-to-store-passwords-as-environment-variables-rather-than-as-plain-t – neuronet

+0

@neuronet, не могли бы вы принять этот ответ тогда и сделать его связным, а не разрозненным? Спасибо, что заметили плагиат. Если вы видите, что это еще больше, дайте мне знать. –

+0

Я могу сделать снимок в ближайшие пару дней. Я далек от эксперта по этому вопросу, я только что читал книгу «Два ловушки» и в последнее время занимался переменными окружения в django, и случайно наткнулся на эту вырезку/пасту из книги. – neuronet