В этой статье мы покажем, как внедрить двухфакторную аутентификацию пользователей в домене Windows с помощью open source продукта multiOTP. MultiOTP эта набор php скриптов и утилит, который реализует протокол OATH для HOTP/TOTP (Time-based One Time Password). Возможно использовать как в Windows, так и через RADIUS для реализации 2FA практически в чем угодно.
После внедрения multiOTP для входа пользователя Windows будет запрашивать дополнительный одноразовый пароль (OTP – one time password), который пользователь должен получить со своего мобильного устройства (приложение Microsoft или Google Authenticator, или другого генератора OTP). Вы можете настроить двухфакторную аутенфтикацию для входа на рабочие станции Windows, или для удаленного RDP доступа к хостам RDS на Windows Server.
Установка и настройка MultiOTP в домене Active Directory
В этом разделе мы покажем, как установить MultiOTP в Windows Server 2019 и настроить синхронизацию пользователей из Active Directory.
Начнем с настройки сервера MultiOTP, который будет получать пользователей из Active Directory, генерировать уникальные QR коды для пользователей и проверять правильность второго фактора.
Создадим в Active Directory отдельную группу и добавим в нее пользователей, для которых мы будет требовать проверку второго фактора при входе в Windows. Создадим группу с помощью PowerShell:
New-ADGroup 2FAVPNUsers -path 'OU=Groups,OU=Moscow,dc=winitpro,DC=ru' -GroupScope Global -PassThru –Verbose
Добавьте пользователей в группу:
Add-AdGroupMember -Identity 2FAVPNUsers -Members kbuldogov, user1, user2
Создайте в AD нового пользователя multiotp_srv, который будет использоваться multiotp для доступа к AD (с минимальными привилегиями).
$passwd = ConvertTo-SecureString -String "[email protected]!" -AsPlainText -Force
New-ADUser -Name "multiotp_srv" -SamAccountName "multiotp_srv" -UserPrincipalName "[email protected]" -Path "OU=ServiceAccounts,OU=Moscow,DC=winitpro,DC=ru" –AccountPassword $passwd -Enabled $true
Скачайте архив с файлами MultiOTP с сайта разработчиков https://download.multiotp.net/.
Откройте архив multiotp_5.8.2.9.zip и извлеките из него каталог windows в папку на локальном диске (C:\MultiOTP).
Откройте командную строку и перейдите в каталог с утилитой multiotp.exe:
CD C:\MultiOTP\windows
Следующими командами мы настроим MultiOTP для получения пользователей из LDAP каталога Active Directory.
multiotp -config default-request-prefix-pin=0
multiotp -config default-request-ldap-pwd=0
multiotp -config ldap-server-type=1
multiotp -config ldap-cn-identifier="sAMAccountName"
multiotp -config ldap-group-cn-identifier="sAMAccountName"
multiotp -config ldap-group-attribute="memberOf"
multiotp -config ldap-ssl=0
multiotp -config ldap-port=389
REM Адрес контроллера домена
multiotp -config ldap-domain-controllers=msk-dc03.winitpro.ru,ldap://192.168.13.10:389
multiotp -config ldap-base-dn="DC=winitpro,DC=ru"
REM Учетная запись для аутентификации multiotp в AD:
multiotp -config ldap-bind-dn="CN=multiotp_srv,OU=ServiceAccounts,OU=Moscow,DC=winitpro,DC=ru"
multiotp -config ldap-server-password="[email protected]!"
REM группа пользователей, для которых нужно включить OTP
multiotp -config ldap-in-group="2FAVPNUsers"
multiotp -config ldap-network-timeout=10
multiotp -config ldap-time-limit=30
multiotp -config ldap-activated=1
REM ключ для доступа к MultiOTP серверу
multiotp -config server-secret=secretOTP
Ранее мы создали группу 2FAVPNUsers и добавили в нее 3 пользователей. Выполните синхронизацию пользователей AD в MultiOTP.
multiotp -debug -display-log -ldap-users-sync
OG 2022-01-17 14:36:44 info LDAP Info: 3 users created, based on 3 LDAP entries (processed in 00:00:00) LOG 2022-01-17 14:36:44 debug System Info: *File created: c:\MultiOTP\windows\.\users\a.ivanov.db
В данном случае MultiOTP обнаружила трех пользователей и синхронизировала их.
multiotp -debug -display-log -ldap-users-sync
Запустите с правами администратора файл webservice_install.cmd. Это установит веб интерфейс управления MultiOTP.
Зайдите на веб-интерфейс
http://127.0.0.1:8112/
под учётной запись admin с паролем 1234 (желательно сменить при входе).
Настройка двухфакторной аутентификации MultiOTP для пользователя домена
В разделе List of users будет доступен список пользователей домена, которые были синхронизированы ранее (источник AD/LDAP).
Выберите пользователя и нажмите Print. Перед вами появится QR код пользователя, который нужно добавить в приложение-аутентфикатор.
Установите на смартфон пользователя приложение Microsoft Authenticator (или Google Authenticator) из Google Play или App Store. Запустите его и отсканируйте QR код пользователя.
В результате в приложении появится учетная запись пользователя, в которой каждые 30 секунд генерируется новый шестизначный цифровой пароль (тот самый второй фактор).
Из командной строки можно проверить, что MultiOTP позволяет аутентифицировать данного пользователя с помощью OTP:
multiotp.exe -display-log kbuldogov 719854
где
719854
– одноразовый пароль, полученный из приложения.
LOG 2022-01-17 15:13:11 notice (user kbuldogov) User OK: User kbuldogov successfully logged in with TOTP token Filter-Id += "2FAVPNUsers"
Также можно проверить корректность работы OTP из веб-интерфейса. Перейдите в раздел Check a user, введите имя пользователя и одноразовый пароль.
Установка multiOTP CredentialProvider в Windows
Следующий этап – установка multiOTP-CredentialProvider на компьютеры Windows, на которых вы хотите внедрить двухфакторную аутентификацию пользователей с помощью MultiOTP. CredentialProvider можно установить на все версии Windows 7/8/8.1/10/11 и Windows Server 2012(R2)/2016/2019/2022.
В это примере мы настроим двухфакторную аутентификацию для RDP входа пользователей на RDSH сервер на Windows Server 2019.
Скачайте и установите multiOTP CredentialProvider с GitHub https://github.com/multiOTP/multiOTPCredentialProvider/releases. На момент написания статьи эта версия
5.8.4.0
.
Запустите установку:
- Укажите IP сервера, на котором был установлен multiOTPНе забудьте открыть порт в файерволе на сервере и клиенте multiOTP. Открыть порт в Windows Firewall на сервере можно с помощью PowerShell:
New-NetFirewallRule -DisplayName "AllowMultiOTP" -Direction Inbound -Protocol TCP –LocalPort 8112 -Action Allow
- В нижнее поле укажите секретное слово из конфигурации multiOTP (
в нашем конфиге); - Выберите тип входа в Windows, для которых нужно применять аутентфикацию через OTP. В нашем примере мы ограничимся 2FA только для RDP входов (OTP authentication mandatory for remote desktop only).
MultiOTP CredentialProvider хранит настройки в реестре HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}. Если нужно, вы здесь можете изменить настройки CredentialProvider без переустановки.
Перезагрузите Windows Server RDS и попробуйте через RDP подключиться к нему. Теперь после отправки имени и пароля пользователя появляется дополнительное окно one-time password. Здесь пользователь должен ввести одноразовый пароль из приложения Authenticator на своем смартфоне.
На севере MultiOTP можно включить ведение логов, это полезно при отладке:
multiotp -config debug=1
multiotp -config display-log=1
Your script is running from C:\MultiOTP\windows\ 2022-01-17 15:21:07 debug CredentialProviderRequest Info: *Value for IsCredentialProviderRequest: 1 0 SPB-SRV01 2022-01-17 15:21:07 debug Server-Client Info: *CheckUserToken server request. 0 SPB-SRV01 2022-01-17 15:21:07 notice kbuldogov User OK: User kbuldogov successfully logged in (using Credential Provider) with TOTP token 0 SPB-SRV01 2022-01-17 15:21:07 debug Server-Client Info: *Cache level is set to 1 0 SPB-SRV01 2022-01-17 15:21:07 debug Server-Client Info: *Server secret used for command CheckUserToken with error code result 0: secretOTP 0 SPB-SRV01
Не забудьте убедиться, что ваш домен синхронизирует время с тайм-серверами в интернете и время на клиентах не разбегается. Эти критично для работы OTP.
На этом настройка двухфакторной аутентификации в Windows Server с помощью MultiOTP закончена. Доступны сценарии использования MultiOTP с RADIUS сервером, для аутентификации практически любых типов клиентов через OTP. Также вы можете использовать OTP для дополнительной зашиты RDP серверов в интернете от брутфорса в дополнении к https://winitpro.ru/index.php/2019/10/02/blokirovka-rdp-atak-firewall-powershell/.
OpenOTP с бесплатной лицензией до 40 пользователей — более гибкий продукт и администрировать удобнее.
да но не всем подходит ограничение в 40 юзверей
протестировал у себя на компе, все хорошо, но при установке multiOTP CredentialProvider в конкретно Вашем примере нужно указывать пароль не [email protected]!, а secretOTP. видимо очепятались
Верно, поправил 🙂
поправьте название группы
А если на компьютер с multiOTP CredentialProvider по RDP будет заходить пользователь, который не входит в группу 2FAVPNUsers, то он совсем не сможет зайти по RDP, или он зайдет по паролю и без 2FA ?
Такой пользователь не сможет зайти, т.к. для него будет требоваться одноразовый пароль:
2022-01-19 12:31:44 warning System Error: database file C:\MultiOTP\windows\users\a.khramov.db for user a.khramov does not exist 0 SRV01
2022-01-19 12:31:44 debug Server-Client Info: *Server secret used for command ReadUserData with error code result 21: secretOTP 0
Если нужно разрешить ему вход по RDP без 2FA, нужно будет добавить его аккаунт в веб интерфесе с опцией Token type: Without2FA.
При входе по RDP у него будет появляться запрос OTP, в нем нужно просто нажать Enter (пустой пароль)
2022-01-19 12:42:15 notice a.khramov User OK: User a.khramov successfully logged in (using Credential Provider) without 2FA token 0 SPB-SRV01
Огромное спасибо, всё понятно!
И ещё один вопрос. Получается, что ни брутфорс, ни использование уязвимостей протокола RDP не позволят злоумышленнику проникнуть по RDP на сервер при использовании на сервере 2FA?
В релизе 5.9.5.0 и выше исправили проблему входа для пользователей без 2FA
https://coder.social/multiotp/multiotp/issues/147
Теперь можно сделать 2 группы, одну для пользователей с 2FA (группа «2FAVPNUsers») и ещё одну для пользователей БЕЗ 2FA (группа «without2fa»)
Команды
multiotp -config ldap-in-group="2FAVPNUsers"
— для пользователи с 2FAmultiotp -config ldap-without2fa-in-group=”without2fa”
— для пользователи без 2FAПри этом обе группы будут синхронизированы с доменом, через команду:
multiotp -debug -display-log -ldap-users-sync
Естественно в обе группы одного и того же пользователя добавлять нельзя.
И да, сервер multiotp обязательно должен знать всех пользователей, как с 2FA, так и без 2FA.
Иначе последних он просто не пустит.
Для того чтобы пользователи без 2FA, заходили на сервер сразу (без необходимости подтверждения пустого пароля OTP), в реестре multiOTPCredentialProvider надо ключ multiOTPWithout2FA поменять на 1.
для версии 5.9.5.6 multiOTPCredentialProvider это ключ:
HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}
Брутфорс да, идет мимо.
С RDP уязвимостями не все так очевидно.
Подавляющее большинство узявимостей в RDP предполагали, что на компьютере отключена NLA (Network Level Authentication) для RDP. Но она как раз включена по-умолчанию, но некоторые отключают ее. Чего делать не надо.
Если вы о выставлении наружу чистого RDP — наверно все таки не стоит. Никто не гарантирует, что в NLA не появится 0-day уязвимость.
Спасибо за полезную статью и комментарии!
У нас в прошлом году так работало человек 500. Из них нашлось человек 30, у которых сгенерированные на их устройствах коды не работали. Вот вообще никак. Брали другой телефон и там работало. А некоторые устройства нет и хоть ты тресни. Как оказалось на не рабочих устройствах было рассинхронизировано время. Несмотря на заданную автосинхронизацию, всё равно как-то умудрялись. При чём ни минуты, а какие-то секунды. Лечилось пересинхронизацией времени на телефоне
В GA есть встроенная функция коррекции времени — работает безотказно.
Сам давно хотел попробовать эту штуку, но никак руки не доходили, да и останавливало то, что не хотелось включать двухфакторную авторизацию именно на уровне сервера RD. А чтобы она работала на уровне RDGW. Смысл в том, что если человек заходит с доменного компа и в доменной (доверенной) сети, то работает SSO и 2fa не требуется, а вот если через RDGW, тогда требуется ввести и пароль и 2fa.
Такое возможно с MultiOTP?
Можно попробовать интергацию RD Gateway с multiotp, описанное в этом блоге _https://roman.gallauner.at/?p=886 (см не пробовал, но выглядит рабочим).
Это безопасность только Web Access.
На сколько я понимаю, она не может работать на попытку подключения к ресурсам через RDGW.
Подскажите есть ли что-то бесплатное для роли RDS Gateway?
https://www.rcdevs.com/docs/howtos/rdgateway/rdgateway/ до 40 пользователей бесплатно.
Попробовал установить на Windows Server 2019, но при запуске multiotp -config default-request-prefix-pin=0
выскакивает сообщение о том, что VCRUNTIME140.DLL не найдена. Достановил к имеющемуся Microsoft Visual C++ 2013 Redistributable x64 Microsoft Visual C++ 2015-2022 Redistributable x64, но ошибка не исчезает. Никто не сталкивался с таким?
Решил проблему установкой 32х битного Microsoft Visual C++ 2015-2022 Redistributable
Спасибо за статью! Интересно увидеть реализация multiotp сервера на линуксе….
интересует как поменять логитип когда запраштвает пароль…сине зеленая буква М неочень красива)))
Нужно сменить файл логотипа в папке программы C:\Program Files (x86)\multiOTP (BMP v3 128х128)
После чего откорректировать верку реестра HKEY_CLASSES_ROOT\CLSID{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}\v1_bitmap_path
В этой же ветке можно поменять текст о вводе временного пароля
Сменил файл логотипа и отредактировал реестр, однако логотип остался прежний.
Значит Вы поменяли файл, но в ветке реестра не прописали путь C:\Program Files (x86)\multiOTP\loginLogo.bmp
Если указать в реестре, картинка поменяется
Спасибо за статью! Как я понял, QR код администратор должен передать пользователю, а есть ли возможность пользователю самостоятельно получить QR?
Да, в самом простом случае администратор передает qr коды пользователям.
При желании можно все автоматизировать на powershell. по крайней мере рассылку qr на email пользователей тут можно сделать совсем простым скриптом.
Генерация png файла с qr для пользователя:
multiotp -qrcode user png_file_name.png
(only for TOTP and HOTP)Осталось только полуит email пользователя из AD и отправку файла на почту.
$MailMessage = @{
To = "[email protected]"
Bcc = "[email protected]",
From = "DC server "
Subject = "QR код для RDP"
Body = "Ваш QR Сформировано: $(Get-Date -Format g)”
Smtpserver = "smtp.winitpro.ru"
Port = 25
UseSsl = $false
BodyAsHtml = $true
Encoding = “UTF8”
Attachment = “C:\multiotp\png_file_name.png”
}
Send-MailMessage @MailMessage -Credential $cred
https://winitpro.ru/index.php/2011/03/30/otpravka-pochty-iz-powershell/
Хорошая статья,а если ли опция уменьшить время генерации времени одноразового пароля и уменьшить кол-во попыток входа(если пользователь например ввел одноразовый пароль более 3-х раз неверно он блокируется)
Все есть в документации по ссылке из статьи:
The lockout parameters can be modified using these command lines:
multiotp -config failure-delayed-time=60
multiotp -config max-block-failures=12
multiotp -config max-delayed-failures=10
При сохранении конфигурации из веб интерфейса вылезает ошибка:*** BACKUP ERROR ***»false»
В чем может быть причина?
В свете последних событий появилась потребность данная.
Но у меня по всем разным решениям всегда один и тот же вопрос который никак не затрагивается ни в документации, ни в статье этой.
-«Каким образом мобильное приложение получает одноразовый пароль?»
1. Мобильное приложение обращается напрямую по API на WEB (другое) интнерфейс MultiOTP и получает одноразовый пароль.
2. Мобильное приложение обращается на своё облачное решение по своему закрытому API, а в момент входа пользователя на RDS (другое) сервер MultiOTP так же обращается в это же «облако» что бы туда передать текущий одноразовый пароль.
Надеюсь 1-й вариант.
Но если 1-й, тогда по инструкции совершенно не ясно какие порты надо и надо ли прокидывать на внешку и как мобильное приложение получает одноразовый пароль если на внешку никак не прокинуто ничего от MultiOTP?
Пошёл гуглить «как работает OTP» и тут как всё понял!
Никакого взаимодействия. Только текущее время и общий секрет.
Все верно )
Спасибо за интересную статью. А как будет происходить авторизация пользователя с пк, где нет CredentialProvider, учётной записи, которая состоит в группе 2FAVPNUsers ? Пустит по паролю в AD без 2fa ? То есть, если так — решение не подходит в качестве защиты от pass the hash атак ?
на пк где не установлен credential provider не будет и otp, данная схема работает в режиме клиент-сервер(где клиент credential provider)
Прекрасная статья! Всё получилось как по маслу! Это же работает и в RemoteApp, проверил буквально сегодня в тестовом окружении (взял подневную виртуалку). Единственный вопрос — можно ли как-то сделать, чтобы 2FA запрашивалась, когда пользователь стучится извне? А изнутри сети — не запрашивало
Подскажите пожалуйста почему когда я захожу в веб интерфейс пишу пароль дефолтный 1234, ничего не происходит, там какой то другой пароль?
пробуй по https://
это как
Классная статья, спасибо автору. Все работает очень хорошо, но несколько раз в день приходится перезагружать службу multiOPT Web Service. Кто-то может сталкиваться с такой проблемой, может у кого есть решение данной проблемы. Спасибо
Правильно ли я понимаю, описанная в статье фича — исключительно защита внутри домена (в том числе и при использовании VPN)?
То есть для работы multiOTP CredentialProvider обязательно должен быть установлен на ПК, который имеет связь с сервером multiOTP?
Если да, то зачем это нужно внутри сети? В основном же защита идёт от внешнего фактора)
Или же всё же можно как-нибудь организовать через multiOTP второй фактор защиты, подключаясь извне по RDP с использованием шлюза удаленных рабочих столов, не устанавливая что-либо на клиентской машине?
Не совсем так.
multiOTP CredentialProvider должен быть установлен на RDP/RDS сервере, куда подключаются пользователи. На клиентской машине ничего не нужно ставить.
При использовании multiOTP вам не важно, откуда приходит клиент — изнутри сети или снаружу.
Другой вопрос в том, что врядли вы будете выставлять RDP хост напрямую в интернет. Придется делать дополнительный уровень защиты — типа vpn или rds gateway.
Сценарием скрещивания multiOTP с rds gateway я не видел (не было задачи), но вот с предварительной установкой VPN все будет работать.
Никто не сталкивался с проблемой входа на сервер сразу после установки? Уже попробовал разные версии — всё одно и то же. Открываю страницу _http://127.0.0.1:8112/ и там написано:
Login
Username: (default is admin) User NOT authenticated
Password: (default is 1234) Login
Пароль 1234 ввожу, нажимаю окей — поле затирается, входа не происходит.
попробуй открыть через https://
chrome в помощь
у меня аналогичная проблема. После ввода данных поле пароль очищается и ничего не происходит. Пробовал в IE, Chrome, Mozilla. По https также не открывается, скорее всего и не должен, т.к. при настройке OTP вроде не поднимали данный протокол, не говоря уже о сертификате.
Разобрался. По http по порту 8112 не входит. Действительно необходимо входить через https, но необходимо использовать другой порт 8113. Это описано в инсталляторе webservice_install.cmd.
Привет! А не знаете, работает ли импорт пользователей из нескольких разных доменов?
То есть в строку ldap-base-dn прописать несколько разных доменов. Ну или указать несколько таких строк, каждая со своим доменом. Ну и строки с пользователем понятное дело тоже указать для нескольких доменов. Не нашел упоминания подобного в оф документации. Есть только упоминание возможности указания нескольких серверов в ldap-domain-controllers, но это видимо просто для отказоустойчивости, но в одном домене.
MultiOTP через RADIUS, как использовать с брандмауэром Fortigate? пожалуйста, помогите что я мог бы использовать MultiOTP для Remote Access VPN с пользователей из Active Directory
Как я понял, у вас VPN терминируется на Fortigate. Задача, использовать встроенный RADIUS и MultiOTP для 2fa пользователей в AD.
У меня такого гайда просто нет. В документации видел, чьл MultiOTP поддерживате FreeRADIUS. В Fortigate что используется?
Добрый день! У меня такой же кейс, пользователи используют решение FortiClient (IPsec VPN), хотелось бы внедрить 2fа, есть ли какие либо идеи как можно реализовать?
FreeRadius имеется
Огромное спасибо за статью, очень полезно и все понятно!
Особенно радует что это открытое ПО.
тут писали насчет использования multiOTP для VPN, это возможно если на роутере (VPN сервере) есть Radius клиент и он может через него авторизовать VPN пользователей. Просто используем multiOTP как radius сервер для нашего роутера. Такая схема легко делается на роутере pfSense, но насчет других роутеров не уверен.
насколько я вижу Fortigate умеет работать как radius клиент и в настройках VPN есть авторизация через radius
https://docs.fortinet.com/document/fortiauthenticator/6.5.0/cookbook/390697/connecting-the-fortigate-to-the-radius-server
https://docs.fortinet.com/document/fortiauthenticator/6.5.0/cookbook/826101/creating-the-user-and-user-group-on-the-fortiauthenticator
С первого взгляда все должно быть очень просто в настройке, попробуйте. У меня нет Fortigate чтобы проверить.
Пропала синхронизация пользователей между Сервером MultiOTP (папка C:\MultiOTP\windows\users) и собственно машиной с авторизацией по 2FA, где установлен Credential Provider (папка C:\Program Files (x86)\multiOTP\users).
Подскажите пожалуйста, в какую сторону копать для автоматической синхронизации. А то сейчас приходится синхронизировать их методом копирования файлов *.db