Настройка доступа к PostgreSQL по сети в Linux Gentoo: pg_hba.conf и postgresql.conf
На заметку. Однажды я открывал доступ по сети к базе PostgreSQL, которая работала на терминале официантов под управлением Linux Gentoo. Всё настроил и забыл, а когда позже пришлось снова лезть в конфигурацию – пришлось вспоминать и заново искать, где лежит нужный файл и как выглядят правила.
PostgreSQL: настройка доступа по локальной сети
За разрешение или запрет клиентских подключений отвечает файл pg_hba.conf, а за прослушивание сетевых интерфейсов – параметр listen_addresses в postgresql.conf. Ниже разобрано, где найти эти файлы в Gentoo, как работает каждая колонка правил доступа и как перечитать конфигурацию без обрыва текущих соединений.
Где находится pg_hba.conf в Linux Gentoo
В классической установке Gentoo конфигурационный файл обычно лежит в каталоге данных PostgreSQL по пути /var/lib/postgresql/data/pg_hba.conf.
Если же на сервере используется слотированная установка (несколько версий PostgreSQL), конфигурация чаще выносится в каталог /etc/postgresql-<версия>/pg_hba.conf или /var/lib/postgresql/<версия>/data/pg_hba.conf. Чтобы не искать файл вручную по всему диску, точный путь проще всего спросить у самого сервера через psql:
SHOW hba_file; SHOW config_file;
Первая команда выведет актуальный путь к pg_hba.conf, вторая – к основному конфигу postgresql.conf.
Синтаксис правил в pg_hba.conf
Структура правил авторизации в pg_hba.conf
Каждая активная строка в pg_hba.conf описывает одно правило авторизации и состоит из пяти полей (для локальных Unix-сокетов поле адреса опускается):
# TYPE DATABASE USER ADDRESS METHOD
В старых выпусках PostgreSQL четвёртая колонка называлась CIDR-ADDRESS, в более новых – ADDRESS, но формат записи остался прежним.
- TYPE – тип подключения:
localдля Unix-сокета на самом сервере,hostдля TCP/IP (обычных и с шифрованием),hostsslтолько для SSL/TLS иhostnosslтолько для подключений без шифрования. - DATABASE – база данных, к которой применяется правило:
all(любая база), конкретное имя (например,pos_db) или список имён через запятую. - USER – роль (пользователь) PostgreSQL:
all, конкретное имя вродеwaiterили группа ролей с префиксом+. - ADDRESS / CIDR – IP-адрес или подсеть клиента для правил
host. Один IPv4-хост задаётся с маской/32(например,192.168.0.1/32), вся локальная подсеть – с маской/24(192.168.0.0/24). Для IPv6 используется формат вроде::1/128. - METHOD – способ аутентификации клиента при подключении.
Выбор метода: trust, md5 или scram-sha-256
От выбранного метода зависит, потребуется ли пароль и насколько безопасно будет соединение:
- trust – разрешает подключение без пароля любому клиенту, который попал под маску. В примере с терминалом официантов
trustдопустим только для localhost (127.0.0.1/32) или одного доверенного адреса в изолированной сети (192.168.0.1/32). Ставитьtrustна целую подсеть опасно: любой хост сможет войти под суперпользователемpostgresбез пароля. - md5 – классическая проверка пароля по схеме challenge-response с MD5-хешем. Подходит для совместимости со старыми версиями PostgreSQL и унаследованным софтом.
- scram-sha-256 – современный и стойкий метод парольной аутентификации (появился в PostgreSQL 10 и используется по умолчанию в новых версиях). Если и сервер, и клиент его поддерживают, стоит указывать именно его.
- reject – явный отказ в доступе; удобно ставить перед широким разрешающим правилом, чтобы закрыть конкретный адрес.
Пример рабочей конфигурации, где локальные подключения и один терминал ходят без пароля, а вся остальная подсеть 192.168.0.0/24 авторизуется по паролю к нужной базе:
# TYPE DATABASE USER ADDRESS METHOD local all all trust host all all 127.0.0.1/32 trust host all all 192.168.0.1/32 trust host pos_db waiter 192.168.0.0/24 scram-sha-256
Порядок строк важен: PostgreSQL просматривает pg_hba.conf сверху вниз и останавливается на первом совпавшем правиле. Если выше стоит общее правило для всей подсети (192.168.0.0/24) с reject или md5, то более узкое правило ниже для 192.168.0.1/32 уже не сработает. Если пароль по совпавшему правилу не подошёл, к следующим строкам сервер тоже не переходит.
Настройка listen_addresses в postgresql.conf
Даже при идеально прописанном pg_hba.conf удалённый клиент получит ошибку Connection refused, если сам PostgreSQL слушает только локальную петлю. По умолчанию в postgresql.conf задано значение listen_addresses = 'localhost'.
Чтобы принимать подключения по локальной сети, откройте postgresql.conf и укажите либо все доступные интерфейсы:
listen_addresses = '*'
либо перечислите только нужные адреса (например, localhost и локальный IP сервера, чтобы порт 5432 не светился наружу на внешнем интерфейсе):
listen_addresses = 'localhost, 192.168.0.10'
Также убедитесь, что локальный файрвол (iptables или nftables) пропускает входящие TCP-пакеты на порт 5432 из вашей подсети. Проверить, на каких адресах реально слушает PostgreSQL, можно командой:
ss -tlnp | grep 5432
Перезагрузка конфигурации без остановки базы
После правки одного только pg_hba.conf перезапускать сервер не нужно – достаточно перечитать конфигурацию на лету, чтобы не оборвать активные сессии терминалов.
В Gentoo с классическим init-скриптом это делается так:
/etc/init.d/postgresql reload
Если используете обёртку OpenRC или слотированный сервис (например, с указанием версии):
rc-service postgresql reload
Универсальный способ, который работает в любом дистрибутиве Linux прямо из консоли psql – вызвать SQL-функцию перезагрузки:
SELECT pg_reload_conf();
А вот если вы меняли параметр listen_addresses (или port) в postgresql.conf, одного reload недостаточно – здесь потребуется полный перезапуск сервиса:
rc-service postgresql restart
P.S. Записал всё в одном месте, потому что когда-то настроил один раз и забыл, а потом пришлось по крупицам вспоминать расположение файла и формат строк. Если после reload клиент всё равно не подключается, загляните в лог PostgreSQL – там сразу видно, какое именно правило из pg_hba.conf сработало или отклонило вход.