Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Архитектура эшелонированной защиты PostgreSQL 16

Комплексная защита PostgreSQL 16: мандатный доступ pg_hba.conf, SSL-шифрование и блокировка брутфорса

Пошаговое руководство по эшелонированной защите СУБД PostgreSQL 16 охватывает настройку правил pg_hba.conf, аутентификацию scram-sha-256, шифрование SSL/TLS в режиме verify-full и параметр require_auth. Системный подход дополняется аудитом логов с маской %r и баном брутфорса через Fail2ban.

Комплексная защита PostgreSQL 16: мандатный доступ pg_hba.conf, SSL-шифрование и блокировка брутфорса

Обеспечение безопасности СУБД PostgreSQL 16 в изолированных и публичных инфраструктурах требует применения принципа эшелонированной защиты (Defense in Depth). Надежный пароль учетной записи сам по себе не защищает от перехвата сетевого трафика, подделки IP-адресов или атак методом перебора (brute-force).

Полноценная система безопасности базы данных состоит из взаимодействия четырех основных слоев: ограничение сетевых интерфейсов, фильтрация подключений через файл pg_hba.conf, обязательное шифрование каналов SSL/TLS с проверкой сертификата сервера и реактивная блокировка атак на уровне операционной системы.

Эшелонированная безопасность СУБД: почему одного пароля недостаточно

В базовой конфигурации PostgreSQL прослушивает локальный интерфейс (listen_addresses = 'localhost') и допускает локальные подключения. При открытии внешнего порта 5432 для приложения база данных становится мишенью для сканеров и атак.

Использование небезопасных методов аутентификации (таких как trust или устаревший md5) создает критические уязвимости. Метод trust позволяет любому клиенту, сумевшему установить соединение, войти под любой ролью без проверки пароля. Метод md5 подвержен атакам повторного воспроизведения (replay attacks). Поэтому актуальным стандартом PostgreSQL является метод scram-sha-256 (Salted Challenge Response Authentication Mechanism), обеспечивающий взаимную аутентификацию без передачи пароля в открытом виде.

Настройка pg_hba.conf: порядок правил и методы аутентификации

Файл pg_hba.conf (Host-Based Authentication) управляет доступом на этапе установки соединения. Главное правило работы с pg_hba.conf: файл обрабатывается строго сверху вниз до первого совпадения. Если подключающийся клиент совпал со строкой конфигурации, PostgreSQL выполняет указанный метод аутентификации. Если проверка завершается ошибкой, последующие строки файла не рассматриваются.

Пример безопасного построения правил в pg_hba.conf:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# Локальные Unix-сокеты для администратора
local   all             postgres                                peer

# Приложение на том же сервере через локальный сокет
local   app_db          app_user                                scram-sha-256

# Подключения приложения по защищенному SSL- каналу из внутренней подсети
hostssl app_db          app_user        10.0.1.0/24             scram-sha-256

# Явный запрет всех остальных нешифрованных или сторонних подключений
host    all             all             0.0.0.0/0               reject
host    all             all             ::/0                    reject

Обратите внимание: тип записи hostssl обязывает использовать SSL-соединение. Если на сервере отключен параметры ssl=off, строки hostssl игнорируются с предупреждением в логе, так как они не могут совпасть. Для применения изменений в pg_hba.conf не требуется перезапуск сервера — достаточно выполнить SQL-команду SELECT pg_reload_conf();. Для проверки корректности синтаксиса файла перед перезагрузкой используется системное представление pg_hba_file_rules.

Защита сетевых соединений: шифрование SSL/TLS и режим verify-full

Шифрование трафика предотвращает перехват данных и учетных записей в сети. Для включения SSL/TLS в файле postgresql.conf задаются следующие параметры:

ssl = on
ssl_cert_file = '/etc/ssl/certs/server.crt'
ssl_key_file = '/etc/ssl/private/server.key'
ssl_ca_file = '/etc/ssl/certs/root.crt'
ssl_min_protocol_version = 'TLSv1.2'

Файл приватного ключа server.key должен принадлежать системному пользователю postgres и иметь строго ограниченные права доступа (chmod 0600).

На стороне клиента (в приложении или утилите psql) критически важно настроить режим проверки сертификата sslmode. Значение по умолчанию prefer сначала пытается установить SSL, но при ошибке автоматически откатывается на нешифрованное соединение. Режим verify-full обеспечивает максимальную защиту:

  • Он требует наличие действующего SSL-соединения.
  • Он проверяет цепочку доверия сертификата до корневого CA.
  • Он сопоставляет имя хоста, указанное в строке подключения (db.internal), с доменным именем (SAN/CN) в сертификате сервера.

Новые возможности PostgreSQL 16: параметр require_auth и связывание каналов

PostgreSQL 16 вводит дополнительный параметр клиентской библиотеки libpq — require_auth. Данный параметр позволяет принудительно задать список разрешенных методов аутентификации на стороне клиента:

postgresql://app_user:[email protected]:5432/app_db?sslmode=verify-full&require_auth=scram-sha-256

Если сервер попытается предложить другой метод аутентификации (например, при попытке понижения класса защиты — downgrade attack), клиент незамедлительно разорвет соединение.

Для защиты от атак типа Man-in-the-Middle при использовании TLS документация PostgreSQL 16 также рекомендует задействовать параметр связывания каналов channel_binding=require, связывающий учетные данные SCRAM с TLS-сертификатом сервера.

Логирование аудита и маски формата log_line_prefix

Реакция на инциденты и работа систем предотвращения вторжений (Fail2ban) зависят от качества логов базы данных. В postgresql.conf необходимо включить запись неверных попыток входа и настроить префикс лога:

logging_collector = on
log_connections = on
log_disconnections = on
log_line_prefix = '%m [%p] %q%u@%d %r '

Маска %r в log_line_prefix является обязательной: она фиксирует удаленный IP-адрес и порт подключающегося клиента (remote host and port). Без спецификатора %r утилита Fail2ban не сможет определить IP-адрес нападающего.

Автоматическая защита от брутфорса с помощью Fail2ban

Служба Fail2ban анализирует текстовые логи PostgreSQL и при превышении лимита неудачных попыток аутентификации автоматически добавляет IP-адрес нападающего в правила сетевого экрана (nftables или iptables).

Для настройки Fail2ban создайте файл фильтра /etc/fail2ban/filter.d/postgresql.conf:

[Definition]
failregex = ^<HOST>:\d+ \[\d+\] .*: FATAL:  password authentication failed for user ".*"$
            ^<HOST>:\d+ \[\d+\] .*: FATAL:  no pg_hba.conf entry for host ".*"$

Затем настройте правило блокировки в /etc/fail2ban/jail.local:

[postgresql]
enabled  = true
port     = 5432
protocol = tcp
filter   = postgresql
logpath  = /var/log/postgresql/postgresql-16-main.log
maxretry = 3
findtime = 600
bantime  = 3600
banaction = nftables-multiport

Данная конфигурация блокирует IP-адрес на 1 час (3600 секунд) при совершении 3 неудачных попыток входа в течение 10 минут (600 секунд).

Пошаговый чек-лист безопасного внедрения и валидации

При проведении работ по укреплению защиты СУБД PostgreSQL 16 придерживайтесь следующей последовательности:

  1. Инвентаризация и бэкап: Сохраните копии файлов pg_hba.conf и postgresql.conf. Проверьте наличие доступа по локальному Unix-сокету для предотвращения блокировки администратора.
  2. Перевод на SCRAM: Убедитесь, что все учетные записи используют хеширование scram-sha-256. Обновите пароли пользователей.
  3. Выпуск SSL-сертификатов: Сгенерируйте сертификаты с указанием DNS-имен базы данных в поле Subject Alternative Name (SAN). Установите права 0600 на файл ключа.
  4. Редактирование pg_hba.conf: Разместите узкие правила hostssl выше общих правил. Включите параметр require_auth в клиентах.
  5. Проверка файла конфигурации: Выполните валидацию правил без перезапуска:
    SELECT file_name, line_number, error FROM pg_hba_file_rules WHERE error IS NOT NULL;
    
  6. Применение настроек: Выполните безопасную перезагрузку:
    SELECT pg_reload_conf();
    
  7. Тестирование Fail2ban: Запустите проверку статуса изолятора:
    fail2ban-client status postgresql
    
    Совершите 3 заведомо неверных попытки подключения с тестового хоста и убедитесь, что IP-адрес заблокирован сетевым экраном.

Построенная по данной схеме архитектура защиты PostgreSQL 16 обеспечивает надежный барьер против несанкционированного доступа, сетевого перехвата и автоматизированных атак.