Ответ
В PgBouncer аутентификация пользователей настраивается через файл списка пользователей (userlist.txt), где пароли хранятся в виде хешей. Конфигурация состоит из двух частей.
1. Основной конфигурационный файл (pgbouncer.ini):
Здесь указывается путь к файлу со списком пользователей и, опционально, метод аутентификации.
[databases]
* = host=localhost port=5432
[pgbouncer]
auth_type = md5 # или scram-sha-256, если поддерживается
auth_file = /etc/pgbouncer/userlist.txt
listen_addr = *
listen_port = 6432
...
2. Файл списка пользователей (userlist.txt):
Это ключевой файл, где задаются имена пользователей и хеши их паролей. Формат: "username" "password_hash".
Генерация хеша для auth_type = md5:
Хеш MD5 создается от конкатенации пароля и имени пользователя.
# Пример: пользователь 'app_user' с паролем 'SecurePass123'
echo -n 'SecurePass123app_user' | md5sum
# Результат: d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5
Запись в userlist.txt:
"app_user" "md5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5"
Генерация хеша для auth_type = scram-sha-256 (рекомендуется):
SCRAM — более безопасный метод. Хеш генерируется с помощью встроенной утилиты pgbouncer или через подключение к PostgreSQL.
# Использование утилиты pgbouncer (если скомпилирована с поддержкой SCRAM)
pgbouncer -u -S 'SecurePass123' app_user
# Выведет строку для userlist.txt
Или можно получить хеш из PostgreSQL:
-- В PostgreSQL 13+
SELECT pg_catalog.scram_build_secret('SecurePass123');
Запись в userlist.txt для SCRAM будет выглядеть иначе:
"app_user" "SCRAM-SHA-256$4096:...very.long.base64.string..."
Мой практический подход:
- Я всегда стремлюсь использовать SCRAM-SHA-256, если версии PgBouncer (1.16+) и PostgreSQL (10+) поддерживают его. Это устраняет уязвимости, присущие MD5.
- Файл
userlist.txtдолжен иметь строгие права доступа (например,600), так как он содержит чувствительные данные. - Управление этим файлом я автоматизирую с помощью Ansible или Terraform, генерируя хеши на лету и безопасно доставляя их на серверы PgBouncer.