Основные параметры конфигурации для защиты вашей базы данных 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.
Сводка основных шагов по обеспечению безопасности
- Обновите
pg_hba.conf: Используйтеscram-sha-256илиpeerдля методов аутентификации. - Обеспечьте шифрование: Установите
ssl = onвpostgresql.confи используйте записиhostsslвpg_hba.conf. - Ограничьте прослушивание: Настройте
listen_addressesтолько на необходимые интерфейсы, избегая значения по умолчанию*, если это возможно. - Обеспечьте минимальные привилегии: Ограничьте роли базы данных только теми разрешениями, которые абсолютно необходимы для их функций.
- Перезагрузите конфигурацию: Всегда перезагружайте или перезапускайте PostgreSQL после изменения файлов безопасности, чтобы применить изменения.