Гид по технологиям

Настройка OpenVPN для аутентификации через LinOTP

5 min read Безопасность Обновлено 02 Oct 2025
OpenVPN + LinOTP: настройка двухфакторной аутентификации
OpenVPN + LinOTP: настройка двухфакторной аутентификации

Эта инструкция показывает, как настроить OpenVPN для аутентификации пользователей через LinOTP — сервер одноразовых паролей (OTP). Вы узнаете, как установить LinOTP и pam_py_linotp, подключить PAM-модуль к OpenVPN и провести базовое тестирование. Варианты: RADIUS или Web API, рекомендации по безопасности и чек-листы для администратора и пользователя.

Введение

Задача — заставить OpenVPN проверять пользователей через LinOTP, чтобы обеспечить двухфакторную аутентификацию (2FA): сертификат клиента + OTP. Такой подход подходит, когда нужно управлять множеством пользователей с разными типами токенов (аппаратные, программные, SMS и т.п.). Если у вас всего несколько пользователей и вы используете смартфон как токен, рассмотрите простые мобильные решения, но для централизованного управления LinOTP удобнее.

Важно: LinOTP — это отдельный бэкенд для управления токенами и проверки OTP. Он может работать локально или по сети.

Краткий метод (mini-methodology)

  1. Установить LinOTP и запустить сервис.
  2. Установить pam_py_linotp и libpam-python на OpenVPN-сервере.
  3. Создать PAM-стек common-linotp с указанием URL LinOTP.
  4. Настроить OpenVPN для использования pam-модуля через openvpn-auth-pam.so.
  5. Протестировать подключение и отладить логи.

Требования и предпосылки

  • Доступ 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 фиксируют попытки входа и причины отказа.

Тестовые кейсы:

  1. Успешное подключение: корректный cert + верный OTP.
  2. Отказ по OTP: корректный cert + неверный OTP.
  3. Отказ по сертификату: отсутствует/неверный cert + любой OTP.
  4. Сбой 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 — одноразовый пароль.

Итоговые заметки

  • Тестируйте все сценарии прежде, чем переводить в продуктив.
  • Подумайте о резервных способах аутентификации и мониторинге.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

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

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

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

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

Как посмотреть посты, которые вы лайкали в Instagram
Социальные сети

Как посмотреть посты, которые вы лайкали в Instagram

OpenVPN + LinOTP: настройка двухфакторной аутентификации
Безопасность

OpenVPN + LinOTP: настройка двухфакторной аутентификации

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

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

Восстановить фото и видео WhatsApp View Once
Мобильные приложения

Восстановить фото и видео WhatsApp View Once