Аутентификация
pg_doorman аутентифицирует клиентов прежде чем перенаправить их к PostgreSQL. Поддерживается шесть методов; они выбираются в порядке приоритета на основании того, что присылает клиент и что задано в конфигурации пула.
Эта страница объясняет, как pg_doorman выбирает метод аутентификации. Подробности настройки смотрите по ссылкам каждого метода ниже.
Обзор методов
| Метод | Когда использовать | Хранит ли секрет в конфиге? |
|---|---|---|
| Passthrough (MD5 / SCRAM) | По умолчанию. Имя пользователя пула совпадает с пользователем PostgreSQL. | Хеш MD5 или SCRAM ClientKey, никогда — открытый пароль |
| auth_query | Много пользователей, динамическое заведение. Учётные данные ищутся в самом PostgreSQL. | Только секрет одного сервисного пользователя |
| PAM | Аутентификация на уровне OS (LDAP через pam_ldap, Kerberos, локальные учётки). Только Linux. | Нет |
| JWT | Доступ сервиса к базе по короткоживущим токенам, подписанным внешним IdP. | Только публичный ключ |
| Talos | JWT с встроенным извлечением роли. Используется в Ozon. | Только публичный ключ |
| pg_hba.conf | Ограничение того, кто откуда может подключаться (сетевой ACL), независимо от метода учётных данных. | Нет |
LDAP, Kerberos GSSAPI, аутентификация по сертификатам и SCRAM channel binding (scram-sha-256-plus) не поддерживаются. Смотрите Сравнение.
Порядок выбора метода
pg_hba.conf оценивается первым, до любой проверки учётных данных. Правило reject обрывает соединение; правило trust полностью пропускает проверку учётных данных.
После HBA pg_doorman выбирает метод проверки учётных данных в таком порядке:
- Talos. Активируется, когда клиент подключается с именем пользователя
talos. Пароль клиента разбирается как JWT, из него извлекается роль (owner/read_write/read_only), и соединение продолжается под этой производной идентичностью. - HBA Trust. Если
pg_hba.confсовпал с правиломtrust, проверки учётных данных не происходит. - PAM. Если у совпавшего пользователя задан
auth_pam_service, учётные данные уходят в PAM (только Linux). PAM приоритетнее статического пароля. - SCRAM static. Если
passwordпользователя в конфиге начинается сSCRAM-SHA-256$, pg_doorman запускает SCRAM-аутентификацию. - MD5 static. Если
passwordпользователя начинается сmd5, pg_doorman запускает MD5-аутентификацию. - JWT. Если
passwordпользователя начинается сjwt-pkey-fpath:, пароль клиента проверяется как JWT по публичному ключу с диска.
auth_query не входит в этот список выбора — он выполняется до диспетчеризации, чтобы наполнить список пользователей пула хешами, полученными из PostgreSQL. После того как auth_query вернёт значение passwd, выбор метода идёт по префиксу этого значения (SCRAM-SHA-256$ или md5).
Если ни один метод не подошёл к формату пароля, pg_doorman возвращает «Authentication method not supported» и закрывает соединение.
Аутентификация на стороне PostgreSQL: passthrough vs configured
pg_doorman аутентифицируется дважды: один раз как шлюз (клиент → pg_doorman) и один раз как бэкенд (pg_doorman → PostgreSQL). Возможны три варианта:
- Passthrough (по умолчанию). Хеш MD5 клиента или SCRAM
ClientKeyпереиспользуется для аутентификации на PostgreSQL. В конфиге нет открытого пароля. Требует, чтобыserver_usernameне был задан (или был равен имени клиента). - Заданный пользователь бэкенда. Установите
server_usernameиserver_passwordв блоке пользователя. pg_doorman будет аутентифицироваться на PostgreSQL под ними. Используйте, когда имя пользователя пула отвязано от пользователя базы (Talos, JWT, переименование). - auth_query в выделенном режиме. Установите
server_userвнутри блокаauth_query. Все динамически найденные пользователи разделят один пул бэкенда, аутентифицированный какserver_user. Это размен идентичности бэкенда на пользователя ради эффективности переиспользования пула.
Подробности смотрите в Passthrough, а про выделенный режим — в auth_query.
Ограничение подключений
pg_hba.conf применяется до проверки учётных данных. Распространённые шаблоны:
- Отвергнуть всё кроме localhost:
host all all 0.0.0.0/0 reject, а перед нимhost all all 127.0.0.1/32 trust. - Требовать TLS для нелокальных соединений:
hostssl all all 0.0.0.0/0 scram-sha-256иhostnossl all all 127.0.0.1/32 trust. - ACL по базам:
host mydb appuser 10.0.0.0/8 scram-sha-256.
Смотрите pg_hba.conf.
Куда дальше
- Новая инсталляция? Прочтите Passthrough и Basic usage.
- Много пользователей с ротируемыми учётными данными? Используйте auth_query.
- Идентичность сервиса по токенам? Используйте JWT.
- Аутентификация, интегрированная с OS? Используйте PAM.
- Ограничения на сетевом уровне? Настройте pg_hba.conf.