Подтвердить что ты не робот

Храните секретные ключи

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

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

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

4b9b3361

Ответ 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" )