Нейтрализация атакующего Windows RDP ботнета за десять минут

После того, как я очень четко (результативно и эффективно) разобрался у себя с botnet на Линуксе (в плане атак на bind, nginx, postfix, sshd и т.п. с помощью доработанного мною fail2ban), мне пришло в голову, что через эти шлюзы могут также идти атаки и на мои RDP серверы под Windows (2012 R2).

Для противодействия этой угрозе мне пришлось самому построить систему скриптов ES-RDP для powershell (жалкая попытка Microsoft создать некое подобие bash, которую я всей душой презираю). Хочу в этой связи четко заявить: эти скрипты в процессе написания постоянно вызывали у меня рвотные рефлексы. Я ненавижу Windows, презираю Microsoft и мне постоянно хочется совершить харакири, когда я имею дело с powershell.

Но что-то все же удержало меня от этого рокового шага. Я написал эту защиту для Windows, она действительно работает, и я должен поделиться с вами этими результатами, поскольку они имеют значение. Они — эффективны.

Моя система состоит из двух частей: рабочей (которая запускается из Task Scheduler) и системы мониторинга. Первая называется rdp-run.ps1 а вторая — stat_all.ps1. Имеется также общий файл для глобальных настроек всей этой системы ES-RDP common.ps1 (начнем с него):

PS C:\Scripts> type common.ps1
# Система защиты удаленного рабочего стола
# Extra Systems Remote Desktop Protection
# ES-RDP c Extra Systems, 2026
# УПРАВЛЯЮЩАЯ ТАБЛИЦА ПРАВИЛ (ID, Hours, Limit, Type)
# Здесь можно (но не нужно) менять только Hours и Limit.
$BanRules = @(
    [PSCustomObject]@{ ID = 140; Hours = 24; Limit = 5;  Type = "AUTH" },
    [PSCustomObject]@{ ID = 131; Hours = 24; Limit = 10; Type = "SCAN" }
)
# Конфигурация системы
# Эти параметры менять нельзя
$LogName = "Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational"
$RulePrefix = "ES_RDP_Drop_"
# Эти параметры менять можно (но не нужно)
$BanTimeDays = 7