Подробный гайд по установке MultiOTP на Windows Server 2022 - Часть 2
10. Проверка установленных служб
После установки посмотрите службы:
Get-Service -Name 'MultiOTP*' |
Format-Table Name, DisplayName, Status, StartType
Типичные имена могут быть, например:
MultiOTPServerMultiOTPAdminMultiOTPRadiusMultiOTPAgentMultiOTPWeb
Установите автозапуск:
Get-Service -Name 'MultiOTP*' | ForEach-Object {
Set-Service -Name $_.Name -StartupType Automatic
}
Запустите:
Get-Service -Name 'MultiOTP*' | Start-Service
Проверьте статус:
Get-Service -Name 'MultiOTP*' | Format-List Name, Status, StartType, ServicesDependedOn
11. Настройка IIS, если используется веб-консоль
11.1. Application Pool
Откройте IIS Manager:
inetmgr
Найдите app pool MultiOTP, например MultiOTPAppPool.
Рекомендации:
| Параметр | Значение |
|---|---|
| .NET CLR Version | v4.0 для .NET Framework, No Managed Code для ASP.NET Core |
| Pipeline Mode | Integrated, если требует приложение |
| Identity | DOMAIN\svc-multiotp-app или ApplicationPoolIdentity |
| Enable 32-Bit Applications | False, если нет явной необходимости |
| Idle Time-out | 0 или увеличенное значение для постоянных сессий |
| Regular Time Interval | 1740 минут по умолчанию, можно оставить |
| Private Memory Limit | по потребности, например 0 без лимита или 2048–4096 MB |
Если используется доменная учетная запись:
- Application Pools → выберите пул → Advanced Settings.
- Process Model → Identity → Custom account.
- Укажите
DOMAIN\svc-multiotp-appи пароль. - Примените.
11.2. Права на путь сайта
Если физический путь, например:
C:\Program Files\MultiOTP\Web
Дайте права app pool identity:
$sitePath = 'C:\Program Files\MultiOTP\Web'
$identity = 'IIS APPPOOL\MultiOTPAppPool'
$acl = Get-Acl -Path $sitePath
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$identity,
'ReadAndExecute',
'ContainerInherit,ObjectInherit',
'None',
'Allow'
)
$acl.SetAccessRule($rule)
Set-Acl -Path $sitePath -AclObject $acl
Для папок логов/temp выдавайте Modify.
11.3. Привязка сертификата к сайту
В IIS Manager:
- Sites → MultiOTP → Bindings.
- Add или Edit для
https. - Type:
https. - IP address:
All Unassignedили конкретный IP. - Port:
443. - Host name:
otp.example.local. - SSL certificate: выберите нужный сертификат.
- Require Server Name Indication: включите, если используется несколько имен на одном IP.
Проверить bindings можно PowerShell:
Get-WebBinding -Name 'MultiOTP'
11.4. HTTP → HTTPS redirect
Если открыт порт 80, настройте redirect.
В web.config сайта можно добавить:
<system.webServer>
<httpRedirect enabled="true" destination="https://otp.example.local" exactDestination="true" httpResponseStatus="Permanent" />
</system.webServer>
Либо используйте URL Rewrite Module.
12. Первичная настройка MultiOTP
После установки откройте админ-консоль, например:
https://otp.example.local/admin
или другой URL по документации.
12.1. Базовые шаги
- Войдите под временным администратором.
- Немедленно смените пароль.
- Включите MFA для самих администраторов, если продукт это поддерживает.
- Активируйте лицензию.
- Укажите название организации.
- Настройте часовой пояс.
- Настройте SMTP для уведомлений.
- Настройте политику паролей.
- Настройте политику токенов:
- TOTP;
- HOTP;
- Push;
- SMS;
- Email;
- hardware tokens;
- backup codes.
- Настройте блокировки:
- количество неудачных попыток;
- duration lockout;
- уведомления админам.
12.2. Интеграция с Active Directory / LDAP
Типые параметры:
| Параметр | Пример |
|---|---|
| LDAP server | dc01.example.local |
| Port | 389 или 636 |
| Use LDAPS | Да, для продакшена |
| Base DN | DC=example,DC=local |
| Bind DN | CN=svc-multiotp-ldap,CN=Users,DC=example,DC=local |
| User object class | person, user |
| Username attribute | sAMAccountName или userPrincipalName |
| Email attribute | mail |
| Mobile attribute | mobile |
| Group filter | (&(objectClass=group)(sAMAccountName=OTP_Users)) |
Проверьте доступ к LDAP портами:
Test-NetConnection -ComputerName dc01.example.local -Port 389
Test-NetConnection -ComputerName dc01.example.local -Port 636
Для LDAPS убедитесь, что на домен-контроллере установлен корректный сертификат LDAP.
12.3. Настройка RADIUS
Если MultiOTP используется как RADIUS-сервер, Wi-Fi, NPS, сетевого оборудования:
1. Добавьте NAS-клиент:
- IP или FQDN устройства;
- shared secret;
- vendor/type, например Cisco, Juniper, Microsoft NPS, Fortinet, Palo Alto.
2. Shared secret должен быть:
- длиной минимум 32 символа;
- случайно сгенерированным;
- уникальным для каждого клиента;
- храниться в password manager.
Пример генерации секрета:
-join ((48..57) + (65..90) + (97..122) | Get-Random -Count 48 | ForEach-Object {[char]$_})
3. Настройте таймауты и повторы:
- timeout: 5–10 секунд;
- retries: 2–3.
4. Включите accounting, если нужно вести статистику сессий.
12.4. Интеграция с Windows NPS
Если схема такая:
Клиент → NPS → MultiOTP → AD
или:
Клиент → MultiOTP → NPS/AD
нужно выбрать правильную модель.
Вариант A: MultiOTP как RADIUS-сервер перед NPS
На NPS:
- Откройте NPS.
- RADIUS Clients and Servers → Remote RADIUS Servers.
- Добавьте MultiOTP:
- FQDN или IP;
- shared secret;
- порт 1812.
- Создайте Network Policy:
- условия: группа пользователей, NAS Identifier, Service Type;
- setting: Forward authentication requests to remote RADIUS server group;
- укажите группу с MultiOTP.
Вариант B: MultiOTP проксирует аутентификацию в NPS
На NPS добавьте MultiOTP как RADIUS Client:
- RADIUS Clients and Servers → New RADIUS Client.
- Friendly name:
MultiOTP. - IP address сервера MultiOTP.
- Shared secret.
- Настройте политики доступа.
Точную схему смотрите в документации MultiOTP, потому что реализация PAP/CHAP/EAP/MS-CHAPv2 может отличаться.
13. Проверка работоспособности
13.1. Проверка портов
Test-NetConnection -ComputerName otp.example.local -Port 443
Test-NetConnection -ComputerName otp.example.local -Port 80
Для RADIUS UDP обычный Test-NetConnection не очень показателен.
Используйте:
- встроенный тест MultiOTP;
- RADIUS test utility от вендора;
radclientна Linux-хосте;- packet capture в Wireshark;
- логи NPS/Wi-Fi контроллера.
Пример проверки доступности UDP-порта косвенно через firewall rules:
Get-NetFirewallRule -DisplayName 'MultiOTP RADIUS*' |
Format-Table DisplayName, Direction, Action, Enabled
13.2. Проверка веб-интерфейса
Откройте:
https://otp.example.local
Проверьте:
- сертификат без ошибок;
- страница логина доступна;
- admin console работает;
- нет ошибок 500/503;
- логи IIS не переполняются ошибками.
Логи IIS обычно здесь:
C:\inetpub\logs\LogFiles
Просмотр последних записей:
Get-ChildItem 'C:\inetpub\logs\LogFiles' -Recurse |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1 |
ForEach-Object { Get-Content $_.FullName -Tail 50 }
13.3. Проверка служебных логов
Get-WinEvent -LogName Application -MaxEvents 100 |
Where-Object { $_.ProviderName -like '*MultiOTP*' } |
Format-Table TimeCreated, Id, LevelDisplayName, Message -AutoSize -Wrap
Системные ошибки:
Get-WinEvent -LogName System -MaxEvents 100 |
Where-Object { $_.LevelDisplayName -in 'Error','Critical' } |
Format-Table TimeCreated, Id, ProviderName, Message -AutoSize -Wrap
13.4. Тестовый пользователь и токен
Создайте тестового пользователя:
- не администратор;
- с корпоративным email;
- с мобильным телефоном для TOTP/Push, если используется.
Выполните:
- Enrollment test-пользователя.
- Генерация QR-кода/seed.
- Установка в authenticator-приложение.
- Проверка синхронизации времени.
- Вход с паролем + OTP.
- Неудачная попытка с неверным кодом.
- Проверка блокировки после N неудачных попыток.
- Проверка backup code, если есть.
14. Резервное копирование
14.1. Что обязательно бэкапить
| Объект | Пример пути/объекта |
|---|---|
| База данных | SQL Server database MultiOTP |
| Конфигурация приложения | C:\Program Files\MultiOTP\config |
| Данные приложения | C:\ProgramData\MultiOTP |
| Логи/аудит | C:\Logs\MultiOTP, IIS logs |
| Сертификаты | Cert:\LocalMachine\My, PFX-файлы |
| Лицензии | license file, activation data |
| IIS config | C:\Windows\System32\inetsrv\config\applicationHost.config |
| RADIUS secrets | конфигурация MultiOTP/БД |
| Token seeds/keys | только защищенным способом, если вендор поддерживает экспорт |
Никогда не копируйте seed-файлы или ключи токенов в открытом виде без шифрования.
14.2. Резервная копия SQL Server
Пример full backup:
BACKUP DATABASE [MultiOTP]
TO DISK = N'B:\Backup\MultiOTP\MultiOTP_full.bak'
WITH COMPRESSION,
CHECKSUM,
INIT,
STATS = 5;
GO
Рекомендуемый режим:
- full backup ежедневно;
- diff backup каждые 4–12 часов;
- log backup каждые 15–60 минут, если база в Full Recovery;
- хранение минимум 7–30 дней по политике компании.
14.3. Резервное копирование файлов
Пример PowerShell:
$source = @(
'C:\Program Files\MultiOTP\config',
'C:\ProgramData\MultiOTP',
'C:\Certs\MultiOTP'
)
$destination = 'B:\Backup\MultiOTP\files'
$timestamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$zipPath = Join-Path $destination "MultiOTP_config_$timestamp.zip"
if (-not (Test-Path $destination)) {
New-Item -ItemType Directory -Path $destination -Force | Out-Null
}
Compress-Archive -Path $source -DestinationPath $zipPath -Force
15. Безопасность и hardening
15.1. Доступы
- Админ-консоль доступна только из управляющей сети.
- Отдельные роли:
- Super Admin;
- Helpdesk;
- Auditor;
- Token Operator.
- Включите MFA для администраторов MultiOTP.
- Запретите общие аккаунты администраторов.
- Логируйте все административные действия.
15.2. TLS и веб
- Только HTTPS.
- TLS 1.2 минимум.
- Отключите слабые шифры.
- Включите HSTS, если применимо:
Strict-Transport-Security: max-age=31536000; includeSubDomains
- Скройте версии IIS/.NET:
В applicationHost.config или web.config можно отключить отправку X-Powered-By.
Пример для сайта:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="X-Frame-Options" value="DENY" />
<add name="X-Content-Type-Options" value="nosniff" />
<add name="Referrer-Policy" value="no-referrer" />
</customHeaders>
</httpProtocol>
</system.webServer>
15.3. Пароли и секреты
- Shared secret RADIUS — уникальный и длинный.
- LDAP bind account — без прав администратора домена.
- SQL account — минимальные права после установки.
- Храните секреты в CyberArk, Keepass, Azure Key Vault, HashiCorp Vault или другом защищенном хранилище.
- Регулярно ротируйте:
- admin passwords;
- service account passwords;
- RADIUS secrets;
- API keys;
- сертификаты.
15.4. Антивирус и исключения
Не отключайте антивирус.
Но если производитель MultiOTP рекомендует исключения, добавьте:
- процессы службы MultiOTP;
- каталоги приложения;
- каталоги БД, если SQL локальный;
- каталоги логов;
- temp-каталоги.
Пример проверки исключений Defender:
Get-MpPreference | Select-Object -ExpandProperty ExclusionPath
Get-MpPreference | Select-Object -ExpandProperty ExclusionProcess
Добавлять исключения лучше через GPO/SCCM/Intune, а не вручную.
15.5. Аудит и мониторинг
Включите:
- Windows Audit:
- Logon/Logoff;
- Object Access;
- Detailed Process Tracking;
- Directory Service Access, если сервер в домене.
- Логи IIS.
- Логи приложения MultiOTP.
- SQL Server audit, если требуется.
- Отправка логов в SIEM:
- Splunk;
- Elastic;
- QRadar;
- ArcSight;
- Microsoft Sentinel.
Мониторьте:
- недоступность службы;
- ошибки БД;
- рост логов;
- неудачные входы;
- массовые блокировки;
- истечение сертификата;
- рассинхронизацию времени;
- аномальную генерацию токенов.
16. Обновление MultiOTP
Перед обновлением:
- Прочитайте release notes.
- Проверьте совместимость с ОС, .NET, SQL Server.
- Сделайте snapshot ВМ.
- Выполните full backup БД.
- Сохраните конфиги и сертификаты.
- Проверьте обновление на тестовом стенде.
- Назначьте maintenance window.
- Обновите один узел, если кластер.
- Проверьте функции:
- login;
- enrollment;
- RADIUS;
- LDAP;
- push/SMS/email;
- admin console.
- Подготовьте rollback:
- восстановление snapshot;
- восстановление БД;
- откат конфигурации.
17. Типовые проблемы и диагностика
17.1. Установщик не запускается
Причины:
- недостаточно прав;
- заблокирован файл из интернета;
- антивирус;
- отсутствует .NET/VC++;
- ожидается перезагрузка.
Решения:
Unblock-File -Path 'C:\Install\MultiOTP\MultiOTPSetup.exe'
Проверьте pending reboot:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name PendingFileRenameOperations -ErrorAction SilentlyContinue
Установите недостающие runtime-компоненты.
17.2. Служба MultiOTP не стартует
Проверьте:
Get-Service -Name 'MultiOTP*' | Format-List *
Смотрите System и Application logs.
Частые причины:
- неверный пароль сервисной учетной записи;
- нет прав на папку;
- недоступна БД;
- занят порт;
- отсутствует сертификат;
- поврежден конфиг.
Проверка порта:
Get-NetTCPConnection -LocalPort 443 -ErrorAction SilentlyContinue
Get-NetUDPEndpoint -LocalPort 1812 -ErrorAction SilentlyContinue
17.3. Ошибка подключения к SQL Server
Проверьте:
- имя инстанса;
- TCP/IP включен;
- порт 1433 открыт;
- SQL Browser запущен, если используется динамический порт;
- firewall;
- права логина;
- TLS/encryption settings.
Быстрая проверка:
Test-NetConnection -ComputerName sqlhost.example.local -Port 1433
Если используется SQL Authentication, убедитесь, что в SQL Server включен mixed mode.
17.4. Веб-интерфейс отдает 500 Internal Server Error
Проверьте:
- app pool запущен;
- версия .NET соответствует приложению;
- права на
web.config, логи, temp; - отсутствие дублирующихся секций в
applicationHost.config; - события в
C:\inetpub\logs\LogFiles; - Failed Request Tracing, если включен.
Полезно:
Get-WebAppPoolState -Name 'MultiOTPAppPool'
Start-WebAppPool -Name 'MultiOTPAppPool'
17.5. Ошибка сертификата в браузере
Причины:
- нет SAN;
- сертификат выпущен не для этого имени;
- цепочка доверия неполная;
- срок действия истек;
- время на сервере неверное;
- CRL/AIA недоступны.
Проверка:
Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.Subject -like '*otp*' } |
Format-List Subject, DNSNameList, Thumbprint, NotBefore, NotAfter, Issuer
17.6. RADIUS-запросы не проходят
Проверьте:
- UDP 1812 открыт;
- IP NAS-клиента совпадает;
- shared secret одинаковый на клиенте и MultiOTP;
- vendor/type корректный;
- пользователь существует в MultiOTP/AD;
- политика разрешает данный тип аутентификации;
- нет блокировки учетной записи.
Включите debug-лог RADIUS, если вендор поддерживает, и сделайте packet capture:
# Например, через netsh trace или Wireshark на интерфейсе сервера
17.7. OTP-коды не подходят
Самая частая причина — рассинхронизация времени.
Проверьте:
w32tm /query /status
Get-Date
На телефоне пользователя:
- включена автоматическая установка времени;
- корректный часовой пояс;
- authenticator-приложение синхронизировано;
- seed не был поврежден при переносе.
Для TOTP обычно допускается окно ±1 шаг, но сильное расхождение требует повторной регистрации токена.
17.8. LDAP/AD интеграция не работает
Проверьте:
- доступ к порту 389/636;
- правильность Base DN;
- учетная запись bind не заблокирована;
- у bind account есть права на чтение нужных OU;
- фильтр пользователей возвращает записи;
- атрибуты
sAMAccountName/userPrincipalNameзаполнены; - для LDAPS сертификат DC корректен.
Пример проверки LDAP-фильтра через LDP.exe:
- Запустите
ldp.exe. - Connect к DC.
- Bind под сервисной учеткой MultiOTP.
- Выполните поиск:
Base DN: DC=example,DC=local
Filter: (&(objectClass=user)(sAMAccountName=testuser))
18. Пример итогового чек-листа внедрения
До установки
- [ ] Определен FQDN:
otp.example.local. - [ ] Выделен сервер/ВМ.
- [ ] Настроен статический IP.
- [ ] Созданы DNS A/PTR.
- [ ] Настроен NTP.
- [ ] Установлены обновления Windows.
- [ ] Определена СУБД.
- [ ] Создана база
MultiOTP. - [ ] Созданы сервисные учетные записи.
- [ ] Выпущен TLS-сертификат с SAN.
- [ ] Согласованы сетевые порты.
- [ ] Подготовлен план backup.
Установка
- [ ] Скачан официальный дистрибутив.
- [ ] Проверена подпись/хеш.
- [ ] Установлены IIS/.NET/VC++.
- [ ] Установлен MultiOTP.
- [ ] Указана БД.
- [ ] Настроена сервисная учетная запись.
- [ ] Привязан сертификат.
- [ ] Службы запущены.
- [ ] Веб-интерфейс доступен.
Настройка
- [ ] Сменен пароль администратора.
- [ ] Активирована лицензия.
- [ ] Настроен SMTP.
- [ ] Подключен AD/LDAP.
- [ ] Созданы тестовые пользователи.
- [ ] Настроены политики токенов.
- [ ] Настроен RADIUS, если требуется.
- [ ] Настроены NAS-клиенты.
- [ ] Включен аудит.
- [ ] Настроены уведомления.
Проверка
- [ ] Login admin console.
- [ ] Enrollment test user.
- [ ] TOTP/HOTP/Push работает.
- [ ] Неверный код отклоняется.
- [ ] Блокировка работает.
- [ ] RADIUS test проходит.
- [ ] LDAP bind успешен.
- [ ] Логи пишутся.
- [ ] Backup БД выполнен.
- [ ] Restore test выполнен.
Продакшен
- [ ] Доступ к админке ограничен.
- [ ] TLS hardened.
- [ ] Сервисные учетки имеют минимальные права.
- [ ] Monitoring настроен.
- [ ] DR-план согласован.
- [ ] Документация обновлена.
19. Рекомендуемая документация после установки
Сохраните internally:
- Схема архитектуры.
- Список серверов и IP.
- FQDN и DNS записи.
- Версия MultiOTP и license.
- Параметры БД.
- Учетные записи служб.
- Места хранения сертификатов.
- Список RADIUS clients и shared secrets в secure storage.
- Правила firewall.
- Procedure backup/restore.
- Procedure upgrade/rollback.
- Contacts vendor support.
- Known issues и рабочиеaround.
20. Минимально правильная последовательность установки MultiOTP на Windows Server 2022:
- Подготовить сервер: обновления, DNS, NTP, firewall.
- Установить зависимости: IIS, .NET Framework / .NET Hosting Bundle, VC++.
- Создать БД и сервисные учетные записи.
- Выпустить и импортировать TLS-сертификат.
- Скачать и проверить дистрибутив MultiOTP.
- Установить MultiOTP, указав БД, учетную запись службы, веб-сайт и порты.
- Настроить IIS/app pool и привязать сертификат.
- Войти в админ-консоль, сменить пароли, активировать лицензию.
- Подключить AD/LDAP и/или RADIUS.
- Создать тестовых пользователей и проверить OTP.
- Настроить backup, аудит, мониторинг и hardening.
- Задокументировать конфигурацию и передать в эксплуатацию.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.