Linux Labs

Веб-стек / Ступень 7 из 9

Подключение, роль и pg_hba

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 2 из 7 · на машине · 7 мин

Три проверки на пути к базе

У приложения crm доступ к своей базе есть. На нём видно, как выглядит отказ на каждом этапе подключения.

Четыре попытки отличаются одним ключом psql. -h — адрес сервера, -p — порт (без него 5432), -d — база. -U — роль PostgreSQL, учётная запись внутри сервера. С пользователями Linux она не связана: ты работаешь как student, а входишь ролями crm и shop. Пароль psql ищет в ~/.pgpass, а переменная PGPASSWORD перекрывает файл.

Упражнение · посмотреть

Войди ролью crm четырьмя способами

Войди ролью crm: на порт 5433, в чужую базу shop, с неверным паролем и в свою базу crm.

Сначала предположи

Что ответит psql на порту 5433?

Теперь начни упражнение, выполни команду и сверь прогноз с выводом.

Войти и начать Машина доступна после входа

Подключение проходит три проверки по очереди, и у каждой свой отказ.

Первая — сеть. psql открывает TCP-соединение на адрес и порт. Если там никто не слушает, отвечает само ядро — Connection refused. Сервер попытку даже не видел. Что слушается, показывает ss -tln.

Вторая — правило. Соединение принято, и сервер ищет для него строку в файле правил pg_hba.conf. Строка называет, кому, в какую базу и откуда можно войти. Подходящей нет — no pg_hba.conf entry for host …, user …, database …: в отказе ровно то, что сервер сравнивал.

Третья — пароль. Строка нашлась, и её метод scram-sha-256 требует пароль. Неверный — password authentication failed for user ….

Заметка

Каждый отказ psql печатает дважды: сначала он пробует соединение с шифрованием (SSL encryption), потом без него (no encryption). Причина в обеих строках одна.

Проверь себя 1 вопрос

В журнале приложения: FATAL: password authentication failed for user "shop". Что из этого следует?

  • Без строки сервер ответил бы no pg_hba.conf entry и пароль не спрашивал бы. Пароль спрашивает метод найденной строки.

  • Тогда psql написал бы Connection refused. Строку FATAL пишет сервер — значит, соединение он принял.

  • Права на таблицы сервер проверяет после входа, а вход не состоялся: отказ пришёл на пароле.

Сообщение о пароле сервер пишет, только когда соединение принято и строка правила найдена. Значит, сеть и правило пройдены, а пароль в настройках приложения не совпал с паролем роли. Проверить можно так: psql -h 127.0.0.1 -U shop -d shop с паролем из ~/.pgpass.

Ubuntu 24.04
Загрузка…