PostgreSQL настройка доступа: Конфигурация pg_hba.conf, роли и безопасность | AdminWiki

PostgreSQL настройка доступа: Полное руководство по управлению подключениями и безопасностью

17 декабря 2025 8 мин. чтения #pg_hba.conf #postgresql #безопасность БД #настройка доступа #роли PostgreSQL #сетевая безопасность #управление пользователями
Содержание статьи

Представь, что ты развернул PostgreSQL сервер, но не можешь к нему подключиться. Или наоборот — к нему могут подключиться все, включая злоумышленников. Давай разберем, как правильно настроить доступ к PostgreSQL, чтобы обеспечить баланс между удобством использования и безопасностью.

Основные компоненты управления доступом в PostgreSQL

PostgreSQL использует два ключевых механизма для контроля доступа:

  • pg_hba.conf — файл аутентификации хостов (Host-Based Authentication)
  • Управление ролями и привилегиями — системные роли и права доступа к объектам
  • postgresql.conf — основные параметры подключения
Важно: Настройки доступа применяются в следующем порядке: сначала проверяется pg_hba.conf, затем проверяются права роли/пользователя.

Шаг 1: Настройка pg_hba.conf — основа контроля доступа

Файл pg_hba.conf определяет, кто, откуда и как может подключиться к серверу. Давай разберем его структуру на примерах.

Формат записей в pg_hba.conf

Каждая строка имеет следующий формат:

config
# TYPE  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# ------ --------- ----- -------- ------- ---------
host    all       all   0.0.0.0/0 md5

Практические примеры настроек

config
# Разрешить локальные подключения через Unix-сокет
local   all             all                                     trust

# Разрешить подключение с localhost с паролем
host    all             all             127.0.0.1/32            md5

# Разрешить доступ к БД 'appdb' пользователю 'appuser' с определенной подсети
host    appdb           appuser         192.168.1.0/24          md5

# Разрешить репликацию только для standby серверов
host    replication     replicator      192.168.1.100/32        md5

# Запретить все остальные подключения
host    all             all             0.0.0.0/0               reject

Методы аутентификации

Метод Описание Безопасность
trust Без аутентификации Опасен
md5 Парольная аутентификация MD5 Средний
scram-sha-256 Современный безопасный метод Высокий
peer Аутентификация через ОС (Unix) Высокий
reject Запрет подключения
Внимание: Метод 'trust' следует использовать только для локальных подключений в доверенной среде. Никогда не используйте его для сетевых подключений!

Шаг 2: Управление ролями и пользователями

В PostgreSQL нет разделения на пользователей и роли — это единая концепция. Давай создадим безопасного пользователя для приложения.

Создание пользователя с ограниченными правами

sql
-- Создаем пользователя для приложения
CREATE ROLE app_user WITH
    LOGIN
    NOSUPERUSER
    NOCREATEDB
    NOCREATEROLE
    NOINHERIT
    NOREPLICATION
    CONNECTION LIMIT 10
    PASSWORD 'StrongPassword123!';

-- Создаем базу данных для приложения
CREATE DATABASE app_database
    OWNER app_user
    ENCODING 'UTF8'
    LC_COLLATE 'en_US.UTF-8'
    LC_CTYPE 'en_US.UTF-8';

-- Даем права на подключение к базе
GRANT CONNECT ON DATABASE app_database TO app_user;

Настройка привилегий на уровне схемы и таблиц

sql
-- Подключаемся к базе данных приложения
\c app_database

-- Даем права на использование схемы public
GRANT USAGE ON SCHEMA public TO app_user;

-- Даем права на создание таблиц в схеме public
GRANT CREATE ON SCHEMA public TO app_user;

-- После создания таблиц, даем конкретные права
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

-- Даем права на использование последовательностей
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO app_user;

-- Настраиваем права по умолчанию для будущих таблиц
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;

Шаг 3: Настройка сетевых параметров в postgresql.conf

Для того чтобы PostgreSQL принимал сетевые подключения, нужно правильно настроить основные параметры.

config
# На каком адресе слушать подключения
# '*' - все интерфейсы, 'localhost' - только локальные
listen_addresses = 'localhost,192.168.1.100'

# Порт для подключений
port = 5432

# Максимальное количество подключений
max_connections = 100

# Размер буфера для SSL
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'

# Таймауты соединений
authentication_timeout = 60s  # 1 минута на аутентификацию
tcp_keepalives_idle = 60       # Проверять соединение каждую минуту

Шаг 4: Безопасная конфигурация для production

Давай создадим безопасную конфигурацию для production-окружения.

Пример pg_hba.conf для production

config
# ============================================
# PRODUCTION CONFIGURATION - SECURE SETTINGS
# ============================================

# Локальные подключения через Unix socket
local   all             postgres                                peer
local   all             all                                     scram-sha-256

# Localhost connections
host    all             all             127.0.0.1/32            scram-sha-256

# Application connections from specific subnet
host    app_database    app_user        192.168.1.0/24          scram-sha-256

# Replication only from standby servers
host    replication     replicator      192.168.1.200/32        scram-sha-256
host    replication     replicator      192.168.1.201/32        scram-sha-256

# Monitoring user from monitoring server
host    postgres        monitor_user    192.168.1.50/32         scram-sha-256

# DENY EVERYTHING ELSE
host    all             all             0.0.0.0/0               reject

Проверка текущих подключений

sql
-- Посмотреть текущие подключения
SELECT 
    pid,
    usename,
    application_name,
    client_addr,
    client_port,
    backend_start,
    state
FROM pg_stat_activity
WHERE state IS NOT NULL;

-- Посмотреть настройки pg_hba через SQL
SELECT * FROM pg_hba_file_rules;

-- Проверить права пользователя
\du app_user

-- Посмотреть, к каким базам есть доступ
SELECT 
    datname,
    datallowconn,
    pg_size_pretty(pg_database_size(datname)) as size
FROM pg_database
WHERE datallowconn = true;

Шаг 5: Применение изменений и диагностика проблем

Перезагрузка конфигурации

bash
# Перезагрузить конфигурацию без перезапуска сервиса
sudo systemctl reload postgresql

# Или изнутри PostgreSQL
SELECT pg_reload_conf();

# Проверить, что конфигурация загружена
SHOW hba_file;
SHOW config_file;

Диагностика проблем с подключением

bash
# Проверить логи PostgreSQL
sudo tail -f /var/log/postgresql/postgresql-14-main.log

# Проверить, слушает ли PostgreSQL на порту
sudo netstat -tlnp | grep 5432
sudo ss -tlnp | grep 5432

# Проверить подключение с клиента
psql -h 192.168.1.100 -U app_user -d app_database

# Проверить с подробным выводом
PGPASSWORD='password' psql \
    -h 192.168.1.100 \
    -U app_user \
    -d app_database \
    -c "SELECT current_user, current_database();"

Лучшие практики безопасности

  • Используйте scram-sha-256 вместо md5 для парольной аутентификации
  • Минимизируйте использование SUPERUSER — создавайте отдельные роли с минимальными необходимыми правами
  • Ограничивайте доступ по IP — используйте конкретные подсети вместо 0.0.0.0/0
  • Регулярно обновляйте пароли — настройте ротацию паролей для пользователей
  • Используйте SSL/TLS для всех сетевых подключений
  • Ведите аудит подключений — настройте логирование неудачных попыток входа

Часто задаваемые вопросы (FAQ)

Почему я получаю ошибку "no pg_hba.conf entry for host"?

Эта ошибка означает, что в файле pg_hba.conf нет записи, разрешающей подключение с вашего IP-адреса. Проверьте, что адрес клиента попадает в одну из разрешенных подсетей в pg_hba.conf.

Как безопасно открыть доступ к PostgreSQL из интернета?

Никогда не открывайте PostgreSQL напрямую в интернет. Используйте:

  • SSH туннелирование
  • VPN подключение
  • Reverse proxy с аутентификацией
  • Cloud VPN (WireGuard, OpenVPN)

В чем разница между trust и peer методами аутентификации?

trust — позволяет подключиться без какой-либо аутентификации.
peer — использует аутентификацию через операционную систему (проверяет, что пользователь ОС совпадает с пользователем PostgreSQL).
Всегда используйте 'peer' для локальных подключений вместо 'trust'.

Как настроить доступ для репликации?

Для репликации нужно:

  1. Создать пользователя с ролью REPLICATION
  2. Добавить запись в pg_hba.conf для базы данных 'replication'
  3. Настроить параметры wal_level, max_wal_senders в postgresql.conf

Как проверить, какие права есть у пользователя?

Используйте команды:
\du username — информация о роли
SELECT * FROM pg_roles WHERE rolname = 'username';
\z table_name — права на конкретную таблицу

Заключение

Настройка доступа в PostgreSQL — это баланс между безопасностью и удобством. Помни основные принципы:

  1. Минимальные привилегии — давай только те права, которые действительно нужны
  2. Защита периметра — настрой pg_hba.conf максимально строго
  3. Слои безопасности — используй комбинацию сетевых ограничений, аутентификации и авторизации
  4. Мониторинг — следи за подключениями и подозрительной активностью

Правильно настроенная система доступа не только защитит твои данные, но и упростит администрирование в долгосрочной перспективе. Начни с минимальных прав и расширяй их по мере необходимости, всегда документируя изменения.

Совет: Всегда тестируй изменения в pg_hba.conf на staging-окружении перед применением в production. Используй инструменты вроде pgTAP для автоматического тестирования конфигураций безопасности.
Поделиться:
Сохранить гайд? В закладки браузера