Прочитаешь правила своего сервера и найдёшь строку, которая пускает crm.
Где лежит файл, знает сам сервер: sudo -u postgres psql -c 'SHOW hba_file' печатает /etc/postgresql/16/main/pg_hba.conf. Читать его может только postgres, поэтому — через sudo. Комментарии и пустые строки уберёт grep:
Каждая строка — пять полей:
| Поле | В строке crm | Что значит |
|---|---|---|
| тип | host |
TCP; local — unix-сокет на этой машине |
| база | crm |
куда входят; all — в любую |
| роль | crm |
кто входит; all — любая роль |
| адрес | 127.0.0.1/32 |
откуда; /32 — ровно один адрес |
| метод | scram-sha-256 |
как проверить: пароль |
Строки local с методом peer пускают без пароля. Это peer-проверка: сервер спрашивает у Linux имя пользователя и пускает в роль с тем же именем. Поэтому sudo -u postgres psql входит, а psql -d shop от student — нет: роли student на сервере нет.
Сервер читает строки сверху вниз и берёт первую, где совпали тип, база, роль и адрес. Её метод и решает: scram-sha-256 спросит пароль, reject откажет сразу — pg_hba.conf rejects connection. Строки ниже первой совпавшей сервер не смотрит.
В pg_hba.conf две строки, одна под другой. crm входит в базу crm с 127.0.0.1 с верным паролем. Что будет?
host all all 127.0.0.1/32 scram-sha-256
host crm crm 127.0.0.1/32 reject
-
Строка есть:
all allс адреса127.0.0.1/32совпадает с любой базой и ролью. -
Строки друг другу не мешают: сервер не ищет противоречий. Не принимает он файл, только если не может разобрать строку.
-
До
rejectсервер не дойдёт: первой совпала строкаhost all all … scram-sha-256, она и спросила пароль.
Сервер берёт первую строку, где совпали тип, база, роль и адрес. Здесь это host all all 127.0.0.1/32 scram-sha-256: пароль верный — crm входит, а reject ниже не читается. Чтобы запрет работал, его ставят выше разрешения.
Главное в шаге
-
Путь к файлу правил печатает
SHOW hba_file; читать и править его — через sudo. -
Строка правила — тип, база, роль, адрес и метод;
local— сокет,host— TCP. -
Решает первая совпавшая строка;
rejectв ней — отказ, даже если ниже есть разрешение.