Итак, что мы имеем:
- терминальный сервер на 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
- опитимизирован процесс установки в зависимости от версии ОС.