2024-05-16

В связи с нестабильной работой 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.

Итак, начнем:

Сначала развернем централизованный MultiOTP сервер (сервер многофакторной авторизации), для этого качаем с официального сайта образ для виртуальной машины Hyper-V или VMWare и разворачиваем в своей инфраструктуре

Первое что необходимо сделать – поменять 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

На этом в целом настройка сервера закончена, переходим к установке клиентской части на терминальный сервер.

Скачиваем необходимые дистрибутивы:

multiOTPCredentialProvider-5.9.5.6.zip

Microsoft Visual C++  2015-2022 x64

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

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

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