Управление паролями в PostgreSQL: изменить через ALTER USER, сбросить если забыли через pg_hba.conf, настроить .pgpass для подключения без ввода пароля. Разбираем все сценарии — от смены в psql до полного сброса superuser.

- Изменить пароль пользователя
- Сброс пароля через pg_hba.conf
- Файл .pgpass — подключение без ввода пароля
- pg_hba.conf — методы аутентификации
- Строка подключения с паролем
- Часто задаваемые вопросы
- Как сбросить пароль postgres если его не помню?
- Ошибка «password authentication failed» — что делать?
- Безопасно ли хранить пароль в .pgpass?
Изменить пароль пользователя
-- В psql — изменить пароль своего пользователя:
\password
-- Запросит новый пароль и подтверждение (пароль не отображается)
-- Изменить пароль через ALTER USER (нужны права superuser для других пользователей):
ALTER USER postgres WITH PASSWORD 'новый_пароль';
ALTER USER appuser WITH PASSWORD 'новый_пароль';
-- Синоним ALTER ROLE:
ALTER ROLE appuser WITH PASSWORD 'новый_пароль';
-- Удалить пароль (только через Unix-сокет или trust-авторизация):
ALTER USER appuser WITH PASSWORD NULL;
-- Установить срок действия пароля:
ALTER USER appuser WITH PASSWORD 'пароль' VALID UNTIL '2025-12-31';
-- Снять ограничение:
ALTER USER appuser WITH VALID UNTIL 'infinity';
-- Проверить текущих пользователей и метаданные паролей:
SELECT rolname, rolpassword IS NOT NULL AS has_password, rolvaliduntil
FROM pg_authid
WHERE rolcanlogin = TRUE;
Сброс пароля через pg_hba.conf
Если забыли пароль пользователя postgres — нужно временно разрешить вход без пароля через pg_hba.conf:
# Шаг 1: Найти pg_hba.conf
# Linux:
find /etc/postgresql -name pg_hba.conf
# /etc/postgresql/16/main/pg_hba.conf
# macOS (Homebrew):
# /usr/local/var/postgresql@16/pg_hba.conf
# Windows:
# C:\Program Files\PostgreSQL\16\data\pg_hba.conf
# Шаг 2: Открыть файл и найти строку для localhost:
# TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 scram-sha-256
# Изменить METHOD на trust (вход без пароля):
host all all 127.0.0.1/32 trust
# Шаг 3: Перезапустить PostgreSQL:
# Linux:
sudo systemctl restart postgresql
# macOS Homebrew:
brew services restart postgresql@16
# Windows:
net stop postgresql-x64-16 && net start postgresql-x64-16
# Шаг 4: Подключиться без пароля и изменить пароль:
psql -U postgres
ALTER USER postgres WITH PASSWORD 'новый_надёжный_пароль';
# Шаг 5: Вернуть scram-sha-256 в pg_hba.conf и перезапустить PostgreSQL!
Файл .pgpass — подключение без ввода пароля
# Файл .pgpass позволяет psql/pg_dump читать пароль автоматически
# Формат: hostname:port:database:username:password
# Создать файл:
# Linux/macOS:
nano ~/.pgpass
# Содержимое (можно использовать * как wildcard):
localhost:5432:mydb:appuser:мой_пароль
localhost:5432:*:postgres:пароль_postgres
*:5432:analytics:readonly:readonly_pass
# * означает любое значение в этой позиции
# Установить права 600 (только владелец может читать):
chmod 600 ~/.pgpass
# Без этих прав PostgreSQL ИГНОРИРУЕТ .pgpass с предупреждением
# Windows — файл называется %APPDATA%\postgresql\pgpass.conf
# %APPDATA% обычно: C:\Users\Username\AppData\Roaming
# Проверить что .pgpass работает:
psql -U appuser -h localhost mydb
# Должен подключиться без запроса пароля
# Или через переменную окружения (только для текущей сессии):
export PGPASSWORD='мой_пароль'
psql -U appuser -h localhost mydb
# Это небезопасно — пароль виден в переменных окружения!
pg_hba.conf — методы аутентификации
| Метод | Описание | Применение |
|---|---|---|
scram-sha-256 | Хэшированный пароль (современный стандарт) | Рекомендуется для всех новых установок |
md5 | MD5 хэш пароля | Совместимость со старыми клиентами |
password | Пароль в открытом виде | Только в защищённых сетях, не рекомендуется |
trust | Без пароля, все допускаются | Только для локальной разработки |
peer | По имени системного пользователя Unix | Локальные соединения через Unix-сокет |
reject | Всегда отказывать | Блокировать определённые IP |
Строка подключения с паролем
-- Подключиться psql с паролем в командной строке (небезопасно, видно в history):
psql "postgresql://username:password@localhost:5432/dbname"
psql -U username -h localhost -d dbname -W
# -W — запросить пароль интерактивно (безопаснее)
-- Connection string для приложений:
postgresql://appuser:password@localhost:5432/mydb
postgresql://appuser:password@localhost:5432/mydb?sslmode=require
-- Через переменные окружения (безопаснее чем в строке подключения):
export PGHOST=localhost
export PGPORT=5432
export PGDATABASE=mydb
export PGUSER=appuser
export PGPASSWORD=password
psql # подключится используя переменные
-- pg_dump с паролем:
pg_dump -U appuser -h localhost mydb > backup.sql
# Пароль попросит интерактивно, или читает из .pgpass
Часто задаваемые вопросы
Как сбросить пароль postgres если его не помню?
Нужен доступ к серверу и права на редактирование pg_hba.conf. Алгоритм: 1) Найти pg_hba.conf (find /etc/postgresql -name pg_hba.conf на Linux). 2) Изменить метод для localhost с scram-sha-256 на trust. 3) Перезапустить PostgreSQL: sudo systemctl restart postgresql. 4) Подключиться без пароля: psql -U postgres. 5) Установить новый пароль: ALTER USER postgres WITH PASSWORD 'новый_пароль';. 6) Вернуть scram-sha-256 в pg_hba.conf и перезапустить PostgreSQL снова. Без доступа к серверу сбросить пароль невозможно.
Ошибка «password authentication failed» — что делать?
Проверить по порядку: 1) Правильный пользователь? Пользователь PostgreSQL и системный пользователь — разные вещи. 2) Пароль точно верный, без лишних пробелов? 3) К какой базе подключаетесь? psql -U postgres -d postgres — подключение к базе postgres, не к своей. 4) Метод в pg_hba.conf соответствует клиенту? Если в pg_hba.conf стоит md5, а клиент отправляет scram — может не совпасть. 5) Просмотреть логи: tail -f /var/log/postgresql/postgresql-*.log — там подробная причина ошибки.
Безопасно ли хранить пароль в .pgpass?
Относительно безопасно при правильных правах файла. Обязательно установите chmod 600 ~/.pgpass — PostgreSQL игнорирует файл с более широкими правами. Файл хранит пароль в открытом виде, поэтому не помещайте его в git-репозиторий. Добавьте в .gitignore: .pgpass. Альтернатива для продакшн: переменные окружения через secrets manager (Vault, AWS Secrets Manager), сертификаты SSL вместо паролей, pg_service.conf для хранения параметров подключения без пароля.



