2013-03-04 5 views
29

Для жизни меня я искал это везде и не нашел ответа. Надеюсь, я не отправляю дубликат.Где хранить секретные ключи DJANGO

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

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

ответ

18

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

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

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

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

+2

Для linux: http://unix.stackexchange.com/questions/21598/how-do-i-set-a-user-environment-variable-permanently-not-session. В моем примере выше вы добавляете 'export secret_KEY = 'ABABABABABDSFJKEWLSK'' в свои' .bash_profile', '.bash_login' или' .profile' - в зависимости от того, какие существуют. –

+0

Я переместил свой секретный ключ в .bash_profile и использовал os.environ.get, и он полностью сломал мой сайт, хотя 'echo $ SECRET_KEY' работал нормально. – swizzard

+2

Это плохо для безопасности: переменные среды процесса могут быть прочитаны другими пользователями. –

6

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

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

Благодарим вас за ответ. Тем не менее, я смотрел, как защитить эти ключи. – nitochi

+6

Имея все секретные настройки в отдельном файле, вы можете защитить его. Это только не защищает, если сервер взломается, когда файл скомпрометирован. Но в этом случае переменные среды только уязвимы, как и любой другой метод, о котором я знаю. Существуют способы обеспечения полной защиты такой информации, но все они связаны с третьей стороной, хранящей защищенные данные, а затем ваш сервер может запросить у них информацию, но чтобы обеспечить ее безопасность, по каждому запросу эти службы отправят вам уведомление, где у вас есть для проверки запроса, чтобы они не были полностью автоматизированы. – miki725

4

Вместо если/то логика, вы должны использовать инструмент, предназначенный для факторизации конфиденциальных данных. Я использую 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, я выполнить следующую команду (от анзибль):

python manage.py generate_secret_key 

Это просто:

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

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

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

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

+0

Хмм, с последним django (1.11) am getting: 'FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/ home /.../ project/secretkey.txt'' –

+0

@BabkenVardanyan вы запустили' python manage. py generate_secret_key'? Если он не создал файл или что-то не так, то, пожалуйста, откройте проблему здесь: https://github.com/MickaelBergem/django-generate-secret-key/issues/new, чтобы мы могли поговорить об этом –

Смежные вопросы