Ответ
Файл pg_hba.conf (Host-Based Authentication) — это центральный конфигурационный файл PostgreSQL, который управляет аутентификацией и авторизацией всех входящих подключений. Для DevOps-инженера это ключевой файл для настройки безопасного доступа, интеграции в инфраструктуру и автоматизации развертывания БД.
Структура записи и ее значение:
# TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
# ------ ---------- ---------- --------------- ----------- -----------------
host myapp_db app_user 10.0.1.0/24 scram-sha-256
hostssl all admin 192.168.1.100/32 cert clientcert=1
local replication replicator peer
- TYPE:
host(TCP/IP),hostssl(только SSL),local(Unix-сокет). - DATABASE: Имя БД или
all,replication. - USER: Имя пользователя или
all. - ADDRESS: CIDR для TCP/IP (например,
10.0.0.0/8для всей внутренней сети). - METHOD: Механизм аутентификации. Best practice —
scram-sha-256для паролей.
DevOps-практики работы с pg_hba.conf:
-
Инфраструктура как код (IaC): Файл должен управляться через системы конфигурации (Ansible, Chef) и храниться в Git.
# Пример задачи Ansible для настройки pg_hba.conf - name: Configure PostgreSQL client authentication template: src: pg_hba.conf.j2 dest: /etc/postgresql/14/main/pg_hba.conf owner: postgres group: postgres mode: '0640' notify: reload postgresql -
Безопасность и сегментация сети:
- Разрешать подключения только с определенных подсетей (например, приватных подсетей приложения).
- Для административного доступа использовать
hostsslс client certificate authentication (cert). - Для репликации выделять отдельного пользователя и разрешать подключение только с IP мастер-ноды.
-
Интеграция с контейнеризацией и оркестрацией: При развертывании в Kubernetes (например, через оператор Zalando) правила
pg_hba.confчасто генерируются автоматически на основе конфигурации кластера, но понимание их структуры необходимо для отладки проблем с подключением подов. -
Применение изменений: После правки файла не требуется полный рестарт PostgreSQL, достаточно перезагрузить конфигурацию:
# Способ 1: SQL-команда (требует права суперпользователя) psql -U postgres -c "SELECT pg_reload_conf();" # Способ 2: Сигнал SIGHUP процессу sudo systemctl reload postgresql # Или: pkill -HUP -u postgres
Типичная проблема и диагностика: Если приложение не может подключиться, проверьте логи PostgreSQL (/var/log/postgresql/postgresql-14-main.log). Сообщение вроде "no pg_hba.conf entry for host "10.0.2.15", user "app_user", database "myapp", SSL off" четко укажет, что нужно добавить соответствующую запись в pg_hba.conf.