Два файла в /etc/postgresql/16/main/: postgresql.conf — параметры сервера,
pg_hba.conf — кто и как может войти. Какие файлы и значения сервер прочитал
на самом деле — SHOW hba_file;, SHOW listen_addresses;.
pg_hba.conf
pg_hba.conf — правила доступа, по строке на правило. В Ubuntu
по умолчанию:
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
| Поле |
Что значит |
| TYPE |
local — через сокет, host — по TCP |
| DATABASE |
имя базы или all |
| USER |
роль или all |
| ADDRESS |
адрес клиента с маской; у local пусто |
| METHOD |
как проверять: peer, scram-sha-256, reject |
peer пускает пользователя Linux только в роль с тем же именем, поэтому
суперпользователь входит как sudo -u postgres psql. scram-sha-256 —
пароль. reject — отказ без проверки.
Строки читаются сверху вниз, действует первая подходящая, остальные не
смотрятся. Строка reject выше разрешающей закрывает доступ даже с верным
паролем. Новое правило для конкретной базы и роли ставь выше общих.
Правку применяет sudo systemctl reload postgresql или
SELECT pg_reload_conf();. Что сервер прочитал, показывает представление
pg_hba_file_rules: номер строки, поля и столбец error. С ошибкой в файле
сервер его не принимает и работает по старым правилам, а в журнале —
pg_hba.conf was not reloaded.
Адрес и порт
По умолчанию listen_addresses = 'localhost' — только 127.0.0.1 и ::1, порт
5432. Чтобы принимать подключения из сети, нужны три вещи: адрес в
listen_addresses ('*' — все), строка host для адреса клиента в
pg_hba.conf и открытый порт в файрволе. listen_addresses
меняется только через sudo systemctl restart postgresql: после reload
параметр помечен pending_restart, а сервер слушает по-старому.
Свою настройку удобно держать отдельным файлом: postgresql.conf читает
каталог conf.d рядом с собой (include_dir = 'conf.d'), и обновление
пакета такой файл не трогает:
echo "listen_addresses = '127.0.0.1'" \
| sudo tee /etc/postgresql/16/main/conf.d/listen.conf
sudo systemctl restart postgresql
sudo ss -tlnp | grep 5432
conf.d читается после строки include_dir в конце postgresql.conf, и
действует последнее значение. С listen_addresses = '*' в
postgresql.conf и '127.0.0.1' в conf.d/listen.conf сервер слушает
127.0.0.1. Откуда взято значение и ждёт ли оно перезапуска, показывает
pg_settings:
student@ubuntu:~$ sudo -u postgres psql -Atc "SELECT setting,
> sourcefile, sourceline, pending_restart FROM pg_settings
> WHERE name='listen_addresses'"
127.0.0.1|/etc/postgresql/16/main/conf.d/listen.conf|1|f
После правки файла и reload значение прежнее, pending_restart — t, а
в журнале /var/log/postgresql/postgresql-16-main.log:
LOG: parameter "listen_addresses" cannot be changed without restarting
the server
LOG: configuration file "/etc/postgresql/16/main/conf.d/listen.conf"
contains errors; unaffected changes were applied
Каждую строку каждого файла с её судьбой показывает pg_file_settings
(applied, error — например, setting could not be applied).