Двухфакторная аутентификация для входа в Windows (Winlogon)
Описание
Simple2FA Credential Provider добавляет второй фактор к штатному входу в Windows по паролю. Провайдер работает как обёртка над системным парольным провайдером: пользователь вводит пароль как обычно, после чего подтверждает вход вторым фактором.
При входе в систему второй фактор запрашивается всегда. Для разблокировки экрана, входа по RDP и повышения прав (UAC) он включается отдельными параметрами. Если у пользователя второй фактор ещё не настроен, на плитке входа выводится QR-код со ссылкой на мастер настройки.
Пароль Windows проверяется локально на рабочей станции и на сервер Simple2FA не передаётся.
Схема работы:
- Пользователь выбирает свою учётную запись на экране входа (или вводит имя на плитке «Другой пользователь») и вводит пароль Windows.
- Провайдер проверяет пароль локально. При неверном пароле вход отклоняется сразу — запрос второго фактора не отправляется.
- Провайдер запрашивает у сервера Simple2FA способы подтверждения пользователя. Если их несколько, на плитке появляется список «Способ подтверждения входа».
- Пользователь подтверждает вход: подтверждением на устройстве либо вводом одноразового кода в поле на плитке и повторным нажатием «Вход».
- После успешной проверки обоих факторов пароль передаётся системе, и Windows завершает вход.
Если пароль нельзя проверить заранее
Локальная проверка отклоняет вход только при заведомо неверных учётных данных: неверный пароль, отключённая, заблокированная или просроченная учётная запись, запрет входа по времени или по имени рабочей станции. Если пароль не удалось проверить по другой причине — например, недоступен контроллер домена, — провайдер выполняет безопасный откат: запрашивает второй фактор, а пароль проверяется системой уже после него. Предварительную проверку можно отключить параметром VerifyPasswordFirst.
Требования
- Windows 10 версии 1809 и новее, Windows 11, Windows Server 2019 и 2022;
- архитектура пакета установки должна совпадать с архитектурой рабочих станций — x64 или ARM64. Для парка из разных архитектур используйте два пакета: библиотека другой архитектуры не установится;
- права администратора на рабочей станции;
- сетевой доступ рабочих станций к серверу Simple2FA по HTTPS;
- сертификат сервера Simple2FA должен быть доверенным в хранилище компьютера. Если используется собственный удостоверяющий центр, заранее распространите его корневой сертификат в Локальный компьютер → Доверенные корневые центры сертификации: иначе соединение не установится и провайдер отработает по правилу
OfflineMode.
Дополнительные среды выполнения (VC++ Redistributable и т.п.) на целевых машинах не требуются.
Работа через прокси
Провайдер обращается к серверу до входа пользователя, от имени системы, поэтому использует не пользовательские настройки прокси, а машинные настройки WinHTTP. Если доступ к серверу Simple2FA возможен только через прокси, задайте его на рабочих станциях командой netsh winhttp set proxy <адрес:порт>.
Подготовка в Simple2FA
Войдите в панель администратора локального инстанса, перейдите в раздел «Настройка ресурсов» и создайте новый ресурс:
| Поле | Значение |
|---|---|
| Название | Вход в Windows (или любое удобное) |
| Протокол | HTTP |
| API Key | Ключ ресурса, который будет указан в настройках провайдера на рабочих станциях. Создаётся автоматически |
| Проверять первый фактор | Выключить — пароль Windows проверяется локально на рабочей станции и в Simple2FA не передаётся |
В глобальных настройках убедитесь, что указан корректный API-ключ организации для связи локального инстанса с облаком.
Настройка пакета установки
Пакет установки содержит папку installer со скриптами, файлом настроек, библиотекой провайдера и шаблонами для групповых политик. Перед установкой заполните файл настроек installer\install.settings.psd1:
@{
BackendBaseUrl = 'https://2fa.corp.example' # URL сервера Simple2FA, без / в конце
ApiKey = 'REPLACE_WITH_RESOURCE_API_KEY'
OfflineMode = 'open' # open: вход по паролю при недоступном сервере; closed: запрет
EnforcementMode = 'enforce' # enforce | permissive | monitor — что делать при сбое второго фактора
EnrollPolicy = 'block' # block: QR и запрет входа; grace: QR и разрешение входа
UiLanguage = 'ru' # ru | en
HideOtherProviders = $true # скрыть пароль/PIN/Hello/биометрию; требует перезагрузки
VerifyPasswordFirst = $true # проверять пароль Windows до второго фактора
RequireOnUnlock = $true # второй фактор при разблокировке
RequireOnRdp = $true # второй фактор при входе по RDP
UacMode = $false # второй фактор при повышении прав (UAC)
EmergencyLogins = '' # аварийный вход: только пароль Windows, без обращения к серверу
HttpTimeoutMs = 35000 # ожидание подтверждения, не меньше 32000
InstallDir = 'C:\Program Files\Orbsoft\Simple2FA'
SourceDll = '' # пусто: библиотека ищется автоматически
LogFile = '' # пусто: журнал установки не ведётся
}
| Параметр | По умолчанию | Назначение |
|---|---|---|
BackendBaseUrl |
— | Адрес сервера Simple2FA, без / в конце |
ApiKey |
— | API Key из карточки ресурса Simple2FA |
OfflineMode |
open |
Поведение при недоступном сервере: open разрешает вход по одному паролю, closed запрещает вход |
EnforcementMode |
enforce |
Поведение при сбое второго фактора после верного пароля, см. «Режимы применения» |
EnrollPolicy |
block |
Поведение для пользователей без настроенного второго фактора: block показывает QR-код и блокирует вход, grace показывает QR-код и разрешает вход |
UiLanguage |
ru |
Язык интерфейса на экране входа: ru или en |
HideOtherProviders |
$true |
Скрывает остальные способы входа (PIN, Windows Hello, биометрию, отдельную плитку пароля), закрывая обход второго фактора через «Параметры входа». Вступает в силу после перезагрузки |
VerifyPasswordFirst |
$true |
Проверять пароль Windows до запроса второго фактора |
RequireOnUnlock |
$true |
Требовать второй фактор при разблокировке экрана |
RequireOnRdp |
$true |
Требовать второй фактор в сеансе удалённого рабочего стола — и при входе, и при разблокировке внутри сеанса |
UacMode |
$false |
Требовать второй фактор при повышении прав (UAC) |
EmergencyLogins |
— | Учётные записи аварийного входа через запятую, см. «Аварийный вход» |
HttpTimeoutMs |
35000 |
Общее время ожидания подтверждения в миллисекундах. Не задавайте меньше 32000: ожидание подтверждения на сервере длится около 31 секунды |
InstallDir |
C:\Program Files\Orbsoft\Simple2FA |
Каталог установки библиотеки |
SourceDll |
— | Путь к библиотеке провайдера, если автоматический поиск не подходит |
LogFile |
— | Путь к журналу установки |
Режимы применения
EnforcementMode определяет, что происходит, когда пароль Windows верен, а второй фактор подтвердить не удалось. Пароль обязателен в любом режиме.
| Ситуация | enforce |
permissive |
monitor |
|---|---|---|---|
| Пользователь отклонил запрос или не ответил вовремя | Отказ | Отказ | Вход |
| Ошибка на стороне сервера или в протоколе, неверный API Key | Отказ | Вход | Вход |
| Сервер недоступен | По OfflineMode |
Вход | Вход |
| Второй фактор не настроен | По EnrollPolicy |
По EnrollPolicy |
Вход |
| Пользователь неактивен, не найден в Simple2FA, нет доступа к ресурсу или лицензии | Отказ | Отказ | Отказ |
Каждый пропуск записывается в журнал приложений. permissive подходит для внедрения, когда сбой инфраструктуры Simple2FA не должен останавливать работу; monitor — для пилота, когда решения второго фактора нужно только наблюдать.
Обратите внимание на последнюю строку: даже в режиме monitor пользователь, которого нет в Simple2FA, войти не сможет. Чтобы такие пользователи входили по одному паролю, включите в глобальных настройках панели пропуск пользователей, отсутствующих в системе.
Аварийный вход
EmergencyLogins — список учётных записей, для которых второй фактор не запрашивается и сервер Simple2FA не вызывается вовсе. Пароль Windows по-прежнему обязателен. Вход такой записи попадает в журнал приложений с пометкой Emergency login bypass.
EmergencyLogins = 'CORP\admin-break-glass, localadmin'
Запись сравнивается по имени учётной записи: localadmin в списке подойдёт и для .\localadmin, и для CORP\localadmin. Чтобы ограничить запись доменом, укажите её полностью — CORP\localadmin. На доменной машине локальную учётную запись на плитке «Другой пользователь» вводят с указанием домена — .\localadmin, иначе имя будет дополнено доменом рабочей станции.
Заведите такую запись до включения HideOtherProviders: она остаётся единственным способом войти на машину, если сервер Simple2FA недоступен при OfflineMode = 'closed' или у администратора нет настроенного второго фактора. Держите список минимальным — это обход второго фактора, и он действует на всех машинах с этой конфигурацией.
Установка на одну машину
Запустите установку с автоматическим повышением прав (запрос UAC появится сам):
powershell -ExecutionPolicy Bypass -File .\installer\run_install.ps1
Параметры берутся из файла настроек. В командной строке run_install.ps1 можно переопределить BackendBaseUrl, ApiKey, SettingsFile, SourceDll, OfflineMode, EnforcementMode, EnrollPolicy, UiLanguage, HideOtherProviders и EmergencyLogins:
powershell -ExecutionPolicy Bypass -File .\installer\run_install.ps1 `
-BackendBaseUrl https://2fa.corp.local -ApiKey "<Resource.api_key>"
Остальные параметры задаются в файле настроек либо при прямом запуске install.ps1 из окна администратора.
Журнал последней установки сохраняется в installer\install-last.log.
После установки с HideOtherProviders требуется перезагрузка.
Установщик идемпотентен: он сравнивает установленную библиотеку и все параметры конфигурации с файлом настроек и завершается без изменений, если всё уже применено. Изменённый параметр применяется при следующем запуске — ключ -Force для этого не нужен. Он пригодится, только чтобы переустановить провайдер при совпадающих настройках, например при повреждённой регистрации:
powershell -ExecutionPolicy Bypass -File .\installer\run_install.ps1 -Force
Сначала проверьте на тестовой машине
Перед развёртыванием на парк машин проверьте установку на снимке виртуальной машины: некорректно настроенный провайдер входа может заблокировать доступ к системе. Подключение по RDP с включённой проверкой подлинности на уровне сети (NLA) остаётся рабочим: пароль в нём проверяется до создания сеанса, и экран входа рабочей станции в этом не участвует.
Развёртывание через групповые политики
Провайдер устанавливается на парк машин startup-скриптом групповой политики:
- Скопируйте папку
installerиз пакета установки в каталог политики в SysVol. - Заполните
install.settings.psd1. - В редакторе GPO откройте Computer Configuration → Policies → Windows Settings → Scripts (Startup/Shutdown) → Startup → PowerShell Scripts → Add и укажите
install.ps1. Параметры не требуются — они берутся из файла настроек. - Примените политику и перезагрузите машины.
Благодаря идемпотентности установщика скрипт можно оставить выполняться при каждой загрузке: изменения в install.settings.psd1 и новая версия библиотеки применяются на машинах при следующей перезагрузке сами.
В составе пакета также поставляются шаблоны ADMX/ADML для управления параметрами через редактор групповых политик — они покрывают все параметры конфигурации и записывают их в тот же ключ реестра, что и установщик.
Файл настроек и шаблоны ADMX не совмещаются
Startup-скрипт при каждой загрузке сверяет значения в реестре с файлом настроек и перезаписывает их при расхождении. Если параметры заданы через ADMX и отличаются от install.settings.psd1, они будут возвращаться к значениям файла после каждой перезагрузки. Выберите один источник: либо файл настроек, либо ADMX с одинаковыми значениями в обоих местах. Скрытие остальных способов входа шаблоном ADMX не включается: HideOtherProviders в нём — только признак, сами ключи политики записывает установщик.
Параметры в реестре
Установщик записывает конфигурацию в HKLM\SOFTWARE\Orbsoft\Simple2FA\Logon. Имена значений совпадают с параметрами файла настроек: строковые — BackendBaseUrl, ApiKey, OfflineMode, EnforcementMode, EnrollPolicy, UiLanguage, EmergencyLogins; числовые (DWORD) — HttpTimeoutMs, RequireOnUnlock, RequireOnRdp, UacMode, VerifyPasswordFirst, HideOtherProviders. Провайдер читает их при каждом показе экрана входа, перезагрузка после правки не нужна.
При HideOtherProviders установщик дополнительно записывает политику входа: ExcludedCredentialProviders с идентификаторами парольного провайдера, PIN, Windows Hello и смарт-карт, DefaultCredentialProvider с идентификатором Simple2FA и запрет входа по PIN и биометрии. Эти ключи вступают в силу после перезагрузки. Если они управляются доменной политикой и недоступны для записи, установщик сообщит об этом, а плитки других способов входа останутся видимыми.
Проверка работы
- Заблокируйте экран или выйдите из системы,
- Выберите свою учётную запись и введите пароль Windows (первый фактор),
- Получите запрос второго фактора,
- Подтвердите второй фактор,
- После подтверждения вход в Windows будет выполнен.
Результат попытки входа доступен в панели администратора, в разделе «Попытки авторизации». Вместе с логином на сервер передаются имя рабочей станции и её IP-адреса. Попытки, отклонённые на самой рабочей станции — неверный пароль Windows, недоступность сервера, аварийный вход, — до Simple2FA не доходят и в этом разделе не отображаются; их видно в журнале приложений Windows, источник Simple2FA.
Для диагностики на рабочей станции используйте скрипт из состава пакета:
powershell -ExecutionPolicy Bypass -File .\installer\diagnose.ps1
Скрипт выводит наличие и версию библиотеки, состояние COM-регистрации и регистрации провайдера входа, текущую конфигурацию (API Key маскируется), список аварийных учётных записей, ключи политики скрытия способов входа и последние события журнала приложений от источника Simple2FA.
Безопасность
- Пароль Windows проверяется локально и на сервер Simple2FA не передаётся.
- При
VerifyPasswordFirst = $trueневерный пароль отклоняется до запроса второго фактора — запросы на подтверждение не приходят на чужие попытки входа. - Секреты в журналы не записываются.
- Режим
OfflineMode = 'closed'запрещает вход при недоступном сервере — для сценариев, где доступность второго фактора критична. HideOtherProviders = $trueзакрывает обход второго фактора через PIN, Windows Hello и биометрию.EmergencyLogins— намеренный обход второго фактора. Каждое его использование записывается в журнал приложений; список стоит проверять при аудите вместе с журналом.
Неполная конфигурация отключает второй фактор
Если в реестре рабочей станции отсутствует BackendBaseUrl или ApiKey, провайдер пропускает вход по одному паролю и записывает предупреждение в журнал приложений. Так сделано, чтобы повреждённая конфигурация не заблокировала доступ к машине, но это означает, что OfflineMode = 'closed' не защищает от удаления параметров из реестра. Ограничьте права на изменение ключа HKLM\SOFTWARE\Orbsoft\Simple2FA\Logon и контролируйте состояние установки скриптом diagnose.ps1.
Ограничения
- На плитке «Другой пользователь» имя без домена дополняется доменом рабочей станции. Для локальной учётной записи на доменной машине укажите
.\имяилиИМЯ_КОМПЬЮТЕРА\имя. - Если выбран способ с одноразовым кодом, вход выполняется в два шага: после пароля на плитке появляется поле для кода, затем нужно нажать «Вход» ещё раз. Остальные способы подтверждаются на устройстве после ввода пароля.
- Смена пароля на экране входа выполняется без второго фактора.
Удаление
powershell -ExecutionPolicy Bypass -File .\installer\uninstall.ps1
Скрипт снимает регистрацию провайдера, откатывает политику скрытия способов входа по фактическому состоянию ключей, удаляет библиотеку вместе с каталогом установки, источник журнала приложений и ключ конфигурации HKLM\SOFTWARE\Orbsoft\Simple2FA. Чтобы сохранить конфигурацию в реестре, запустите скрипт с ключом -KeepConfig. После удаления рекомендуется перезагрузка.