Представь, что ты развернул PostgreSQL сервер, но не можешь к нему подключиться. Или наоборот — к нему могут подключиться все, включая злоумышленников. Давай разберем, как правильно настроить доступ к PostgreSQL, чтобы обеспечить баланс между удобством использования и безопасностью.
Основные компоненты управления доступом в PostgreSQL
PostgreSQL использует два ключевых механизма для контроля доступа:
- pg_hba.conf — файл аутентификации хостов (Host-Based Authentication)
- Управление ролями и привилегиями — системные роли и права доступа к объектам
- postgresql.conf — основные параметры подключения
Шаг 1: Настройка pg_hba.conf — основа контроля доступа
Файл pg_hba.conf определяет, кто, откуда и как может подключиться к серверу. Давай разберем его структуру на примерах.
Формат записей в pg_hba.conf
Каждая строка имеет следующий формат:
# TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
# ------ --------- ----- -------- ------- ---------
host all all 0.0.0.0/0 md5
Практические примеры настроек
# Разрешить локальные подключения через 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 | Запрет подключения | — |
Шаг 2: Управление ролями и пользователями
В PostgreSQL нет разделения на пользователей и роли — это единая концепция. Давай создадим безопасного пользователя для приложения.
Создание пользователя с ограниченными правами
-- Создаем пользователя для приложения
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;
Настройка привилегий на уровне схемы и таблиц
-- Подключаемся к базе данных приложения
\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 принимал сетевые подключения, нужно правильно настроить основные параметры.
# На каком адресе слушать подключения
# '*' - все интерфейсы, '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
# ============================================
# 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
Проверка текущих подключений
-- Посмотреть текущие подключения
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: Применение изменений и диагностика проблем
Перезагрузка конфигурации
# Перезагрузить конфигурацию без перезапуска сервиса
sudo systemctl reload postgresql
# Или изнутри PostgreSQL
SELECT pg_reload_conf();
# Проверить, что конфигурация загружена
SHOW hba_file;
SHOW config_file;
Диагностика проблем с подключением
# Проверить логи 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'.
Как настроить доступ для репликации?
Для репликации нужно:
- Создать пользователя с ролью REPLICATION
- Добавить запись в pg_hba.conf для базы данных 'replication'
- Настроить параметры wal_level, max_wal_senders в postgresql.conf
Как проверить, какие права есть у пользователя?
Используйте команды:
\du username — информация о роли
SELECT * FROM pg_roles WHERE rolname = 'username';
\z table_name — права на конкретную таблицу
Заключение
Настройка доступа в PostgreSQL — это баланс между безопасностью и удобством. Помни основные принципы:
- Минимальные привилегии — давай только те права, которые действительно нужны
- Защита периметра — настрой pg_hba.conf максимально строго
- Слои безопасности — используй комбинацию сетевых ограничений, аутентификации и авторизации
- Мониторинг — следи за подключениями и подозрительной активностью
Правильно настроенная система доступа не только защитит твои данные, но и упростит администрирование в долгосрочной перспективе. Начни с минимальных прав и расширяй их по мере необходимости, всегда документируя изменения.