Бесплатная двухфакторная аутентификация пользователей на терминальных серверах c LDAP Active Directory
В связи с нестабильной работой VPN в России в одной из компаний решили совсем отказаться от последнего в пользу Remote Desktop Gateway (RDG), дополнительными плюсами выступает отсутствие необходимости установки дополнительного ВПН клиента пользователю, можно обойтись лишь штатными средствами Windows, мультиплатформенность (приложение Microsoft Remote Desktop есть под все популярные ОС), вполне надежное SSL шифрование, значительное снижение нагрузки на маршрутизатор и т.д.
Однако банальный bruteforce (перебор пароля) и утечка ярлыка с сохраненными учетными данными юзера открывают хорошую брешь для взлома. И если от брутфорс можно защититься средствами маршрутизатора (даже на микротик довольно топорно, но реализовано, если кому интересно, могу написать как), то учетки юзеров остаются на совести последних. Отсюда родилась идея применения многофакторной аутентификации.
Мониторинг предложений на рынке услуг 2FA привел в расстройство, зарубежные предложения по типу Eset Secure Authentification, Microsoft MFA и т.д. отсутствием возможности приобретения продукта, а отечественные решения поражают ценой использования, хотя стоит отметить простоту внедрения и удобство использования и администрирования, например, топ 1 в поиске 2FA в яндексе дает бесплатно 3 учетных записи и неплохую инструкцию по применению.
Задумка следующая – пользователь подключается к RDG использую учетную запись из Active Directory, а на этапе подключения к терминальному серверу ему потребуется ввести код второго фактора из приложения.
В этой схеме нам придется установить агента на каждый терминальный сервер, поскольку используемый нами MultiOTP не работает с RDG.
Первое что необходимо сделать – поменять ip-адрес с предустановленного 192.168.1.44 на наш, подключаемся к машине пользователь/пароль root/root, переходим к файлу
nano /etc/network/interfaces
Если у нас DHCP, то закомментируем все что есть и ниже вставим:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Если адрес назначаем статический, то:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.0.0.XXX
netmask 255.255.255.XXX
network 10.0.0.XXX
gateway 10.0.0.XXX
Далее, чтобы в дальнейшем подцепить учетки по LDAP из Active Directory сразу проверим доступность DNS сервера адэхи
nslookup myADdomain.local
Если возвращается ip-адрес адэхи, пропускаем следующий пункт, если нет, то исправляем
nano /etc/resolv.conf
nameserver ipDNS_AD #биваем ip адэхи
nameserver 8.8.8.8
Далее перезагрузим службу сети
service networking restart
Подготовка закончена, подключим пользователей из AD:
Переходим в директорию
cd /usr/local/bin/multiotp/
и по очереди выполняем следующие команды:
./multiotp.php -config default-request-prefix-pin=0
Определяет, требуется ли наличие дополнительного (постоянного) пина при вводе одноразового пина (0 или 1)
./multiotp.php -config default-request-ldap-pwd=0
Определяет, требуется ли ввод доменного пароля при вводе одноразового пина (0 или 1)
./multiotp.php -config ldap-server-type=1
Указывается тип LDAP-сервер (0 = обычный LDAP-сервер, в нашем случае 1 = Active Directory)
./multiotp.php -config ldap-cn-identifier="sAMAccountName"
Указывает, в каком формате представлять имя пользователя (данное значение выведет только имя, без домена)
./multiotp.php -config ldap-group-cn-identifier="sAMAccountName"
То же самое, только для группы
./multiotp.php -config ldap-group-attribute="memberOf"
Указывает метод определения принадлежности пользователя к группе
./multiotp.php -config ldap-ssl=0
Использовать ли безопасное подключение к LDAP-серверу (значение 1,если хотим)
./multiotp.php -config ldap-port=389
Порт для подключения к LDAP-серверу (636, если в предыдущем ставили 1)
./multiotp.php -config ldap-domain-controllers=mydomain.local
Адрес вашего сервера Active Directory
./multiotp.php -config ldap-base-dn="CN=Users,DC=mydomain,DC=local"
Указываем, откуда начинать поиск пользователей в домене
./multiotp.php -config ldap-bind-dn="2fa@mydomain.local"
Указываем пользователя, у которого есть права поиска в Active Directory (предварительно создаем в AD или используем любой имеющийся)
./multiotp.php -config ldap-server-password="Пароль от юзера 2fa"
Указываем пароль пользователя, для подключения к Active Directory
./multiotp.php -config ldap-network-timeout=10
Выставляем таймаут для подключения к Active Directory
./multiotp.php -config ldap-time-limit=30
Выставляем ограничение по времени, на операцию импорта пользователей
./multiotp.php -config ldap-activated=1
Активируем конфигурацию подключения к Active Directory
./multiotp.php -debug -display-log -ldap-users-sync
В конце должны увидеть сообщение об успешной синхронизации, если нет, смотрим ошибку и исправляем.
Можно также зайти на веб-интрефейс этой виртуальной машины и проверить засинхронизированных пользователей https://10.0.0.XXX
Возвращаемся к виртуальной машине и правим клиента в уже предустановленном FreeRadius
nano /etc/freeradius/3.0/clients.conf
В самом низу файла уже есть предустановленный клиент, если он вам подходит, можно использовать его, у меня адресация другая, поэтому закоментируем дефолтный и вставим следующие
client 10.0.0.0/8 {
ipaddr = 10.0.0.0/8
shortname = RDP
secret = testing123
}
В качестве имени клиента можно указать что угодно, ipaddr = можно указывать как подстети, так и айпи наших терминальных серверов (естественно второе предпочтительно), secret очень важен, он нам понадобится в дальнейшем – ставим любое значение
Далее перезапустим фрирадиус
service freeradius restart
и попробуем локально затестить настроенное.
Для начала надо создать второй фактор, для этого переходим в браузере по айпи нашего MultiOTP сервера (узнать айпи можно набрав “ip a” в консоле)
Нажимаем Login (default login/password admin/1234)
Панель управления довольно проста, можем сразу поменять пароль для входа, создать пользователя вручную и т.д., нас интересует кнопка Print и Scratchlist нашего юзера из АД, в последней написаны аварийные коды для доступа, нажав Print окажемся в инструкции для пользователя
Где по первому QR-коду можно скачать приложение для аутентификации, использовать его не обязательно, можно использовать любой TOTP (Google Autentificator, Microsoft Autentificator и т.д.).
Второй QR-код сканируем удобным TOTP приложением в телефоне и видим что теперь генерируется новый 6тизначный код каждые 30 секунд
Возвращаемся в консоль MultiOTP
вводим для проверки
radtest admin 891419 10.0.0.XXX 1812 testing123
где admin – ваш пользователь
891419 – код из приложения
10.0.0.ХХХ – ip адрес MultiOTP сервера
testing123 – секрет, который мы создавали в файле ранее
Ответ должен быть такой
Sent Access-Request Id 122 from 0.0.0.0:43055 to 10.0.0.XXX:1812 length 76
User-Name = “admin”
User-Password = “891419”
NAS-IP-Address = 127.0.1.1
NAS-Port = 1812
Message-Authenticator = 0x00
Cleartext-Password = “891419”
Received Access-Accept Id 122 from 10.0.0.XXX:1812 to 10.0.0.XXX:43055 length 20
Если что-то пошло не так, ищем ответ в логах
FreeRadius: nano /var/log/freeradius/radius.log
MultiOTP: nano /var/log/multiotp/multiotp.log
На этом в целом настройка сервера закончена, переходим к установке клиентской части на терминальный сервер.
Скачиваем необходимые дистрибутивы:
Устанавливаем сначала Microsoft VisualC++, затем самого клинта
Некоторые важные моменты!
После установки клиента необходимо будет обязательно вводить двухфактор, если что-то пойдет не так, рекомендую к этому подготовиться заранее, чтоб не потерять доступ к терминалке
1. Проверить доступность по порту 443/tcp и 1812/udp с терминала до сервера MultiOTP и обратно (только 1812)
2. Устанавливать клиента с настройками Требовать ввод пароля только при удаленном подключении и для новых Logon, заранее войти под учетной записью Админа, чтоб была возможность удалить клиента или исправить его настройки
Заполняем айпи до сервера MultiOTP и секретный ключ который задавали ранее
Галочки расставляем по своему усмотрению, в целом все подписано
Галками можно задать когда требовать ввод второго фактора
На первый раз рекомендую ставить только при новой авторизации и только при подключении удаленно, в дальнейшем это можно поменять или переустановить с новыми настройками
На этом настройка завершена, подключаемся по RDP успешно вводим все учетные данные включая второй фактор, если все ок, ставим клиента на другие терминалки, если нет, смотрим логи, расположение написаны выше
Поменять настройки клиента можно в реестре HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978} или переустановить
P.S. У меня была ошибка несовпадения секрета
debug Server-Client Info: *CheckUserExists server request for admin with challenge | 0 multiotp
2023-08-18 16:14:20 debug Server-Client Info: *CheckUserExists intermediate error code: 70 0 multiotp
2023-08-18 16:14:20 debug Server-Client Info: *Server secret used for command CheckUserExists with error code result 70: ClientServerSecret 0 multiotp
Исправил следующим способом, заходим на терминалке в реестр HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}
Убеждаемся, что верно ввели ключ, переходим в консоль MultiOTP и вводим
multiotp -config server-secret=testing123
Вместо testing123 естественно ваш секрет
В этой инструкции не описывается роль RDG, поскольку в ней относительно двухфактора не вносится каких – то изменений