Безопасность базы данных Postgres: что хранить в переменных окружения? - PullRequest
1 голос
/ 09 апреля 2019

Существует база данных Postgres, к которой я подключаюсь с помощью SQLAlchemy.

В настоящее время у меня есть параметры подключения к базе данных (имя базы данных, хост, порт, имя пользователя, пароль), все они жестко запрограммированы в файле Python. Я хочу изменить это.

Я прочитал здесь , что эти параметры следует хранить в переменных окружения. Что из пяти параметров подключения следует хранить в переменных окружения?

Очевидно, что я буду хранить пароль, но должен ли я дополнительно хранить имя пользователя и хост? Что здесь за соглашение?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

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

Рассмотрим вашу базу данных. Возможно ли, что хост, имя пользователя и имя базы данных могут быть разными в разных средах? Я подозреваю, что так. Многие проекты могут использовать базу данных в localhost или в образе Docker с именем db в docker-compose.yml в разработке и использовать выделенный сервер базы данных или размещенную базу данных в производстве.

Распространенным шаблоном является кодирование всей строки подключения к базе данных в одной переменной среды DATABASE_URL. Формат¹ что-то вроде

<engine>://<user>:<password>@<host>:<port>/<database>

Например, вы можете использовать что-то вроде

postgres://db_user:password@localhost/app_db

Многие библиотеки баз данных, , включая SQLAlchemy , могут напрямую подключаться к базам данных, используя эту единственную строку.


¹Это специализация на обычном синтаксисе URL .

2 голосов
/ 09 апреля 2019

Зачем что-то жестко кодировать? Просто переместите все эти параметры в переменные окружения.

1 голос
/ 09 апреля 2019

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

1) Имеют соль на основе случайных значений, специфичную для сервера, сгенерированного во время вызова программы шифрования.Это значение сохраняется в файл.Давайте назовем это salt.bin

2) Измените разрешение файла salt.bin таким образом, чтобы он был доступен для чтения только пользователю операционной системы, который будет запускать вашу программу.

3) Обеспечьте личную / доверенную безопасностьперсонально введите пароль для программы шифрования и сохраните зашифрованное значение в файл.Давайте назовем его db_config.bin.

4) Измените разрешение файла db_config.bin таким образом, чтобы он был доступен для чтения только пользователю операционной системы, который будет запускать вашу программу.

Сейчас во времявремя выполнения программы , пусть программа читает файл salt.bin и файл db_config.bin.Расшифруйте db_config.bin с помощью salt.bin.Программа использует этот пароль вместе со значениями конфигурационных файлов для хоста, порта и других деталей для подключения к базе данных.

Все вышеперечисленное можно выполнить с помощью python. См. Здесь .

...