<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[PostgreSQL: peer authentication failed for user postgres — как исправить ошибку]]></title><description><![CDATA[<p dir="auto">Ошибка <strong>peer authentication failed for user postgres</strong> в PostgreSQL возникает часто при первом подключении к базе. Это значит, что сервер не пускает пользователя из-за настроек аутентификации. В этой статье разберём, почему так происходит и как быстро решить проблему пошагово.</p>
<p dir="auto">Знание этих шагов сэкономит часы на отладку. Подходит для новичков и опытных админов. Мы пройдём от диагностики до безопасной настройки без риска для данных.</p>
<h2>Что такое peer authentication и почему она ломается</h2>
<p dir="auto"><strong>Peer authentication</strong> — это метод проверки в PostgreSQL, где доступ даётся только если имя ОС-пользователя совпадает с именем БД-пользователя. По умолчанию для локальных подключений стоит именно peer, что удобно для системных задач, но мешает при подключении под root или другим юзером. Представьте: вы запускаете <code>psql -U postgres</code>, а сервер отвечает отказом, потому что ваш текущий юзер — не postgres.</p>
<p dir="auto">Проблема типична на свежих установках Ubuntu или Debian. Файл <strong>pg_hba.conf</strong> управляет этим: там строки вроде <code>local all all peer</code> блокируют несоответствия. Без прав на редактирование сервера подключиться не выйдет. Логично сначала проверить логи PostgreSQL командой <code>sudo tail -f /var/log/postgresql/postgresql-*-main.log</code>, чтобы увидеть точную причину отказа.</p>
<p dir="auto">Вот распространённые сценарии:</p>
<ul>
<li>Подключение под <strong>root</strong> без sudo -u postgres.</li>
<li>Отсутствует UNIX-юзер <strong>postgres</strong> в системе.</li>
<li>Изменённые права после обновления ОС.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>Причина</th>
<th>Быстрое действие</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>psql -U postgres</code></td>
<td>Нет юзера postgres в ОС</td>
<td><code>sudo -u postgres psql</code></td>
</tr>
<tr>
<td>Локальное подключение</td>
<td>peer в pg_hba.conf</td>
<td>Изменить на md5</td>
</tr>
<tr>
<td>После апдейта</td>
<td>Сброс конфига</td>
<td>Перезапустить сервис</td>
</tr>
</tbody>
</table>
<h2>Пошаговое решение через pg_hba.conf</h2>
<p dir="auto">Самый надёжный способ — временно переключить аутентификацию на <strong>trust</strong> или <strong>md5</strong>, чтобы войти и создать пароль. Файл pg_hba.conf обычно лежит в <code>/etc/postgresql/*/main/</code>. Откройте его с sudo: <code>sudo nano /etc/postgresql/14/main/pg_hba.conf</code> (версия зависит от вашей установки).</p>
<p dir="auto">Найдите строку <code>local all postgres peer</code> и замените на <code>local all postgres trust</code>. Это отключит пароль на время. Сохраните и перезапустите: <code>sudo systemctl restart postgresql</code>. Теперь <code>psql -U postgres</code> сработает без вопросов.</p>
<p dir="auto">Дальше в консоли postgres=# выполните <code>ALTER USER postgres PASSWORD 'your_secure_password';</code>. Вернитесь в pg_hba.conf, смените trust на md5 и снова перезапустите сервис. Теперь подключение требует пароль, что безопаснее.</p>
<p dir="auto"><strong>Шаги в деталях:</strong></p>
<ol>
<li><strong>Редактируйте pg_hba.conf</strong>: <code>sudo nano /etc/postgresql/*/main/pg_hba.conf</code>.</li>
<li><strong>Добавьте/измените</strong>: <code>local all postgres trust</code> в начало файла.</li>
<li><strong>Перезапуск</strong>: <code>sudo systemctl restart postgresql</code> или <code>sudo service postgresql restart</code>.</li>
<li><strong>Подключитесь</strong>: <code>psql -U postgres</code>.</li>
<li><strong>Установите пароль</strong>: <code>ALTER USER postgres WITH PASSWORD 'mypassword';</code>.</li>
<li><strong>Верните md5</strong>: Измените строку обратно и перезапустите.</li>
</ol>
<p dir="auto"><em>Важно</em>: trust подходит только для локального доступа; для продакшена используйте scram-sha-256.</p>
<h2>Альтернативы без редактирования конфига</h2>
<p dir="auto">Если нет прав на pg_hba.conf, используйте системного юзера. Создайте его: <code>sudo adduser postgres</code> (если отсутствует). Или подключайтесь через <code>sudo -u postgres psql</code> — это обходит peer, имитируя нужного юзера.</p>
<p dir="auto">Для Docker или облачных инстансов проверьте переменные окружения: PGUSER и PGPASSWORD. В CI/CD вроде AppVeyor ошибка уходит удалением этих переменных, если сервер настроен на passwordless для текущего юзера. В Confluence или других пакетах проблема в коллациях или отсутствующих ролях — проверьте <code>\l</code> в psql.</p>
<p dir="auto"><strong>Варианты подключения:</strong></p>
<ul>
<li><code>sudo -u postgres createuser --interactive --pwprompt</code> для новых юзеров.</li>
<li><code>psql -h localhost -U postgres -W</code> с паролем по TCP.</li>
<li>Изменить в postgresql.conf <code>listen_addresses = '*'</code> для удалённого доступа.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Плюсы</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td>sudo -u postgres</td>
<td>Без прав на конфиг</td>
<td>Только локально</td>
</tr>
<tr>
<td>md5 в pg_hba</td>
<td>Парольная защита</td>
<td>Нужно рестарт</td>
</tr>
<tr>
<td>scram-sha-256</td>
<td>Современный хэш</td>
<td>PostgreSQL 10+</td>
</tr>
</tbody>
</table>
<h2>Методы аутентификации: что выбрать</h2>
<p dir="auto">PostgreSQL поддерживает несколько методов: <strong>peer</strong> (по ОС-юзеру), <strong>md5</strong> (пароль с хэшем), <strong>scram-sha-256</strong> (улучшенный), <strong>trust</strong> (без проверки). Peer хорош для dev, но в проде опасен. Md5 устаревает, переходите на scram.</p>
<p dir="auto">В pg_hba.conf строки читаются сверху вниз — первая подходящая применяется. Добавляйте специфичные правила: <code>local mydb myuser md5</code>. Для всех: <code>host all all 127.0.0.1/32 md5</code>. После правок всегда рестарт.</p>
<ul>
<li><strong>Peer</strong>: <code>local all all peer</code> — быстро, но небезопасно.</li>
<li><strong>Md5</strong>: <code>local all all md5</code> — пароль обязателен.</li>
<li><strong>Trust</strong>: Только для тестов, <code>local all all trust</code>.</li>
<li><em>Тестируйте</em>: <code>pg_ctl reload</code> вместо полного рестарта.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Безопасность</th>
<th>Сложность</th>
</tr>
</thead>
<tbody>
<tr>
<td>peer</td>
<td>Низкая</td>
<td>Лёгкая</td>
</tr>
<tr>
<td>md5</td>
<td>Средняя</td>
<td>Средняя</td>
</tr>
<tr>
<td>scram</td>
<td>Высокая</td>
<td>Средняя</td>
</tr>
</tbody>
</table>
<h2>Безопасная настройка после фикса</h2>
<p dir="auto">После решения подумайте о ролях: создайте отдельного юзера <code>CREATE ROLE appuser WITH LOGIN PASSWORD 'pass'</code>. Отзовите суперюзер у postgres: <code>ALTER ROLE postgres NOSUPERUSER</code>. Ограничьте доступ в pg_hba: <code>local appdb appuser md5</code>.</p>
<p dir="auto">Логи и мониторинг помогут: включите <code>log_connections = on</code> в postgresql.conf. Для кластеров используйте pgbouncer. Осталось учесть SSL для удалёнки и ротацию паролей — это следующий уровень защиты.</p>
<p dir="auto">Мы разобрали базовые случаи, но в продакшене тестируйте на staging. Теперь ошибка не застанет врасплох.</p>
]]></description><link>https://forum.exlends.ru/topic/732/postgresql-peer-authentication-failed-for-user-postgres-kak-ispravit-oshibku</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:52:25 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/732.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Feb 2026 14:21:36 GMT</pubDate><ttl>60</ttl></channel></rss>