pg_hba.conf

Ограничивайте, кто может подключаться к pg_doorman, по адресу источника, базе, пользователю и типу соединения. Используется тот же формат правил, что и в pg_hba.conf PostgreSQL.

Это слой контроля доступа на сетевом уровне, который работает до проверки учётных данных. Соединение, отвергнутое pg_hba, никогда не доходит до проверки пароля.

Конфигурация

Три формата. Выбирайте тот, что подходит вашей инсталляции.

Inline-строка

general:
  hba: |
    hostssl all all 0.0.0.0/0 scram-sha-256
    host    all all 127.0.0.1/32 trust
    local   all all              trust
    host    all all 0.0.0.0/0    reject

Из файла

general:
  hba:
    path: "/etc/pg_doorman/pg_hba.conf"

Файл читается при старте и по SIGHUP.

Inline-содержимое под структурным ключом

general:
  hba:
    content: |
      hostssl all all 0.0.0.0/0 scram-sha-256
      host    all all 127.0.0.1/32 trust

То же, что и inline-строка; полезно, когда конфиг генерируется шаблонизатором.

Формат правил

Каждая строка:

<connection_type> <database> <user> [<source_cidr>] <method>

connection_type — один из:

ТипСовпадает с
hostTCP, с TLS или без
hostsslTCP только с активным TLS
hostnosslTCP только когда TLS не активен
localЛокальный Unix-сокет

databaseall, конкретное имя базы или список через запятую. replication не обрабатывается (pg_doorman не поддерживает проброс репликации).

userall, конкретный пользователь или список через запятую. Префикс +groupname (членство в роли PostgreSQL) не поддерживается.

source_cidr — IPv4- или IPv6-CIDR. Обязателен для host, hostssl, hostnossl. Неприменим к local.

method — один из:

МетодПоведение
trustПолностью пропустить проверку учётных данных. Клиент допускается под тем именем, которое заявил.
md5Принудительно требовать аутентификацию по паролю MD5.
scram-sha-256Принудительно требовать аутентификацию SCRAM-SHA-256.
rejectОтказать в соединении до любой проверки учётных данных.

Правила оцениваются сверху вниз. Побеждает первое совпавшее.

Примеры

Требовать TLS из сети, разрешить открытое локально

hostssl   all all 10.0.0.0/8     scram-sha-256
hostnossl all all 10.0.0.0/8     reject
host      all all 127.0.0.1/32   trust
local     all all                trust

ACL по базам

host billing  app_billing  10.0.0.0/8 scram-sha-256
host billing  all          0.0.0.0/0  reject
host inventory app_inv     10.0.0.0/8 scram-sha-256
host all       admin       10.1.1.0/24 scram-sha-256
host all       all         0.0.0.0/0  reject

Заблокировать legacy MD5 из открытого интернета

hostssl all all 0.0.0.0/0 scram-sha-256
host    all all 0.0.0.0/0 reject

Если в базе хранятся только хеши MD5, а клиент запрашивает SCRAM, аутентификация провалится с понятной ошибкой. Перед тем как ужесточать правила, переведите базу на SCRAM-SHA-256 (ALTER ROLE ... PASSWORD).

Отличия от pg_hba.conf PostgreSQL

  • Нет ключевого слова replication (pg_doorman не пробрасывает соединения репликации).
  • Нет методов peer, ident, cert, gss, sspi, pam. PAM настраивается на пользователя через auth_pam_service, не через HBA.
  • Нет префикса +groupname для пользователя.
  • Нет регулярных выражений (синтаксис /regex).
  • IPv6-CIDR поддерживается. IPv4-mapped IPv6 (::ffff:1.2.3.4) сверяется с правилами IPv4.

Перезагрузка

kill -HUP $(pidof pg_doorman)

Существующие соединения заново не оцениваются. Новые соединения используют новые правила.

Оговорки

  • Правила применяются к клиентам, подключающимся к pg_doorman, а не к PostgreSQL. Собственный pg_hba.conf PostgreSQL по-прежнему важен для соединения с бэкендом.
  • trust допускает клиента без какой-либо проверки учётных данных. Бэкенд всё равно должен аутентифицироваться как пользователь пула — но клиентская сторона не проверена. Используйте trust только в сетях, где адресу источника можно доверять (loopback, ограниченный Unix-сокет).
  • Поддержки LDAP, Kerberos и peer-аутентификации нет — смотрите Сравнение.