Настройка двухфакторной аутентификации (2FA) в Windows с помощью MultiOTP.

В этой статье будет показано, как внедрить двухфакторную аутентификацию пользователей в домене 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 — ему не нужен доступ в интернет, и можно использовать для внедрения двухфакторной аутентификации пользователей в изолированных сетях. Большинство аналогов платные или требуют прямого доступа к интернету.

Установка и настройка MultiOTP в домене Active Directory.

В этом разделе будет продемонстрировано, как установить MultiOTP в Windows Server 2019 и настроить синхронизацию пользователей из Active Directory.

Также вы можете развернуть MultiOTP с помощью готового образа OVA для VMware, виртуальной машины Hyper-V или Docker контейнера.
Начнем с настройки сервера 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 "P@ssw0rd!" -AsPlainText -Force
New-ADUser -Name "multiotp_srv" -SamAccountName "multiotp_srv" -UserPrincipalName "multiotp_srv@contoso.com" -Path "OU=ServiceAccounts,OU=Moscow,DC=mydomain,DC=com" –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.mydomain.com,ldap://192.168.13.10:389
multiotp -config ldap-base-dn="DC=mydomain,DC=com"
REM Учетная запись для аутентификации multiotp в AD:
multiotp -config ldap-bind-dn="CN=multiotp_srv,OU=ServiceAccounts,OU=Moscow,DC=mydomain,DC=com"
multiotp -config ldap-server-password="P@ssw0rd!"
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

Более подробное описание всех опций есть в документе https://download.multiotp.net/readme_5.8.2.9.txt в секции “HOW TO CONFIGURE MULTIOTP TO SYNCHRONIZED THE USERS FROM AN ACTIVE DIRECTORY”.

Ранее мы создали группу 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 обнаружила трех пользователей и синхронизировала их.


Для регулярной синхронизации новых учетных записей в Active Directory, нужно создать задание планировщика с командой:

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 my-login 719854
где 719854 – одноразовый пароль, полученный из приложения.

LOG 2022-01-17 15:13:11 notice (user xxx) User OK: User xxx 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).

Можно включить использование OTP аутенфтикации как для RDP так и для локальных входов.
MultiOTP CredentialProvider хранит настройки в реестре HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}. Если нужно, вы здесь можете изменить настройки CredentialProvider без переустановки.

Перезагрузите Windows Server RDS и попробуйте через RDP подключиться к нему. Теперь после отправки имени и пароля пользователя появляется дополнительное окно one-time password. Здесь пользователь должен ввести одноразовый пароль из приложения Authenticator на своем смартфоне.

Если на RDS хосте отключен NLA для RDP, пользователь просто увидит три поля для ввода (имя учетной записи, пароль и OTP).

На севере 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.

В любом случае перед массовым внедрением 2FA на базе MultiOTP в вашей сети рекомендуем в течении пары недель протестировать все режимы работы и нештатные ситуации (недоступность сервера MultiOTP, DC, ошибки в CredentialProvider и т.д.). Если возникли существенные проблемы со входом через MultiOTP, вы можете удалить CredentialProvider в безопасном режиме.
На этом настройка двухфакторной аутентификации в Windows Server с помощью MultiOTP закончена. Доступны сценарии использования MultiOTP с RADIUS сервером, для аутентификации практически любых типов клиентов через OTP. Также вы можете использовать OTP для дополнительной зашиты RDP серверов в интернете от брутфорса в дополнении к https://pc103help.blogspot.com/2020/07/nastrojka-rdp-zashhita-ot-perebora-parolej.html

По теме:

Важно знать.

Что будет, если на компьютер с multiOTP CredentialProvider по RDP будет заходить пользователь, который не входит в группу 2FAVPNUsers?

Такой пользователь не сможет зайти, т.к. для него будет требоваться одноразовый пароль:

2022-01-19 12:31:44 warning System Error: database file C:\MultiOTP\windows\users\xxx.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 user_xxx User OK: User ххх successfully logged in (using Credential Provider) without 2FA token 0 SPB-SRV01

Отправить комментарий

Новые Старые