Предисловие
На протяжение длительного времени нам приходилось многократно сталкиваться и использовать различные сервисы второго фактора аутентификации, и чем больше мы с ними работали тем больше мы понимали, что нужна более гибкая, оптимальная и удобная альтернатива, а самое главное бесплатная. Проанализировав все требования и необходимый функционал было принято решения сделать свой MFA!
Необходимо было реализовать следующий функционал:
При логине или разблокировке сессии пользователя получаем его имя, ИП если подключение по RD, тогда отправляем эту информацию на мобильный клиент, а дальше оставляем или отключаем в зависимости от нажатой кнопки.
Имплементация:
Писать несколько клиентов (мобильный, веб, десктоп) было бы довольно затратно и избыточно, поэтому выбор был сделан в пользу Телеграмм мессенджера, особенно учитывая его serverless подход у ботов. Также из-за соображений безопасности и стабильности не использовать WinAPI, а ограничиться только информацией, получаемой из команды quser, чтения EventLog и выполнения
команд msg.exe и tsdiscon.exe (получение IP из EventLog оказалось не стабильным и пришлось использовать WinAPI, но только для чтения.)
ServiceLogonMultiFactor (SLMF)
ServiceLogonMultiFactor (SLMF) — бесплатный софт с отрытым кодом, позволяющий подключить второй фактор аутентификации пользователей заходящих на компьютер как локально, так и по протоколу RDP. В качестве второго фактора используется мессенджер Telegram, путем посылки удобного сообщения с кнопками разрешить/запретить и действия в соответствии с нажатой кнопкой.
Демонстрация работы сервиса доступна по ссылке
Исходный код доступен по ссылке
Подробная документация доступна по ссылке
Обсуждение статьи доступно здесь

SLMF был написанный на С#, .Net 4.0 из-за его распространённости по умолчанию.
Сервис, по событию входа или разблокировки получает ИД сессии, далее через вызов команды quser и WinAPI имя пользователя и IP адрес, если подключение не локально.
Полученную информацию сервис посылает на Телеграм пользователя, с кнопками разрешить/ запретить, и в зависимости от прав пользователя – добавить/удалить этот ИП в список доверенных.
Если получена команда отключить или превышен заданный интервал, пользователь отключается командой tsdiscon с соответствующим сообщением в Телеграм.
За несколько секунд до отключения (параметр задается в конфиге) пользователю на экране начинает выводиться сообщение с помощью msg.exe.
Дополнительно, при наличии прав, пользователь может получить следующую информацию
- Список текущих пользователей;
- Список задач (топ 10 задач по потреблению памяти для каждого пользователя);
- Текущие настройки сервиса;
- Информацию из команды systeminfo: аптайм машины и количество свободной памяти;
- Информацию о сервисе: версия, аптайм и количество ошибок чтения Телеграм;
Так же (при наличии прав) можно выполнять команду tsdiscon.
Сценарии использования и безопасность
Самый базовый сценарий — это установка на терминальный сервер, на котором пользователи работают без прав локального администратора. В этом случае обойти второй фактор невозможно, ни остановить сервис, ни отредактировать файл конфигурации без прав администратора нельзя.
Если данный сервис используется для защиты персонального компьютера, на котором пользователь работает с правами локального администратора, то тут все сложнее. Пользователь всегда может выполнить команду net stop servicelogonmultifactor и остановить этот сервис. Как дополнительная защита возможна установка сервиса с нестандартным именем и описанием, а также запуск из нестандартного каталога. В этом случае поиск этого сервиса займет очень значительное время, а с учетом отключения сессии каждые 10-15 секунд будет практически невозможным.
Естественно, если на вашем компьютере открыт WinRM или удаленный реестр, то при наличии у злоумышленника имени и пароля никакие вторые факторы не помогут.
Не плохо данный сервис подходит для дополнительной защиты компьютера, на котором находится финансовое ПО, при логине можно посылать сообщение не только пользователю, но и другим сотрудникам, например- безопаснику или директору.
И естественно, если клиент телеграмма стоит на том-же компьютере что и сервис, то задача сильно усложняется, хотя, конечно, можно выполнить команду <имя компьютера> tsdiscon <номер сессии> и отменить авторизацию десктоп клиента.