Где хранить секретные ключи DJANGO

для жизни меня, я искал везде и не нашел ответа. Надеюсь, я не публикую дубликат.

везде рекомендуется хранить секретные ключи в отдельном файле от общего settings.py - ... И чтобы ты никогда не совершал своих ...secret.py " файл, содержащий такие ключи, как SECRET_KEY, AWS_SECRET_KEY и так далее.

мой вопрос: на вашем производственном сервере вам нужно ссылаться на ваши секретные ключи, которые означает, что ваш ...secret.py " файл настроек, должен жить где-то вокруг сервера, верно? Если да, то как вы защищаете свои секретные ключи в производстве?

4 ответов


есть довольно много вариантов для производства. Способ, которым я это делаю, - установить мои конфиденциальные переменные данных в качестве переменных среды в производственных средах. Затем я получаю переменные в settings.py via os.environ.get() вот так:

secret_KEY=os.environ.get('secret_KEY')

другой возможный вариант-скопировать в secret.py файл через сценарий развертывания.

Я уверен, что есть и другие конкретные варианты для различных веб-серверов.


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

например, вы можете иметь base_settings.py для хранения всех базовых настроек;dev_settings.py для настроек сервера разработки; и, наконец,prod_base_settings.py для всех параметров производства. Все файлы настроек, отличные от базовых, импортируют все базовые настройки, а затем изменяют только то, что необходимо:

# base_settings.py
...

# dev_settings.py
from base_settings import *
DEBUG = TRUE
...

# prod_base_settings.py
from base_settings import *
DEBUG = FALSE
...

этот подход позволяет иметь разные параметры разные настройки. Вы также можете сохранить все эти файлы, за исключением того, что на рабочем сервере вы можете создать файл фактические параметры производства prod_settings.py где вы укажете все конфиденциальные настройки. Этот файл не должен быть зафиксирован нигде и его содержимое хранится в безопасности:

# prod_settings.py
from prod_base_settings import *
SECRET_KEY = 'foo'

Что касается имен файлов, вы можете использовать любые имена файлов, которые вы считаете подходящими. Лично я фактически создаю пакет Python для настроек, а затем сохраняю различные настройки внутри пакет:

project/
  project/
    settings/
      __init__.py
      base.py
      dev.py
      ...
  app1/
    models.py
    ...
  app2/
    models.py
    ...

вместо логики if/then вы должны использовать инструмент, предназначенный для факторинга конфиденциальных данных. Я использую YamJam https://pypi.python.org/pypi/yamjam/ . Это позволяет использовать все преимущества ОС.environ метод, но проще - вы все равно должны установить эти переменные environ, вам нужно будет поместить их в сценарий где-то. YamJam хранит эти параметры конфигурации в хранилище конфигурации компьютера, а также позволяет переопределять проект по проекту.

from YamJam import yamjam

variable = yamjam()['myproject']['variable']

основной использование. И как ОС.метод environ, он не специфичен для фреймворка, вы можете использовать его с Django или любым другим приложением/фреймворком. Я перепробовал их все, несколько. settings.py файлы, хрупкая логика if / then и среда пререканий. В конце концов, я переключился на yamjam и не пожалели об этом.


Я знаю, что прошло много времени, но я только что открыл небольшое приложение Django, которое я использую для создания нового секретного ключа, если он еще не существует. Она называется django-generate-секретный ключ.

pip install django-generate-secret-key

затем, при подготовке / развертывании нового сервера под управлением моего проекта Django, я запускаю следующую команду (из Ansible):

python manage.py generate_secret_key

Это просто:

  • проверяет, если секретный ключ должен быть сгенерирован
  • генерирует его в а secretkey.txt файл (может быть настроен)

все, что вам нужно, это иметь в файле настроек:

with open('/path/to/the/secretkey.txt') as f:
    SECRET_KEY = f.read().strip()

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