Безопасность и шифрование SSL/TLS в PostgreSQL: настройка pg_hba.conf
- Передача учетных данных и чувствительных данных в открытом виде через незащищенные каналы сети.
- Ошибки подключения:
FATAL: no pg_hba.conf entry for host ..., SSL off. - Ошибки верификации клиентских сертификатов:
SSL error: certificate verify failed.
1. Генерация и установка SSL сертификатов
# Установка прав на закрытый ключ (PostgreSQL требует строгие права 0600)
chown postgres:postgres /var/lib/postgresql/server.key /var/lib/postgresql/server.crt
chmod 600 /var/lib/postgresql/server.key2. Включение SSL в postgresql.conf
ssl = on
ssl_cert_file = '/var/lib/postgresql/server.crt'
ssl_key_file = '/var/lib/postgresql/server.key'
ssl_ca_file = '/var/lib/postgresql/root.crt'
# Разрешить только стойкие протоколы и шифры TLS 1.3 / TLS 1.2
ssl_min_protocol_version = 'TLSv1.2'
ssl_ciphers = 'HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!SRP:!PSK'3. Ограничение доступа через pg_hba.conf
Замените небезопасные директивы host на обязательные hostssl с современным хэшированием scram-sha-256:
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
# Требовать SSL и SCRAM для всех внешних подключений
hostssl all all 10.0.0.0/8 scram-sha-256
hostssl all all 192.168.0.0/16 scram-sha-256
# Требовать валидацию клиентского сертификата (mTLS)
hostssl secure_db app_user all cert clientcert=verify-full
# Запретить любые незашифрованные подключения
hostnossl all all 0.0.0.0/0 reject4. Применение и валидация подключения
SELECT pg_reload_conf();Проверка шифрования текущего сеанса:
SELECT ssl, version, cipher, client_dn FROM pg_stat_ssl WHERE pid = pg_backend_pid(); Частые вопросы (FAQ)
В чем разница между clientcert=verify-ca и clientcert=verify-full?
verify-ca проверяет только то, что клиентский сертификат подписан доверенным CA. verify-full дополнительно проверяет, что Common Name (CN) в сертификате строго совпадает с именем пользователя базы данных.
Почему после изменения pg_hba.conf новые правила не применяются?
Необходимо вызвать перезагрузку конфигурации через SELECT pg_reload_conf(); или systemctl reload postgresql. Существующие активные соединения при этом не разрываются.