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

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

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

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

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

4b9b3361

Ответ 1

См. Документацию по развертыванию Django для обсуждения этого вопроса.

Там довольно много вариантов для производства. Я делаю это, устанавливая мои переменные конфиденциальных данных в качестве переменных среды в производственных средах. Затем я получаю переменные в settings.py через os.environ например, так:

import os
SECRET_KEY = os.environ['SECRET_KEY']

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

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

Ответ 2

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

Например, вы можете иметь 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
    ...

Ответ 3

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

from YamJam import yamjam

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

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

Ответ 4

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

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()

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