Основные параметры конфигурации для защиты вашей базы данных PostgreSQL

В этом руководстве подробно описаны основные параметры конфигурации для усиления безопасности PostgreSQL. Вы узнаете, как внедрять современную аутентификацию с использованием `pg_hba.conf` (SCRAM-SHA-256), реализовать обязательное шифрование SSL/TLS и минимизировать поверхность атаки, ограничивая сетевые прослушиватели. Это необходимо для стабильности и соответствия требованиям в рабочей среде.

31 просмотров

Основные параметры конфигурации для защиты вашей базы данных PostgreSQL

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

Эффективная безопасность PostgreSQL основывается на двух основных столпах: контроле над тем, кто может подключаться, и как он это делает. Мы рассмотрим жизненно важные настройки в postgresql.conf и важнейший файл аутентификации клиентов pg_hba.conf, а также обязательное внедрение шифрования с использованием SSL/TLS.

1. Усиление аутентификации клиентов с помощью pg_hba.conf

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

Понимание структуры pg_hba.conf

Каждая строка в pg_hba.conf соответствует определенному формату:

TYPE DATABASE USER ADDRESS METHOD [OPTIONS]

  • TYPE: Тип подключения (например, local, host, hostnossl, hostssl).
  • DATABASE: Целевое имя(имена) базы данных.
  • USER: Целевая роль(роли) базы данных.
  • ADDRESS: Диапазон IP-адресов клиента.
  • METHOD: Механизм аутентификации (например, scram-sha-256, md5, reject, trust).

Рекомендации по методам аутентификации

Никогда не используйте метод trust в рабочей среде, так как он позволяет любому, соответствующему критериям подключения, подключиться без пароля. Рекомендуемые современные методы аутентификации:

Рекомендуется: scram-sha-256

SCRAM (Salted Challenge Response Authentication Mechanism — механизм аутентификации «вызов-ответ» с солью) предлагает значительные улучшения по сравнению со старыми методами паролей, такими как md5, за счет использования более надежного хеширования и предотвращения атак повторного воспроизведения. Это должен быть ваш выбор по умолчанию для удаленных подключений.

# Включить SCRAM для всех удаленных подключений на порту 5432
host    all     all     0.0.0.0/0       scram-sha-256

Локальные подключения

Для подключений, исходящих от самого сервера (например, приложений, работающих на той же машине), используйте локальные сокеты. Наиболее безопасной настройкой часто является peer (для сокетов домена Unix) или scram-sha-256, если сокеты отключены или ограничены.

# Использовать аутентификацию peer для локальных подключений через сокет Unix
local   all     all             peer

Явное отклонение подключений

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

# Блокировать все подключения из известного небезопасного диапазона IP-адресов
host    all     all     192.168.1.0/24  reject

Практический совет: После изменения pg_hba.conf вы должны перезагрузить конфигурацию, чтобы изменения вступили в силу (например, pg_ctl reload или отправка сигнала SIGHUP процессу postmaster).

2. Внедрение шифрования SSL/TLS

Чтобы предотвратить перехват конфиденциальных данных (включая пароли) в сети, обязательно применение шифрования SSL/TLS для всех удаленных подключений.

Конфигурация в postgresql.conf

Убедитесь, что эти параметры правильно установлены в вашем основном файле конфигурации:

  • ssl = on: Включает поддержку SSL глобально.
  • ssl_cert_file: Путь к файлу сертификата сервера (например, server.crt).
  • ssl_key_file: Путь к файлу закрытого ключа сервера (например, server.key).

Принудительное использование SSL в pg_hba.conf

Чтобы заставить клиентов использовать SSL, измените тип подключения в pg_hba.conf с host на hostssl:

# Разрешать подключения только через SSL/TLS
hostssl all     all     0.0.0.0/0       scram-sha-256

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

3. Минимизация поверхности атаки

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

Ограничение адреса прослушивания сети

По умолчанию PostgreSQL может прослушивать все сетевые интерфейсы (listen_addresses = '*'). Для повышения безопасности явно настройте его на прослушивание только тех конкретных интерфейсов, которые требуют внешнего доступа, или localhost, если подключаются только локальные приложения.

В postgresql.conf:

# По возможности прослушивать только localhost (127.0.0.1)
listen_addresses = 'localhost'

# ИЛИ прослушивать только определенный интерфейс частной сети
# listen_addresses = '192.168.1.10'

Предупреждение о безопасности: Если listen_addresses установлено на *, будут использоваться все интерфейсы. Убедитесь, что pg_hba.conf строго контролирует, какие диапазоны IP-адресов могут подключаться.

Отключение ненужных расширений и функций

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

Безопасность паролей и ролей

Убедитесь, что все административные роли (например, пользователь postgres по умолчанию) имеют надежные, сложные пароли, установленные с помощью ALTER USER:

ALTER USER postgres WITH PASSWORD 'YourStrongAndComplexPassword123!';

Используйте принцип минимальных привилегий: пользователи приложений должны иметь только разрешения SELECT, INSERT, UPDATE и DELETE для конкретных таблиц, которые им необходимы, а не статус суперпользователя.

4. Конфигурация аудита и ведения журналов

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

Ключевые настройки для аудита безопасности:

  • log_statement = 'ddl' или 'all': Регистрирует все команды языка определения данных (DDL) (например, CREATE TABLE, ALTER USER). Временно установите значение 'all' во время проверок безопасности, но помните о влиянии на производительность.
  • log_connections = on: Регистрирует каждую успешную попытку подключения.
  • log_disconnections = on: Регистрирует отключение клиентов.
  • log_duration = on: Регистрирует время выполнения всех операторов, что иногда может выявить необычные схемы активности.

Сочетая строгие правила доступа в pg_hba.conf, принудительное шифрование через SSL, ограниченный адрес прослушивания и комплексное ведение журнала, вы создаете прочную основу для защиты вашего развертывания PostgreSQL.

Сводка основных шагов по обеспечению безопасности

  1. Обновите pg_hba.conf: Используйте scram-sha-256 или peer для методов аутентификации.
  2. Обеспечьте шифрование: Установите ssl = on в postgresql.conf и используйте записи hostssl в pg_hba.conf.
  3. Ограничьте прослушивание: Настройте listen_addresses только на необходимые интерфейсы, избегая значения по умолчанию *, если это возможно.
  4. Обеспечьте минимальные привилегии: Ограничьте роли базы данных только теми разрешениями, которые абсолютно необходимы для их функций.
  5. Перезагрузите конфигурацию: Всегда перезагружайте или перезапускайте PostgreSQL после изменения файлов безопасности, чтобы применить изменения.