Как защитить PostgreSQL с двухфакторной аутентификацией WiKID
Введение
Эта инструкция показывает, как подключить двухфакторную аутентификацию для PostgreSQL, используя сервер WiKID Strong Authentication и PAM на Linux. Предполагается, что у вас уже установлены PostgreSQL и WiKID и они базово настроены.
Определения в одну строку:
- PAM: Pluggable Authentication Modules — модульная система аутентификации в Linux.
- RADIUS: Протокол удалённой проверки подлинности для централизованной аутентификации.
- WiKID: Сервер сильной аутентификации, выдающий одноразовые коды (OTP) и поддерживающий офлайн/онлайн режимы.
Важно: перед внесением изменений делайте резервные копии конфигурационных файлов (pg_hba.conf, /etc/pam.d/postgresql, /etc/raddb/server).
Что вы получите
- Централизованную 2FA-авторизацию для всех пользователей PostgreSQL в указанной сети.
- Возможность комбинировать локальные пароли и одноразовые коды WiKID.
- Контроль попыток и режимов офлайн/онлайн для мобильных токенов.
Ограничения и когда это не подойдёт
- Если приложения ожидают стандартную авторизацию PostgreSQL (md5/trust) и не поддерживают ввод OTP в поток логина, возможны нарушения работы. Для приложений используйте отдельные записи в pg_hba.conf.
- Для полностью автоматизированных сервисных подключений (без человека) 2FA не подходит; используйте отдельные сервисные учётные записи с ограниченным доступом.
Конфигурация PostgreSQL
Конфигурация PostgreSQL на стороне сервера проста: в файл pg_hba.conf добавьте строку, указывающую на использование PAM для нужной подсети.
host all all 192.168.0.0/24 pam postgresqlПояснения:
- host — тип соединения TCP/IP.
- all all — все базы и все пользователи.
- 192.168.0.0/24 — сеть, к которой применяется правило (локальная LAN в примере).
- pam postgresql — использовать PAM-конфигурацию с именем postgresql (файл /etc/pam.d/postgresql на Red Hat-подобных).
Практическая рекомендация:
- Оставьте отдельную строку для приложений/сервисов, использующих md5 или идентификацию по сертификатам, чтобы не нарушить их работу.
- После изменения перезапустите или перезагрузите PostgreSQL: systemctl reload postgresql или соответствующая команда для вашей дистрибуции.
Конфигурация PAM на сервере PostgreSQL
Если в вашей системе нет пакета pam_radius, скачайте его исходники с сайта pam_radius и установите согласно документации пакета.
После установки отредактируйте файл PAM для PostgreSQL (обычно /etc/pam.d/postgresql):
#%PAM-1.0
auth sufficient /lib/security/pam_radius_auth.so
account include system-auth
password include system-auth
session include system-auth
Пояснения:
- auth sufficient с pam_radius означает: если проверка RADIUS успешна — доступ предоставляется и дальнейшая аутентификация не требуется.
- account/password/session включают стандартные системные правила.
Примечание: путь к pam_radius_auth.so может отличаться в зависимости от дистрибутива (/lib64/… или /lib/security/…). Проверьте фактичесный путь в системе.
Теперь отредактируйте файл RADIUS-клиента на сервере PostgreSQL (/etc/raddb/server или /etc/radiusclient/radiusclient.conf в зависимости от реализации). Пример содержимого /etc/raddb/server:
# server[:port] shared_secret timeout (s)
#127.0.0.1 secret 1
192.168.0.10 your_shared_secret 3 Параметры:
- server — адрес WiKID-сервера (можно указать порт через двоеточие).
- shared_secret — секретная фраза, совпадающая с конфигурацией клиента на WiKID.
- timeout — таймаут в секундах на ожидание ответа сервера.
PAM-конфигурация варьируется по дистрибутивам; сверяйтесь с документацией вашей ОС.
Конфигурация сервера WiKID Strong Authentication
WiKID использует понятие «доменов аутентификации» — логическое разделение клиентов и токенов. Ниже приведены шаги по созданию домена и добавлению RADIUS-клиента.
Добавление домена в WiKID
Домены позволяют сегментировать полномочия аутентификации. Каждый токен во время первоначального provision использует 12-значный код, который указывает на домен (обычно это IP адрес сервера, дополненный нулями).
Например, сервер с публичным IP 27.232.7.14 имеет код 027232007014. При использовании службы wikidsystems.net вы можете применять префиксы или специальные коды для нестандартных сценариев.
Чтобы просмотреть или создать домен, в административном интерфейсе выберите пункт Domains (Домены). На экране отображаются текущие домены.

Выберите Create New Domain (Создать новый домен) для добавления. Поля, требующие заполнения:
- Domain Name — описательное название домена в панели администратора.
- Device Domain Name — короткая метка, отображаемая в меню на клиентском токене (лучше короткая для мобильных устройств).
- Minimum PIN Length — минимальная длина PIN для домена.
- Passcode Lifetime — срок действия одноразового пароля (в секундах).
- Server Code — 12-значный код (нулёвая дописанная IP-строка или префикс wikidsystems.net).
- Max Bad PIN Attempts — число неверных PIN до отключения токена.
- Max Bad Passcode Attempts — максимальное число неверных OTP для пользователя до блокировки.
- Max Sequential Offlines — число последовательных офлайн-авторизаций перед требованием онлайн-проверки.
- Use TACACS+ — опция использования TACACS+ вместо/вместе с RADIUS.

Важно: подберите Passcode Lifetime и Max Bad Passcode Attempts, учитывая баланс удобства и безопасности — короткий срок повышает безопасность, но увеличивает вероятность ошибок у пользователей.
Создание сетевых клиентов (RADIUS-клиент)
Сетевые клиенты — это системы, которые запрашивают проверку одноразовых паролей у WiKID. Перед использованием клиент должен быть создан и настроен в административной панели.
В панели выберите создание нового Network Client (Сетевого клиента). Укажите следующие параметры:
- Name — имя клиента (рекомендуется использовать hostname + домен WiKID).
- IP Address — IP адрес сервера PostgreSQL или любого промежуточного прокси.
- Protocol — выберите RADIUS.
- Domain — домен WiKID, в котором зарегистрированы токены ваших PostgreSQL-пользователей.
RADIUS-трафик защищён shared_secret. Введите тот же секрет, который вы указали в /etc/raddb/server на сервере PostgreSQL.



После создания клиента попытка авторизации из PostgreSQL будет перенаправлена на WiKID. Теперь доступ к PostgreSQL по сети 192.168.0.0/24 потребует одноразового кода от WiKID.
Практическая методология внедрения (мини-метод)
- Подготовка:
- Резервные копии pg_hba.conf, /etc/pam.d/postgresql, /etc/raddb/server.
- Тестовая среда, имитирующая продакшен сеть.
- Установка pam_radius в тестовом окружении.
- Настройка и тестирование RADIUS-запросов (radtest или radclient для проверки связи с WiKID).
- Внесение изменений в pg_hba.conf и мягкий перезапуск PostgreSQL.
- Тестирование логинов с реальными токенами WiKID (разные роли: DBA, разработчик, приложение).
- Мониторинг логов и коррекция таймаутов/shared_secret.
- Пошаговый ввод в продакшен: сначала узкий диапазон IP, затем расширение покрытия.
Контрольный список администратора перед вводом в эксплуатацию
- Создан резервный копия pg_hba.conf
- Установлен и проверен pam_radius
- В /etc/pam.d/postgresql указан корректный путь к pam_radius
- В /etc/raddb/server указан IP WiKID и совпадает shared_secret
- На WiKID создан домен и сетевой клиент с тем же shared_secret
- Тестовый пользователь с токеном зарегистрирован в домене
- Выполнены тестовые логины и проверена обработка ошибок
- Документированы инструкции для пользователей и поддержка
Критерии приёмки
- Успешный вход в PostgreSQL с учётной записью пользователя и корректным OTP.
- Отклонение доступа при неверном OTP или превышении лимита попыток.
- Непрерывная работа приложений, для которых оставлена отдельная строка в pg_hba.conf.
- Логи аутентификации содержат записи RADIUS-запросов и ответов.
Тестовые случаи и приёмочные проверки
- Успешный доступ с валидным OTP.
- Отказ при неверном OTP.
- Блокировка учетной записи после Max Bad Passcode Attempts.
- Поведение при недоступности WiKID (таймауты, fallback). Ожидается отказ доступа, если нет альтернативной схемы.
- Проверка логов: появились записи о запросе в /var/log/auth.log или в логах RADIUS-клиента.
- Проверка приложений: приложения, использующие подключение через пул подключения, корректно обрабатывают запросы на ввод OTP (в большинстве случаев GUI/CLI с локальным вводом будут работать; сервисные подключения должны быть выделены отдельно).
Поиск неисправностей и советы (troubleshooting)
- Нет ответа от WiKID: проверьте сеть (ping), порт RADIUS (обычно 1812), firewall/iptables.
- Неверный shared_secret: синхронизируйте secret в /etc/raddb/server и в настройках клиента WiKID.
- pam_radius не загружается: проверьте путь к .so в /etc/pam.d/postgresql и права доступа к файлу.
- Таймауты: увеличьте timeout в /etc/raddb/server или настройках клиента WiKID.
- Логи: смотрите /var/log/auth.log, системные и RADIUS-логи на предмет подробностей.
Важно: не выключайте логирование аутентификации в продакшене — это главный источник информации при инцидентах.
Безопасность и жёсткие рекомендации
- Shared_secret: используйте длинный уникальный секрет и храните его в защищённом месте.
- TLS/DTLS для RADIUS: рассмотрите варианты защиты RADIUS-трафика (VPN или современные расширения), если трафик идёт через ненадёжные сети.
- Меньше прав для сервисных аккаунтов: сервисные учётные записи должны иметь минимально необходимые права на базе данных.
- Обновления: поддерживайте pam_radius и WiKID в актуальном состоянии для исправления уязвимостей.
- Аудит: периодически проверяйте логи на подозрительную активность и проводите ротацию секретов.
Совместимость и миграция
- Для облачных инсталляций обратите внимание на адреса и доступность WiKID из облака. В некоторых случаях удобнее развернуть WiKID в том же VPC/сегменте.
- Для HA PostgreSQL (репликация) правило pg_hba.conf должно быть одинаково на всех нодах, или содержать исключения для внутренних сервисных подключений.
- Если у вас централизованный LDAP/AD, можно комбинировать 2FA: сначала подтверждение пароля через LDAP, затем OTP через RADIUS, но это потребует дополнительной настройки PAM stack.
Конфиденциальность и соответствие (GDPR)
- WiKID хранит минимальные данные о токенах и событиях аутентификации. Если вы обрабатываете персональные данные, убедитесь, что журналы и резервные копии хранятся в соответствии с политиками конфиденциальности и требованиями регулятора.
- Минимизируйте хранение персональных идентификаторов и регулярно очищайте устаревшие записи.
Роли и обязанности (короткие чек-листы)
Администратор PostgreSQL:
- Настроить pg_hba.conf и PAM, выполнить тестирование, документировать изменения.
Администратор WiKID:
- Создать домен, добавить сетевой клиент, настроить shared_secret и управлять токенами.
Оператор поддержки:
- Принимать инциденты, проверять логи, переключать на резервные механизмы доступа при необходимости.
Пользователь:
- Иметь зарегистрированный токен в нужном домене и знать процедуру восстановления при утере токена.
Итоги
Важно: двуфакторная аутентификация значительно повышает безопасность доступа к базам данных, но требует тщательного планирования: резервные пути, совместимость приложений и процедуры восстановления.
Краткое резюме:
- Настройка включает правки в pg_hba.conf, PAM (pam_radius) и добавление клиента в WiKID.
- Тестируйте в контролируемой среде и внедряйте поэтапно.
- Обеспечьте аудит, ротацию секретов и процедуры восстановления.
Если вам нужны шаблоны конфигураций для конкретных дистрибутивов (Debian/Ubuntu vs RHEL/CentOS) или пример playbook для автоматизации (Ansible), укажите цель, и я подготовлю соответствующий шаблон.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента