Настройка pg_hba.conf в PostgreSQL: Аутентификация, SCRAM-SHA-256 и SSL
- Ошибка подключения
FATAL: no pg_hba.conf entry for host ... user ... database .... - Ошибка
FATAL: password authentication failed for user ...при правильном пароле. - Предупреждения аудита безопасности о передаче паролей через небезопасный алгоритм
md5.
1. Структура записей файла pg_hba.conf
Файл конфигурации оценивает правила сверху вниз до первого совпадения. Формат строки:
# TYPE DATABASE USER ADDRESS METHOD2. Рекомендуемая конфигурация безопасности (/etc/postgresql/16/main/pg_hba.conf)
# 1. Локальные подключения суперпользователя postgres через unix domain socket
local all postgres peer
# 2. Локальные подключения локальных пользователей ОС
local all all peer
# 3. Подключения пула приложений (1С / Web) из доверенной подсети с шифрованием пароля SCRAM
hostssl app_production app_user 192.168.10.0/24 scram-sha-256
# 4. Подключения репликации
hostssl replication replicator 192.168.10.50/32 scram-sha-256
# 5. Разрешить локальный мониторинг по IPv4/IPv6 loopback
host all exporter 127.0.0.1/32 scram-sha-256
host all exporter ::1/128 scram-sha-256
# 6. Явный запрет всех остальных подключений (Best Security Practice)
host all all 0.0.0.0/0 reject3. Перевод базы данных на SCRAM-SHA-256
Отредактируйте postgresql.conf:
password_encryption = scram-sha-256
ssl = onОбновите пароли пользователей в СУБД для генерации SCRAM-хэшей:
ALTER USER app_user WITH PASSWORD 'Strong_Secure_Passw0rd!';4. Применение настроек без перезагрузки
SELECT pg_reload_conf(); Частые вопросы (FAQ)
В чем разница между методами peer, md5 и scram-sha-256?
peer сверяет имя системного пользователя ОС ядра Linux с именем в PostgreSQL через Unix-сокет. md5 использует устаревшую уязвимую схему хэширования. scram-sha-256 реализует протокол SASL, исключающий перехват пароля и replay-атаки.
Почему после изменения pg_hba.conf подключения продолжают отклоняться?
PostgreSQL читает правила до первого совпадения. Если выше по файлу находится более общее правило (например, reject или md5), СУБД применит его. Проверьте порядок строк.
Что означает тип подключения hostssl?
hostssl требует от клиента обязательного использования TLS/SSL-соединения. Попытки незашифрованного TCP-подключения будут немедленно отклонены.
Как проверить, какой метод аутентификации использует активная сессия?
Запросите системное представление: SELECT usename, client_addr, backend_type, ssl FROM pg_stat_ssl JOIN pg_stat_activity USING (pid);