Настройка 2FA для RDP без Active Directory: multiOTP за 30 минут
Содержание
2FA для RDP без домена: зачем и когда нужна

VPS, выделенный сервер в дата-центре, тестовая среда, филиал без контроллера домена — RDP открыт, а единственная защита — пароль. Брутфорс, утечки учётных данных, подбор — реальные угрозы для любого сервера с открытым RDP-портом 3389. Настройка 2FA для RDP через multiOTP Credential Provider решает эту проблему за 30 минут.
Бесплатное open source решение — без Active Directory, без облака, без внешних зависимостей. Большинство инструкций по multiOTP в рунете описывают настройку только в связке с AD. А если домена нет? Мы прошли весь путь от установки до генерации QR-кодов на standalone-сервере — и обнаружили, что ИИ-ассистенты выдумали все команды. Пришлось разбираться по официальной документации. Все команды в этой инструкции проверены и работают.
Что такое multiOTP и требования к установке
multiOTP — open source проект для двухфакторной аутентификации, сертифицированный OATH для HOTP/TOTP. Серверная часть — лицензия LGPL, Credential Provider — Apache 2.0.
multiOTP Credential Provider встраивается в экран входа Windows и добавляет поле для одноразового пароля. Ключевое преимущество: он не требует RADIUS-сервера и работает полностью локально. Это делает его идеальным решением для настройки 2FA для RDP на standalone-серверах.
- Алгоритмы: TOTP (RFC 6238), HOTP (RFC 4226), mOTP, YubiKey OTP, SMS, scratch-пароли
- Офлайн-работа: TOTP генерируется по времени и секретному ключу — интернет не нужен ни серверу, ни аутентификатору
- Standalone-режим — официально поддерживаемый сценарий
- Текущие версии: multiOTP server 5.10.2.2 (2026-04-03), Credential Provider 5.10.2.2 (2026-04-03)
- Поддержка ОС: по README Credential Provider — Windows 7/8/8.1/10/11 и Server 2012(R2)/2016/2019/2022/2025
- Разрядность: есть обе сборки, x64 и x86 (обе версии 5.10.2.2). Для Windows Server берите x64, x86 нужен только для старых 32-битных клиентских Windows
Зачем вообще нужна двухфакторная аутентификация для RDP? Порт 3389 — одна из главных целей автоматизированных атак: боты сканируют IP-диапазоны и подбирают пароли по словарям. SANS относит RDP к трём основным способам получения доступа к сетям жертв при атаках шифровальщиков — наряду с фишингом и эксплуатацией уязвимостей. Даже сложный пароль не защитит от утечки через фишинг или кейлоггер. Второй фактор (OTP на смартфоне) делает украденный пароль бесполезным.
Если ваши серверы находятся в домене, двухфакторную аутентификацию можно настроить через групповые политики Active Directory. Но для VPS, тестовых сред и серверов без домена multiOTP — самое простое и бесплатное решение.
Как работает TOTP
TOTP (Time-based One-Time Password) — алгоритм генерации одноразовых паролей, описанный в RFC 6238. Сервер и аутентификатор используют общий секретный ключ и текущее время для генерации шестизначного кода. Код меняется каждые 30 секунд. Именно поэтому синхронизация часов через NTP критически важна — расхождение более 30 секунд приводит к отклонению кодов.
Преимущество TOTP перед SMS-кодами: он работает полностью офлайн, не зависит от сотовой связи и не подвержен перехвату через SS7 или SIM-swap атаки. Для серверов без доступа в интернет это единственный практичный вариант второго фактора.
Требования к установке
- Windows Server 2012(R2) — 2025 или Windows 10/11
- Локальная учётная запись с правами администратора
- Microsoft Visual C++ Redistributable 2015-2022 — разрядность под сборку: x64 для x64-версии, x86 для x86-версии
- TOTP-аутентификатор на смартфоне (multiOTP token app, FreeOTP, Яндекс Ключ)
- Синхронизация времени (NTP) на сервере — критично для TOTP
Про Visual C++ Redistributable: для x64-сборки Credential Provider (5.9.6.1 и новее) достаточно только x64-версии. В changelog 5.9.6.1: «PHP 8.2 x64 integration (don’t need x86 MSVC++ redistribuable files anymore)». Инструкции, требующие ставить обе разрядности, устарели.
Перед установкой проверьте синхронизацию NTP — расхождение времени даже на 30 секунд приведёт к отклонению OTP-кодов:
# Проверить синхронизацию NTP
w32tm /query /status
# Принудительно синхронизировать
w32tm /resync
Установка Credential Provider и настройка 2FA для RDP
Скачать и установить Credential Provider
Скачайте MSI-пакет со страницы загрузки multiOTP — ссылки внизу страницы. Там же лежат обе сборки — x64 и x86.
В мастере установки укажите:
- Путь установки — по умолчанию
C:\Program Files\multiOTP - URL of multiOTP server(s) — оставить пустым
- No remote server, local multiOTP only — включить
- Secret shared with server(s) — оставить пустым
При выборе режима OTP доступны три варианта:
- OTP mandatory for remote desktop only (рекомендуем) — OTP запрашивается только при RDP-подключении. Локальный вход работает с обычным паролем Windows. Лучший выбор для серверов в дата-центрах и удалённых рабочих столов.
- OTP mandatory for local and remote — OTP требуется везде: и при RDP, и при локальном входе. Максимальная безопасность, но необходим физический доступ или KVM-консоль как резервный канал.
- OTP and std auth for local and remote — тестовый режим. Можно войти и с OTP, и без него. Используйте для проверки перед боевым включением 2FA для RDP.
Создание TOTP-пользователей
Все команды выполняются в cmd от администратора. Имя пользователя должно точно совпадать с именем локальной учётной записи Windows.
Рекомендуемый способ — команда -fastcreatenopin: автоматическая генерация секретного ключа правильной длины без запроса PIN-префикса. Это самый быстрый и безопасный способ настроить 2FA для RDP на новом сервере.
Для ручного создания с указанием собственного hex-ключа используйте команду: multiotp.exe -create username TOTP КЛЮЧ_HEX 6. Последний параметр — количество цифр в одноразовом пароле (стандартно 6). Про длину ключа: RFC 4226 (раздел R6) требует минимум 128 бит и рекомендует 160 (40 hex-символов = 20 байт); RFC 6238 добавляет, что длина ключа должна совпадать с длиной выхода HMAC. Более короткие ключи снижают криптостойкость — при автоматической генерации ключ создаётся правильной длины.
Про PIN-префикс: по умолчанию провайдер может требовать ввод статического PIN перед OTP-кодом. Это увеличивает безопасность, но усложняет пользователям жизнь. Для standalone-серверов обычно достаточно одного OTP без PIN. Отключить глобально: multiotp -config default-request-prefix-pin=0.
После создания пользователя сгенерируйте QR-код или URL для аутентификатора:
multiotp.exe -qrcode username c:\multiotp\username.png— QR-код в файл PNGmultiotp.exe -urllink username— URL форматаotpauth://для ручного ввода
Массовое добавление пользователей
Для одного-двух администраторов хватит ручного -fastcreatenopin. Когда учёток десятки, есть четыре рабочих подхода.
Цикл по списку имён. Самый простой путь для standalone-сервера: сложить имена в текстовый файл по одному в строке и прогнать цикл прямо в cmd — сначала создание учёток, потом выгрузка QR-кодов в отдельные файлы. Если в именах встречаются пробелы, добавьте "tokens=*" — по умолчанию for /f берёт только первое слово строки. Готовые команды — в блоке в конце раздела.
Свои секретные ключи. Команда multiotp.exe -createga username base32_seed создаёт пользователя с заранее подготовленным ключом в формате base32. Подходит, когда ключи генерируются централизованно и выдаются вместе с инструкцией.
Синхронизация из LDAP. Важный нюанс: «без Active Directory» не означает «без LDAP». В README есть отдельный раздел о синхронизации из стандартного LDAP, а не только из AD — Samba DC, OpenLDAP и FreeIPA подключаются штатно через multiotp -config ldap-activated=1 и multiotp -ldap-users-sync. Ключевые опции по README:
ldap-in-group— группы, члены которых вообще попадают в базу при синхронизации. Это фильтр импорта, а не переключатель второго фактораldap-without2fa-in-group— группа, чьи члены получают токенwithout2fa, то есть входят без OTP. Вот где живёт групповое освобождение от 2FAldap-2fa-opt-in=1— меняет логику разрешения конфликтов с opt-out на opt-in: приоритет отдаётся членству в 2FA-группе вместо членства в Without2FA. Добавлено в 5.10.2.2 именно для плавного перевода Without2FA-учёток на второй фактор
С версии 5.10.0.4 можно отключить автоматическую активацию и деактивацию пользователей при синхронизации. Саму синхронизацию нужно поставить в планировщик — сама она не повторяется.
Аппаратные токены пачкой. Если вместо смартфонов закупаются токены, база наполняется импортом: -import-csv, -import-pskc (стандарт RFC 6030), -import-yubikey, а также -import-dat, -import-xml и -import-sql для токенов SafeNet, Feitian и Authenex. В версии 5.10.2.2 доработали импорт аппаратных токенов и добавили формат «Yubico CSV».
Критический нюанс — ловушка при установке
После установки Credential Provider OTP запрашивается у всех RDP-подключений, даже если пользователь не зарегистрирован в базе multiOTP. Без OTP войти по RDP не получится! Мы столкнулись с этим на практике: пришлось подключаться через KVM-консоль виртуализации.
Решение — два варианта:
Вариант A. Создать всех пользователей до начала удалённой работы (или сразу после установки — через локальный вход): multiotp.exe -fastcreatenopin имя_пользователя
Вариант B. Исключить учётку через реестр — параметр excluded_account в формате COMPUTERNAME\username (подробности в справочнике реестра ниже).
Важное про excluded_account — группы туда не подставляются. Параметр принимает ровно одну учётную запись. Ответ разработчика в трекере: «The excluded_account feature is for recovery process, and only one account is authorized». Ни списка через запятую, ни OU параметр не принимает. В коде это обычное сравнение строки domain\username целиком, без разбора разделителей и без проверки членства в группах. По замыслу это не «ваш рабочий админ», а аварийная учётка — в README пример назван contoso\backdoor. Второй момент: ветка реестра Credential Provider читается обычными пользователями, поэтому имя аварийной учётки видно всем в системе. Дайте ей неочевидное имя и длинный пароль.
А как же группы? Групповое управление вторым фактором есть, но живёт не в реестре клиента, а на стороне сервера. Два штатных пути: токен типа without2fa каждому освобождённому пользователю (плюс ключ реестра multiOTPWithout2FA=1), либо — при наличии LDAP — группа ldap-without2fa-in-group, чьи члены получают такой токен автоматически при синхронизации. На чистом standalone без LDAP группового механизма нет — только попользовательские токены.
Страховка: убедитесь, что у вас есть физический доступ, KVM или консоль виртуализации. В режиме «remote desktop only» локальный вход работает без OTP. В крайнем случае: загрузка в Safe Mode отключает Credential Provider (стандартное поведение Windows — в безопасном режиме загружаются только штатные провайдеры). Также можно использовать файл multiOTPCredentialProvider-unregister.reg.
RemoteApp, RD Gateway и переподключение к сеансу
Схема выше закрывает обычный вход по RDP. Для опубликованных приложений RemoteApp и для переподключения к запущенной сессии есть нюансы, которые нужно учесть до внедрения.
RemoteApp. Сценарий опубликованных приложений разработчик учитывает: под него в версии 5.9.5.6 добавлен отдельный параметр реестра numlockOn — «включить NumLock во время аутентификации опубликованных приложений». Отдельной инструкции по RemoteApp проект не публикует, поэтому поведение вашей сборки проверьте на тестовом стенде до боевого включения. Учтите и то, что сама публикация RemoteApp без домена делается через реестр TSAppAllowList с параметром fDisabledAllowList=1: штатная консоль публикации RDS в рабочей группе недоступна.
Переподключение — главное ограничение. «The Credential Provider is not called during reconnection» — формулировка автора проекта. Если сеанс запущен и не заблокирован, повторное подключение проходит без OTP. Это штатное поведение NLA, а не ошибка. Для обычного RDP случай редкий. Для RemoteApp — норма: пользователь закрыл окно приложения, сеанс остался отключённым, следующий запуск считается переподключением. Второй фактор спросят один раз за жизнь сеанса.
Что с этим делать. Ограничьте время жизни отключённых сеансов и включите политику «Автоматическое переподключение»: Конфигурация компьютера → Административные шаблоны → Компоненты Windows → Службы удалённых рабочих столов → Узел сеансов удалённых рабочих столов → Подключения. Без домена настраивается локально через gpedit.msc. Цена — неудобство при обрывах связи.
Windows Server 2025 — проверьте отдельно. Известная проблема, обращение в трекере от июня 2026: обновление KB5087539 (12 мая 2026, сборка 26100.32860) ломает запрос второго фактора при переподключении и разблокировке с включённым NLA — провайдер обходится полностью. Удаление обновления возвращает нормальное поведение, отключение NLA тоже. Исправления пока нет.
RD Gateway и RDWeb. Для RDWeb в wiki проекта есть готовый раздел — «Adding 2FA with multiOTP to the Remote Desktop Web Access (RDWeb) on Windows». Для шлюза удалённых рабочих столов архитектура другая: второй фактор ставится не Credential Provider’ом, а через RADIUS.
- шлюз отдаёт аутентификацию серверу NPS по протоколу RADIUS;
- NPS пересылает запрос RADIUS-серверу multiOTP, при успешной проверке возвращается Access-Accept;
- RADIUS-сервер в комплекте проекта — FreeRADIUS, порты 1812/1813;
- инструкции по установке RADIUS под Windows и Linux — в wiki проекта;
- сам шлюз разворачивается и в рабочей группе, домен для него не обязателен.
Типовой инструкции «RD Gateway без домена» проект не даёт — схема собирается под конкретную инфраструктуру. Зато у неё есть практическое преимущество перед Credential Provider: гейт стоит на входе в шлюз и срабатывает при каждом подключении, а не один раз за сеанс. Именно так закрывается дыра с переподключением.
# ===== Шпаргалка по разделу: создание TOTP-пользователей =====
# Всё выполняется в cmd от администратора
# Перейти в каталог multiOTP
cd "C:\Program Files\multiOTP"
# Создать TOTP-пользователя (имя = имя учётки Windows)
multiotp.exe -fastcreatenopin username
# QR-код для аутентификатора
multiotp.exe -qrcode username c:\multiotp\username.png
# URL для ручного ввода в аутентификатор
multiotp.exe -urllink username
# ===== Массовое создание =====
# Имена в users.txt, по одному в строке. Запуск прямо в cmd.
# В .bat-файле удвойте знак процента: %%u вместо %u
for /f %u in (users.txt) do multiotp.exe -fastcreatenopin %u
for /f %u in (users.txt) do multiotp.exe -qrcode %u c:\multiotp\%u.png
# Проверить, что все завелись
multiotp.exe -userslist

Справочник команд, параметры реестра и решение ошибок
Параметры реестра Credential Provider
Настройки хранятся в ключе реестра HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}. Наиболее важные параметры для standalone-установки:
cpus_logon— тип входа: 0=RDP+локально, 1=только RDP, 2=только локально, 3=отключено. Суффикс: e=только multiOTP, d=все провайдерыcpus_unlock— аналогично, для разблокировки сеансаexcluded_account— учётка, исключённая из 2FA. Формат по README:domain\usernameилиcomputername\username. Только одна — параметр задуман как аварийный вход, а не как список исключенийmultiOTPWithout2FA— 1 = не запрашивать OTP у пользователей с типом without2FAmultiOTPTimeoutUnlock— таймаут (мин.) до повторного запроса OTP при разблокировкеnumlockOn— 1 = включать NumLock при аутентификации опубликованных приложений (RemoteApp)two_step_hide_otp— 1 = спрашивать OTP отдельным вторым шагом, без повторного ввода пароляlogin_text— надпись на экране входаv1_bitmap_path— путь к логотипу 128×128 px (BMP v3)
Полная документация: README Credential Provider → Technical Details.
Основные команды multiOTP CLI
multiotp -fastcreatenopin user— быстрое создание TOTP без PINmultiotp -create user TOTP key digits— создание с указанным hex-ключомmultiotp -createga user base32_seed— создание с готовым ключом в формате base32multiotp -qrcode user file.png— QR-код для аутентификатораmultiotp -urllink user— otpauth:// URL для ручного вводаmultiotp -userslist— список пользователей в базеmultiotp -user-info user— детальная информация о пользователеmultiotp -scratchlist user— генерация резервных одноразовых паролейmultiotp -unlock user— разблокировать после неудачных попытокmultiotp -delete user— удалить пользователя из базыmultiotp -ldap-users-sync— синхронизация пользователей из AD или стандартного LDAPmultiotp -import-csv file.csv— импорт аппаратных токенов пачкой (также-import-pskc,-import-yubikey)multiotp -config debug=1— включить отладку (лог:log/multiotp.log)multiotp -config default-request-prefix-pin=0— отключить PIN-префиксmultiotp -resync user token1 token2— ресинхронизация (два последовательных OTP)
Блокировка и разблокировка учёток
Значения по умолчанию по документации multiOTP: 3 неудачные попытки → временная блокировка на 300 секунд, 6 неудачных → полная блокировка. Оба порога и время блокировки настраиваются: max-block-failures, max-delayed-failures, failure-delayed-time. Блокируется аккаунт в multiOTP, а не учётная запись Windows.
Разблокировка администратором: multiotp.exe -unlock username. Саморазблокировка пользователем: ввести два последовательных OTP через пробел.
Отдельный нюанс: повторный ввод одного и того же кода к блокировке не приведёт — повтор считается один раз. Разработчик объясняет это тем, что клиенты при потере связи часто повторно шлют предыдущий успешный запрос, и это не атака. В логе такой случай виден как same token replayed.
Аутентификаторы для российских пользователей
Подойдёт любое приложение, умеющее TOTP по RFC 6238 — привязки к конкретному вендору нет. Сам проект с версии 5.10.2.1 (март 2026) предлагает в шаблоне выдачи собственное приложение — multiOTP token app для Android и iOS.
- multiOTP token app — собственное приложение проекта, бесплатное и open source. С 5.10.2.1 предлагается по умолчанию при выдаче токена
- FreeOTP — open source, минималистичный интерфейс, без привязки к экосистеме Google. Проверенный вариант, годами присутствует в рекомендациях проекта
- Яндекс Ключ — российское приложение, совместимо со стандартом TOTP. Дополнительно поддерживает вход в сервисы Яндекса
- Google Authenticator — наиболее распространённый вариант, упомянут в README проекта. Поддерживает экспорт и импорт аккаунтов между устройствами
Если нет камеры для сканирования QR-кода: команда multiotp -urllink user выдаёт otpauth:// URL, который можно скопировать и добавить в аутентификатор вручную. Альтернативный способ — сконвертировать hex-ключ в формат base32 и ввести его в приложение напрямую.
Типичные ошибки и решения
Никто не может войти по RDP после установки — пользователи не добавлены в multiOTP. Решение: войти локально (режим «remote only» это позволяет), добавить через -fastcreatenopin.
Коды не принимаются, «wrong password» — причина 1: рассинхронизация NTP (w32tm /resync). Причина 2: включён PIN-префикс (multiotp -config default-request-prefix-pin=0).
VCRUNTIME140.DLL не найдена — не установлен Visual C++ Redistributable нужной разрядности. Для x64-сборки — VC++ x64.
Credential Provider не отображается на экране входа — перезагрузите сервер. Для удаления: импортировать multiOTPCredentialProvider-unregister.reg.
Свежий RDP-клиент Windows 11 молча пропускает запрос OTP — подключение проходит NLA, а дальше показывается обычный пароль Windows без поля для кода. С клиентом из Windows 10 или из более старой сборки Windows 11 всё работает. Решение из трекера: переустановить свежий Visual C++ Redistributable — автор обращения подтвердил, что это помогло.
ИИ выдаёт неправильные команды multiOTP — multiOTP использует нестандартный CLI-синтаксис. Мы столкнулись с тем, что все команды, сгенерированные ИИ-ассистентами, оказались выдуманными. Решение: сверяться с multiotp -help и официальной wiki. Не доверять сгенерированным командам без проверки по документации.
# ===== Диагностика: что делать, если причина непонятна =====
# Включить подробный лог
multiotp.exe -config debug=1
multiotp.exe -config display-log=1
# Лог лежит здесь:
# C:\Program Files\multiOTP\log\multiotp.log
# Ключ реестра Credential Provider (параметры — в разделе выше):
# HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}

Заключение
Настройка 2FA для RDP через multiOTP Credential Provider — надёжный и бесплатный способ защитить standalone-серверы без Active Directory. Установка занимает около 30 минут, решение работает полностью офлайн и не зависит от внешних сервисов или подписок.
Ключевые моменты, которые стоит запомнить:
- NTP-синхронизация — проверьте до установки, иначе коды не будут приниматься
- Создайте TOTP-пользователей заранее — после включения режима «OTP mandatory» войти по RDP без OTP невозможно, даже если пользователь не зарегистрирован в multiOTP
- Запасной доступ — KVM, консоль виртуализации или Safe Mode должны быть доступны на случай проблем с аутентификацией
- Резервные коды — сгенерируйте scratch-пароли через
multiotp -scratchlist usernameи сохраните в надёжном месте - RemoteApp и шлюз — если пользователи работают через опубликованные приложения, помните про переподключение: второй фактор спросят один раз за жизнь сеанса
Двухфакторная аутентификация — базовый элемент защиты любого сервера с открытым RDP. С multiOTP эта настройка доступна даже на серверах без домена и без бюджета на коммерческие решения. Из смежного по защите серверов: контроль целостности файлов через AIDE и интеграция Linux с Active Directory.
Часто задаваемые вопросы (FAQ)
Ответы на частые вопросы о настройке 2FA для RDP через multiOTP на локальных учётках.
Да. Это официально поддерживаемый сценарий — «How to install a local only strong authentication on a Windows machine» в wiki multiOTP. Credential Provider работает полностью автономно с локальными учётными записями Windows.
Через реестровый параметр excluded_account — нет. Он принимает ровно одну учётную запись в формате domain\username и сравнивает её строкой целиком. Ни списка через запятую, ни группы, ни OU подставить нельзя. Групповое освобождение от второго фактора есть, но на стороне сервера multiOTP и только с LDAP: группа ldap-without2fa-in-group — её члены получают токен without2fa и входят без OTP. На чистом standalone без LDAP остаются только попользовательские токены without2fa.
Отдельной инструкции по RemoteApp проект не публикует, поэтому связку нужно проверять на тестовом стенде. Сценарий опубликованных приложений разработчик учитывает: под него есть отдельный параметр реестра numlockOn — «включить NumLock во время аутентификации опубликованных приложений».
Но главное ограничение не в этом. При переподключении к незаблокированному сеансу Credential Provider не вызывается («The Credential Provider is not called during reconnection» — формулировка автора проекта), а RemoteApp живёт именно переподключениями: пользователь закрыл окно приложения, сеанс остался отключённым, следующий запуск считается переподключением. Второй фактор спросят один раз за жизнь сеанса. Если OTP нужен при каждом подключении, ставьте гейт на RD Gateway через RADIUS, а не на Credential Provider.
Да. Серверная часть — лицензия LGPL, Credential Provider — Apache 2.0. Есть коммерческие версии multiOTP Pro и Enterprise с веб-интерфейсом и отказоустойчивостью, но open source версия полнофункциональна для standalone-установки.
Использовать резервные коды: multiotp -scratchlist username. Или пересоздать TOTP для пользователя с новым ключом через -fastcreatenopin — старый секрет будет перезаписан, после чего нужно заново отсканировать QR-код.
Нет. TOTP генерируется по времени и секретному ключу — интернет не нужен ни серверу, ни аутентификатору. Достаточно синхронизации часов через NTP. Это особенно удобно для изолированных сред и серверов без выхода в интернет.
Да. multiOTP поддерживает AD/LDAP синхронизацию. Локальная standalone-установка может переключиться на клиент-серверный режим с кэшированием. Пользователи и ключи сохраняются при миграции между режимами.



