Python / Django - избегайте сохранения паролей в исходном коде

Я использую Python и Django для создания веб-приложений, которые мы храним в системе контроля версий. Обычно Django настраивается так, что пароли находятся в виде обычного текста в файле settings.py.

Хранение моего пароля в виде обычного текста может открыть для меня ряд проблем с безопасностью, особенно потому, что это проект с открытым исходным кодом, и мой исходный код будет контролироваться версиями (через git, на Github, чтобы весь мир мог видеть!)

Вопрос в том, как лучше всего безопасно записать файл settings.py в среде разработки Django / Python?


person Ashwin Balamohan    schedule 10.03.2013    source источник


Ответы (4)


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

Решение: переменные среды.

Примечание. Хотя переменные среды одинаковы как в Linux / Unix / OS X, так и в Windows, я не тестировал этот код на машине с Windows. Пожалуйста, дайте мне знать, если это сработает.

В оболочке bash / sh введите:

export MYAPP_DB_USER='myapp'
export MYAPP_DB_PASSWORD='testing123'

И в вашем файле Django settings.py:

DATABASE_USER = os.environ.get("MYAPP_DB_USER", '')
DATABASE_PASSWORD = os.environ.get("MYAPP_DB_PASSWORD", '')

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

person Ashwin Balamohan    schedule 10.03.2013
comment
... и файл с паролями, которые вы установили на .gitignore - person Brandon Bertelsen; 11.03.2013
comment
Книга «Две совки Django» предоставляет некоторый код для создания исключения в случае, если переменные среды не существуют в главе 5: django .2scoops.org - person ; 11.03.2013
comment
В частности, см. Код Two Scoops на их github - person Michael C. O'Connor; 11.03.2013
comment
В этом случае пароли вообще не хранились бы на уровне файлов. - person Ashwin Balamohan; 11.03.2013
comment
@ MichaelC.O'Connor, черт возьми, я искал этого хе - person ; 11.03.2013
comment
Обратной стороной этого подхода является то, что сообщения электронной почты с отчетами об ошибках приводят к утечке переменных среды. - person user; 18.05.2015
comment
Еще одним недостатком является то, что установка переменных среды непосредственно в оболочке попадает в ~ /.* sh_history. - person Simon Shine; 08.12.2016
comment
что, если этот проект нужно разместить на облачном сервере? как мне экспортировать туда переменную окружения? - person QuestionEverything; 04.09.2017

Хотя переменные среды удобны для многих настроек, помещать пароли в переменные среды нельзя secure. Альтернативой является файл конфигурации вне обычного контроля версий, вот несколько минусов:

  • Переменные среды могут случайно просочиться (через каналы отладки, которые могут быть переданы через открытый текст конечным пользователям или в неожиданные места в файловой системе, такие как ~ /.* sh_history).

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

Прочтите сообщение в блоге Переменные среды, которые считаются вредными для ваших секретов, чтобы получить дополнительные аргументы: Среда доступна для всего процесса, наследуется дочерним (и, возможно, сторонним) процессам, и среди внешних разработчиков нет четкого предположения, что переменные среды следует рассматривать как конфиденциальные.

Самый простой формат файла конфигурации в Python - это просто модуль Python.

person Simon Shine    schedule 08.12.2016

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

Я использовал getpass (), чтобы файл настроек запрашивал пароль при запуске при запуске.

from getpass import getpass

#[...]

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #or whatever DB you use
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': getpass(),
        'HOST': '',
        'PORT': '',
    }
}
person Figroth Felanor    schedule 07.01.2020

Имея что-то вроде этого в вашем settings.py:

db_user = 'my_db_user' db_password = 'my_db_password'

Жестко кодирует ценную информацию в вашем коде и представляет угрозу безопасности. Альтернативой является хранение вашей ценной информации (ключей Api, паролей базы данных и т. Д.) На вашем локальном компьютере в качестве переменных среды. Например. в Linux вы можете добавить:

export DB_USER = "my_db_user" export DB_PASS = "my_db_password"

в ваш .bash_profile. Или, как правило, у вашего хостинг-провайдера есть возможность установить переменные среды, например. с помощью AWS elastic beanstalk вы можете добавить переменные env в свою конфигурацию на консоли.

Затем, чтобы получить вашу информацию import os:

import os db_user = os.environ.get['DB_USER'] db_password = os.environ.get['DB_PASS']

person Josh    schedule 21.01.2020
comment
вы уверены, что пока export DB_USER = my_db_user должен my_db_user в str - person Shiv; 08.04.2021