Защита терминального сервера от подбора пароля

Публикация № 867206

Администрирование - Информационная безопасность - Пароли

брутфорс RDP fail2ban терминальный сервер Windows server 2008R2 powershell

12
Да, не все терминальные сервера есть возможность спрятать за ВПН. Но и смена порта подключения (стандартный 3389) тоже не решает все проблемы. Написал скрипт на PowerShell, который блокирует или не блокирует соединения.

Итак, что мы имеем:

  • терминальный сервер на Windows 2008R2
  • реальный IP адрес сервера
  • нет возможность всех клиентов заставить работать по VPN
  • события о подборе пароля в журнале безопасности.

Трудности в том, что:

  • при включенной NLA (Network Level Authentication) в логах отсутствует IP адрес источника;
  • в отличии от Windows Server 2012 r2 в журнале Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational есть только запись "Прослушиватель RDP-Tcp получил соединение" но нет IP адреса источника.

Что делаем:

Вариант 1: отключить NLA (в конфигурации сервера узла удалённых рабочих столов, с свойствах подключения убрать галоску "Разрешить подключаться только с компьютеров, на которых работает удалённый рабочий стол с проверкой подлинности на уровне сети"), после чего можно будет использовать DRPDefender - но это не наш метод.

Вариант 2: При успешном подключении (код события 4624 в журнале безопасности) выполняется запись айпишника в "белый лист". На всякий случай, чтоб его случайно не заблокировать. Так как некоторые терминальные клиенты (с MacOS и Linux) при подключенном состоянии к серверу но не работы на самом терминальном сервере (т.е. работе на локальном компьютере) пытаются переподключиться к серверу, создавая события 261 из Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational , и рискуют попасть в бан.

При создании нового события с кодом 261 из Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational  выполняем скрипт. Который берёт айпиадреса которые сейчас активны на порту нашего терминального сервера (net stat с фильтрами), сравнивает их с IP адресами с которых за последние 7дней были успешные подключения по RDP, если с адреса были успешные подключения - тогда не трогаем его (скрипт закрывается). Если за 7 дней с этого IP адреса небыло успешных подключений - тогда "берём его на карандаш" а точнее записываем его в отдельный файлик (отдельный файлик для каждого адреса). Если в файлике более 20 строк (было 20 попыток подключиться) тогда добавляем этот адрес в правило фаервола (виндового) и создаётся отдельное задание (само, автоматически) на разблокировку через 15 минут.

P.S. 1: Для блокировки нужно в виндовом фаерволе создать запрещающее правило с названием BlockAttackers

P.S. 2: Задание в шедуллере должно иметь право на чтение виндовых журналов. По идеи должно хватать роли "Читатели журнала событий".

P.S. 3: Задание в шедуллере должно иметь право на изменение правил фаервола. Запускаю от имени системы.

UPD 1:

Собрал оба скрипта в один файл. вынес ключевые параметры в переменные в начале файла

Инструкция по установке:

1. создаём правило в Брандмауере с названием "BlockAttackers":

  • действие "блокировать";
  • тип протокола - любой (ну или можно указать только порт RDP подключения, настроенный в виндовой службе);
  • область - Удалённый IP адрес - указанные IP-адреса - добавьте адрес к примеру 1.1.1.1 (вероятность подключения вашего сотрудника с такого IP близится к нулю);
  • профиль безопасности - все.

 

2. создаём задание в виндовом шедуллере, выполнять от имени "система" к примеру, при возникновении события с кодом 261 в журнале Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational выполняем действие "запуск программы" powershell.exe с аргументом

C:\Windows\system32\Fail2Ban.ps1 ban

3. создаём задание в виндовом шедуллере, выполнять от имени "система" к примеру, при возникновении события с кодом 4624 в журнале "безопасность" источник "Microsoft Windows security auditing."  выполняем действие "запуск программы" powershell.exe с аргументом

C:\Windows\system32\Fail2Ban.ps1 addgoodip

4. создаём задание в виндовом шедуллере, выполнять от имени "система" к примеру, по расписанию в полночь (или около того) выполняем действие "запуск программы" powershell.exe с аргументом

c:\Windows\System32\Fail2Ban.ps1 midnite

 

По итогу в папке Temp создаются файлики с айпишниками успешных и неуспешных подключений.

 

UPD 2

- Добавил ключ устаонвки

- Подправил некоторые моменты относящиеся к описанию внутри кода.

 

UPD 3

- опитимизирован процесс установки в зависимости от версии ОС.

12

Скачать файлы

Наименование Файл Версия Размер
Защита терминального сервера от подбора пароля:
.ps1 14,07Kb
09.09.19
0
.ps1 5.2 14,07Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. lmnlmn 53 06.09.19 13:19 Сейчас в теме
Это, конечно, лучше чем просто светить портом RDP во всея интернет, но все же как-то страшновато мне.
2. Jokemas 130 06.09.19 14:40 Сейчас в теме
Проблему с защитой особо не решит. Даже не могу представить, в каких случаях нельзя VPN поднять. На крайняк у 1Сного сервера ставится какой нибудь микротик, там создаются VPN пользователи и тоннель, а люди со стандартного. виндового VPN цепляются уже к микротику, который уже отдает трафик серверу. Либо поднимается OpenVPN за 15 минут. Т.е. проблемы как таковой-то и нет. Цена вопроса не большая, даже очень маленькая конторка может выбрать просто подешевле устройство и все. Зачем скриптом решать в этом случае? Это реальный костыль, но за старания поставил плюс. Единственное - не надо пытаться все продать. Я свои PS скрипты прикрепляю, но весь листинг кидаю под спойлер, чтобы люди могли брать, если надо. Никому не навязываю, но все же PS скрипт не бог весть что, чтобы эту мелочь продавать. Да и эти PS скрипты больше нужны сис.админам, чем 1Сникам, а сис.админы редко имеют старт.мани =)).

З.Ы. Все в коммерсов заделались =))). Идея интересная, при желании по описанию можно свой скрипт написать ))
3. KiborG85 21 06.09.19 16:09 Сейчас в теме
(2) На панацею не претендую, но как идея (хотя бы отправная точка) - вполне себе так да.
VPN - поверьте, не всегда есть возможность. К примеру, если это какой-то демонстрационный сервер, доступ к которому должен быть наименее трудозатратный. Чтоб любой бухгалтер мог подключиться без настроек RDG и тем более VPN любого рода (некоторые при попытке подключиться такую дичь творят...)
А по поводу открытости кода - да, он открыт. Как доберусь до GitHub (в смысле зарегистрируюсь) - то можно будет там публиковать... А тут не бесплатно потому-что и себе иногда нужна местная валюта для скачивания чего-то срочно нужного.
Оставьте свое сообщение