24.11.2024

Двухфакторная аутентификация пользователей в OpenConnect VPN Server

Двухфакторная аутентификация, использование 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 содержит множество параметров

  • typehotp или 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-код.

Настройка 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, можно приступать к использованию двухфакторной аутентификации.

Дополнительные настройки


Дополнительная информация

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *