Где и как конфигурируется шифрование пароля в PgBouncer?

«Где и как конфигурируется шифрование пароля в PgBouncer?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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..."

Мой практический подход:

  1. Я всегда стремлюсь использовать SCRAM-SHA-256, если версии PgBouncer (1.16+) и PostgreSQL (10+) поддерживают его. Это устраняет уязвимости, присущие MD5.
  2. Файл userlist.txt должен иметь строгие права доступа (например, 600), так как он содержит чувствительные данные.
  3. Управление этим файлом я автоматизирую с помощью Ansible или Terraform, генерируя хеши на лету и безопасно доставляя их на серверы PgBouncer.