Содержание страницы
Двухфакторная аутентификация, использование OpenConnect с одноразовыми паролями с ограниченным сроком действия (TOTP).
Подключение аутентификации с использованием одноразовых паролей
Подготовка
VPN сервер обязательно должен иметь минимальное расхождение во времени с клиентами, поэтому стоит проверить работу NTP клиента.
Варианты установки
- Одноразовые пароли с файлом паролей ocserv. В качестве первичного пароля будет выступать локальная база пользователей
- Одноразовые пароли с PAM. В качестве первичного пароля будет выступать внешний сервер аутентификации
Использование OATH Toolkit
OATH Toolkit предоставляет компоненты для создания систем аутентификации одноразовых паролей. Он содержит общие библиотеки, инструменты командной строки и модуль PAM. Поддерживаемые технологии включают алгоритм HOTP на основе событий (RFC 4226), алгоритм TOTP на основе времени (RFC 6238) и Portable Symmetric Key Container (PSKC, RFC 6030) для управления данными секретных ключей. OATH означает Open AuTHentication, что является организацией, которая определяет алгоритмы.
Установка необходимых пакетов
apt install -y oathtool libpam-oath xxd qrencode
Форматы файлов
users.oath в формате “UsersFile”
Файл users.oath содержит секретную информацию о пользователях, PIN-кодах и ключах токенов на сервере. Его местоположение настраивается с помощью соответствующих параметров. Этот файл перезаписывается каждый раз, когда происходит успешный ввод второго пароля. Поэтому редактировать его следует только тогда, когда сервер остановлен (или не происходит аутентификация).
Вам нужно будет создать этот файл вручную и убедиться, что вы правильно установили разрешения.
touch /etc/ocserv/users.oath
chown root:root /etc/ocserv/users.oath
chmod 600 /etc/ocserv/users.oath
Каждая строка определяет одну комбинацию пользователь + токен. В настоящее время пользователь может иметь только один связанный токен.
Пользователи могут иметь PIN-код произвольной длины или тире («-») для отсутствия PIN-кода, или плюс («+»), если PIN-код проверяется извне.
Если у пользователя есть PIN-код, он должен предшествовать одноразовому паролю в поле пароля. Например, если у пользователя есть PIN-код “ABC”, а токен генерирует одноразовый пароль “123456”, то пользователь должен ввести “ABC123456” в качестве своего пароля для аутентификации.
Токены должны быть настроены как токены событий или токены времени. Для токенов, основанных на времени, длина одного временного интервала указывается как часть типа токена.
HOTP - токен HOTP на основе событий с шестизначным одноразовым паролем
HOTP/E - токен HOTP на основе событий с шестизначным одноразовым паролем
HOTP/E/8 - токен HOTP на основе событий с восьмизначным одноразовым паролем
HOTP/T30 - токен HOTP на основе времени с 30-секундным интервалом и шестизначным одноразовым паролем
HOTP/T60 - токен HOTP на основе времени с 60-секундным интервалом и шестизначным одноразовым паролем
HOTP/T60/6 - токен HOTP на основе времени с 60-секундным интервалом и шестизначным одноразовым паролем
MOTP - токен Mobile-OTP на основе времени с 10-секундным интервалом и шестизначным одноразовым паролем
MOTP/E - токен Mobile-OTP на основе событий с шестизначным одноразовым паролем
Пример токена пользователя admin
#token user PIN secret
HOTP/T30 admin - c869145915b76907f0bd7e33feacf3bd
URI в формате “otpauth”
URI содержит множество параметров
- type – hotp или totp – обязательный параметр, используется для указания, будет ли ключ использоваться для HOTP на основе событий или для TOTP на основе времени
- secret – обязательный параметр, представляет значение ключа, закодированное в Base32
- issuer – рекомендуемый параметр, представляет собой строковое значение, указывающее поставщика или службу, с которой связана эта учетная запись
- digits – опциональный параметр, может иметь значения 6 или 8 и определяет количество цифр для генерации
- counter – обязательный параметр, установит начальное значение счетчика, при предоставлении ключа для использования с HOTP
- period – опциональный параметр, определяет период, в течение которого код TOTP будет действителен, в секундах. Значение по умолчанию – 30
-
algorithm – опциональный параметр, алгоритм, используемый для токенов TOTP или HOTP. Один из списка: SHA1, SHA256, SHA512. Значение по умолчанию – SHA1
Варианты URI (otpauth://TYPE/LABEL?PARAMETERS)
otpauth://TYPE/USER?secret=0123456789ABCDEF&issuer=ISSUSER&algorithm=SHA1&digits=6&period=30
otpauth://TYPE/USER@DOMAIN?secret=0123456789ABCDEF&issuer=ISSUSER&algorithm=SHA1&digits=6&period=30
otpauth://TYPE/ISSUSER:USER@DOMAIN?secret=0123456789ABCDEF=&issuer=ISSUSER&algorithm=SHA1&digits=6&period=30
Пример
otpauth://totp/NOTDEV:[email protected]?secret=PQXEYD2ICC2YKLYFUOVIV6MHGU======&issuer=NOTDEV&algorithm=SHA1&digits=6&period=30
Добавление пользователя в 2FA
Создадим простой скрипт для добавления пользователей nano 2fa_add_user.sh
#!/bin/sh
# Config >
#User
USER=$1
#Pin
PIN="-"
#Digits
DIGITS=6
#Period 30 or 60
PERIOD=30
#Algorithm
ALGORITHM=SHA1
#Type
TYPE="totp"
ISSUSER="NOTDEV"
DOMAIN="notdev.ru"
QRDB="/root/qr/"
# Config <
# Begin >
#Generate TOKEN
TOKEN=$(head -c 16 /dev/urandom |xxd -c 256 -ps)
# backup cleanup base users
echo -e "HOTP/T${PERIOD}/${DIGITS}\t${USER}\t${PIN}\t${TOKEN}" >> /etc/ocserv/users.db
# work base users
echo -e "HOTP/T${PERIOD}/${DIGITS}\t${USER}\t${PIN}\t${TOKEN}" >> /etc/ocserv/users.oath
#Convert the TOKEN to BASE32
TOKENB32=$(echo "${TOKEN}" | xxd -r -p | base32)
#Create a QR code which can be imported in FreeOTP/Yandex Key/Google Authenticator
uri="otpauth://${TYPE}/${ISSUSER}:${USER}@${DOMAIN}?secret=${TOKENB32}&issuer=${ISSUSER}&algorithm=${ALGORITHM}&digits=${DIGITS}&period=${PERIOD}"
#output URI to console
echo "$uri"
#output QR to console
qrencode -t ANSIUTF8 "$uri" > ${QRDB}/${USER}_oath.qr
cat ${QRDB}/${USER}_oath.qr
#output QR to image
qrencode -d 300 -s 16 -l H -v 1 --background=FFFFFF -o ${QRDB}/${USER}_oath.png "$uri"
# Begin <
exit
Использовать его крайне просто
2fa_add_user.sh user1
В результате будет сгенерирован token, добавлен в соответствующие файлы, а так же создан qr-код на основе ранее сгенерированного токена, для использования внешнего приложения.
Клиентские приложения
Добавление ключа для генерации 2FA достаточно простое, большинство приложений позволяет отсканировать созданный QR-код и автоматически добавит нужный ключ в приложение. Так же можно добавить ключ в ручную, но это может вызвать некоторые сложности. Поэтому рекомендуется использовать QR-код.
- FreeOTP: Google Play, App Store
- Яндекс Ключ: Google Play, App Store
- Google Authenticator: Google Play, App Store
- Aladdin 2FA: Linux, Windows, Google Play, RuStore, App Store
- Другое приложение: Microsoft Store, Windows, Google Play, App Store
Настройка PAM
В дополнение к аутентификации системы необходимо добавить следующую строку в /etc/pam.d/ocserv, добавлять после @include common-auth
nano /etc/pam.d/ocserv
auth requisite pam_oath.so usersfile=/etc/ocserv/users.oath digits=6 window=2
usersfile=/etc/ocserv/users.oath – путь к файлу с пользователями
digits=6 – шестизначный одноразовый пароль
window=2 – определяет количество 2 последовательных ключей, которые будут действительны, используется на случай рассинхронизации времени на сервере или клиентском устройстве с приложением 2FA
Для отладки можно использовать более мягкие знчения и включить флаг debug
auth requisite pam_oath.so debug usersfile=/etc/ocserv/users.oath digits=6 window=10
Настройка OpenConnect VPN Server
Дополнительные настройки будут минимальными для любого из вариантов.
1. Вариант установки: Одноразовые пароли с файлом паролей ocserv
Начиная с версии 0.10.9 можно использовать файл паролей ocserv для 2FA. Для этого требуется, чтобы ocserv был скомпилирован с liboath. В этом случае в ocserv.conf должны присутствовать следующие строки.
Отредактируйте ocserv.conf согласно вашей конфигурации, nano /etc/ocserv/ocserv.conf
auth = "plain[passwd=/etc/ocserv/passwd,otp=/etc/ocserv/users.oath]"
В этом случае ‘passwd’ должен быть в формате файла паролей ocserv, а users.oath должен быть в формате “UsersFile”
2. Вариант установки: Одноразовые пароли с PAM
В этом случае в ocserv.conf должны присутствовать следующие строки.
Отредактируйте ocserv.conf согласно вашей конфигурации, nano /etc/ocserv/ocserv.conf
auth = "pam"
Наличие gssapi зависит от вашей конфигурации, используется ли сквозная аутентификация при использовании AD/DC или LDAP сервера доступного вне корпоративной сети
enable-auth = "gssapi[keytab=/etc/host.keytab,require-local-user-map=true,tgt-freshness-time=86400]"
После перезапуска сервиса ocserv, можно приступать к использованию двухфакторной аутентификации.
Дополнительные настройки
- Как установить и настроить OpenConnect VPN Server с поддержкой Let’s Encrypt
- Аутентификация пользователей в OpenConnect VPN Server – AD, Kerberos
- Безопасность OpenConnect VPN Server
- Мониторинг пользовательской активности OpenConnect VPN Server
Дополнительная информация