Настройка OpenVPN для аутентификации через LinOTP
Эта инструкция показывает, как настроить OpenVPN для аутентификации пользователей через LinOTP — сервер одноразовых паролей (OTP). Вы узнаете, как установить LinOTP и pam_py_linotp, подключить PAM-модуль к OpenVPN и провести базовое тестирование. Варианты: RADIUS или Web API, рекомендации по безопасности и чек-листы для администратора и пользователя.
Введение
Задача — заставить OpenVPN проверять пользователей через LinOTP, чтобы обеспечить двухфакторную аутентификацию (2FA): сертификат клиента + OTP. Такой подход подходит, когда нужно управлять множеством пользователей с разными типами токенов (аппаратные, программные, SMS и т.п.). Если у вас всего несколько пользователей и вы используете смартфон как токен, рассмотрите простые мобильные решения, но для централизованного управления LinOTP удобнее.
Важно: LinOTP — это отдельный бэкенд для управления токенами и проверки OTP. Он может работать локально или по сети.
Краткий метод (mini-methodology)
- Установить LinOTP и запустить сервис.
- Установить pam_py_linotp и libpam-python на OpenVPN-сервере.
- Создать PAM-стек common-linotp с указанием URL LinOTP.
- Настроить OpenVPN для использования pam-модуля через openvpn-auth-pam.so.
- Протестировать подключение и отладить логи.
Требования и предпосылки
- Доступ root или sudo на сервере OpenVPN и (опционально) на LinOTP-сервере.
- Установленные OpenVPN и сертифицированная инфраструктура (CA, сертификаты сервер/клиент).
- LinOTP (может быть на той же машине или на отдельном сервере).
- Пакет libpam-python и pip/apt/yum для установки python-модулей.
Установка LinOTP
Есть несколько способов развернуть LinOTP: пакеты для Debian/Ubuntu, установка через Python Package Index (pip) или развёртывание из исходников. Для тестовой среды часто достаточно установки через pip. Если вы планируете продуктивный сервис, используйте пакеты вашей дистрибуции и настройте резервное копирование базы данных.
Совет: можно установить LinOTP на той же машине, что и OpenVPN, для простоты отладки, но в продуктиве лучше отделять сервисы по безопасности и нагрузке.
Настройка PAM для LinOTP
LinOTP предоставляет несколько способов аутентификации: Web API, RADIUS и PAM. В этой инструкции мы используем PAM-модуль на Python: pam_py_linotp. Он проще в установке и гибок для интеграции с PAM-стеком OpenVPN.
Установка pam_py_linotp (варианты):
Сначала распакуйте и установите вручную:
tar -ztf pam_py_linotp-0.1.tar.gz
cd pam_py_linotp-0.1/
sudo python setup.py install
Быстрая установка через pip:
sudo pip install pam_py_linotp
Или скопируйте модуль в системную папку PAM:
cd pam_py_linotp-0.1/
cp src/pam_linotp.py /lib/security
Для использования Python-PAM модуля необходим пакет libpam-python. Установите его стандартным менеджером пакетов:
sudo apt-get install libpam-python
или
yum install libpam-python
Создание PAM-стека common-linotp
Чтобы удобно подключать LinOTP к разным сервисам (ssh, gdm, openvpn), создайте файл /etc/pam.d/common-linotp со стеком, например:
auth [success=1 default=ignore] pam_python.so /lib/security/pam_linotp.py debug url=https://localhost/validate/check
auth requisite pam_deny.so
auth required pam_permit.so
Пояснения:
- Первый параметр указывает модуль pam_python.so и путь к python-модулю pam_linotp.py.
- Параметр url указывает адрес API проверки LinOTP. Задайте https или http и порт согласно конфигурации LinOTP.
- Если LinOTP установлен на той же машине, используйте localhost, иначе укажите имя или IP сервера.
Важно: обеспечьте защищённое соединение между OpenVPN и LinOTP (HTTPS). Если используете самоподписанные сертификаты, настройте доверие на стороне клиента pam_py_linotp.
Настройка OpenVPN для использования PAM
Конфигурация клиента (client.ovpn)
Пример минимальной конфигурации клиента:
client
dev tun
proto udp
remote your.server.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3
auth-user-pass
Замените your.server.com и имена сертификатов на ваши.
Конфигурация сервера (server.conf)
Пример server.conf с подключением PAM-плагина:
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 192.168.42.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn
Адаптируйте имена сертификатов и IP-пул под вашу сеть.
PAM-конфигурация OpenVPN
Отредактируйте /etc/pam.d/openvpn так, чтобы он включал common-linotp и позволял миновать локальную учётную запись:
@include common-linotp
session sufficient pam_permit.so
account sufficient pam_permit.so
Пояснение: pam_permit.so используется, чтобы не требовать существования локальной системной учётной записи для каждого VPN-пользователя. Аутентификация будет пройдена через LinOTP.
Тестирование и сценарии приёмки
Критерии приёмки:
- Клиент с правильным сертификатом и верным OTP успешно подключается.
- Клиент с правильным сертификатом и неверным OTP отклоняется.
- Клиент без сертификата не подключается даже при правильном OTP.
- Логи OpenVPN и LinOTP фиксируют попытки входа и причины отказа.
Тестовые кейсы:
- Успешное подключение: корректный cert + верный OTP.
- Отказ по OTP: корректный cert + неверный OTP.
- Отказ по сертификату: отсутствует/неверный cert + любой OTP.
- Сбой LinOTP (сервер недоступен): поведение — отказ или откат по настройке таймаута.
Проверьте журналы:
- /var/log/openvpn.log или systemd journal для ошибок OpenVPN.
- Логи LinOTP для записей валидации.
Безопасность и рекомендации по эксплуатации
- Используйте HTTPS между OpenVPN и LinOTP. Защитите API-ключи и сертификаты.
- Разделяйте роли: LinOTP на отдельном сервере повышает безопасность.
- Ограничьте доступ к админ-интерфейсу LinOTP по IP и двухфакторной аутентификации.
- Обновляйте пакеты и отслеживайте CVE для компонент: OpenVPN, Python, PAM-модули.
- Лимитируйте число попыток ввода OTP и применяйте временные блокировки.
Важно: резервное восстановление токенов и аварийный план (например, резервный RADIUS или аварийные коды) должны быть предусмотрены до ввода в продуктив.
Альтернативные подходы
- RADIUS: можно подключить LinOTP к RADIUS и использовать openvpn-auth-pam как RADIUS-клиент. Удобно для централизованной инфраструктуры.
- Web API: напрямую вызывать API LinOTP из собственной логики аутентификации.
- Сторонние 2FA-провайдеры: если не требуется управлять различными типами токенов, рассмотрите коммерческие решения.
Когда этот метод не подходит:
- Если у вас нет возможности обеспечить надёжное HTTPS между сервисами.
- Если требуется минимальная задержка проверки и PAM-процесс не удовлетворяет требованиям по производительности.
Чек-листы по ролям
Администратор:
- Установить и протестировать LinOTP.
- Установить pam_py_linotp и libpam-python.
- Создать /etc/pam.d/common-linotp и включить в /etc/pam.d/openvpn.
- Настроить OpenVPN server.conf с плагином openvpn-auth-pam.so.
- Настроить мониторинг логов и оповещения об ошибках аутентификации.
- Подготовить аварийные коды и процедурy восстановления токенов.
Пользователь:
- Установить клиентские сертификаты по инструкции.
- Получить/зарегистрировать OTP-токен в LinOTP.
- При подключении вводить OTP по запросу клиента OpenVPN.
Модель принятия решений (Mermaid)
flowchart TD
A[Начало подключения клиента] --> B{Есть ли клиентский сертификат?}
B -- Нет --> C[Отклонить подключение]
B -- Да --> D[Запросить логин и OTP]
D --> E{LinOTP доступен?}
E -- Нет --> F[Отклонить или использовать резервную политику]
E -- Да --> G[Проверить OTP в LinOTP]
G -- Верно --> H[Установить VPN-сессию]
G -- Неверно --> C
Краткое резюме
Мы настроили OpenVPN на проверку пользователей через LinOTP, используя pam_py_linotp и libpam-python. Такой подход даёт надёжную двухфакторную аутентификацию: комбинацию клиентского сертификата и одноразового пароля. Для продуктивной эксплуатации рекомендуются HTTPS для API, разграничение сервисов и планы аварийного восстановления.
Глоссарий в одну строку
- LinOTP — сервер для управления OTP-токенами и проверки одноразовых паролей.
- PAM — модульная подсистема аутентификации в Unix-подобных системах.
- OTP — одноразовый пароль.
Итоговые заметки
- Тестируйте все сценарии прежде, чем переводить в продуктив.
- Подумайте о резервных способах аутентификации и мониторинге.
Похожие материалы

Исправить ошибку 0x80070718 в Windows 10

CoinDCX в Индии: как купить и продать криптовалюту

Как посмотреть посты, которые вы лайкали в Instagram
OpenVPN + LinOTP: настройка двухфакторной аутентификации

Аналитика Instagram: как измерять успех
