Модуль rdp-run нашей оригинальной системы защиты удаленного рабочего стола Windows состоит из двух файлов - основного скрипта для PowerShell rdp-run.ps1 (который и выполняет всю необходимую работу по выявлению и блокировке хакеров) и дополнительного файла rdp-run.bat (который вызывается из Windows Task Scheduler каждые 10 минут и при этом запускает на выполнение основной файл rdp-run.ps1).
Файл rdp-run.bat имеет в нашей системе такой вид:
powershell.exe -File "C:\Scripts\rdp-run.ps1"
Само собой понятно, что вы у себя должны здесь будете заменить "C:\Scripts" на тот адрес, по которому у вас расположена копия нашей системы. Главный файл этого модуля rdp-run.ps1 имеет следующий вид:
. "$PSScriptRoot\common.ps1"
# 2. ПОЛУЧЕНИЕ НАРУШИТЕЛЕЙ (Через цикл по таблице)
$RawOffenders = @()
foreach ($Rule in $BanRules) {
$StartTime = (Get-Date).AddHours(-$Rule.Hours)
$Events = Get-WinEvent -FilterHashtable @{LogName=$LogName; ID=$Rule.ID; StartTime=$StartTime} -ErrorAction SilentlyContinue
if ($Events) {
$List = $Events | ForEach-Object {
if ($_.Message -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})") {
$FoundIP = $Matches[1]
# ПРОВЕРКА ПО WHITELIST
$IsWhite = $false
foreach ($WhiteIP in $WhiteList) {
if ($FoundIP -like $WhiteIP) {
$IsWhite = $true
break
}
}
if (-not $IsWhite) {
[PSCustomObject]@{ IP = $FoundIP; Type = $Rule.Type }
}
}
} | Group-Object IP | Where-Object { $_.Count -ge $Rule.Limit }
if ($List) { $RawOffenders += $List }
}
}
# Объединяем и схлопываем дубликаты
$Offenders = $RawOffenders | Group-Object Name | ForEach-Object { $_.Group[0] }
# 3. БАН НОВЫХ ГАДОВ
if ($Offenders) {
$CurDate = Get-Date -Format "yyyy-MM-dd"
foreach ($Offender in $Offenders) {
$IP = $Offender.Name
$Type = $Offender.Group[0].Type
$FirewallPrefix = $FirewallPrefixes['short']
$TechnicalName = $FirewallPrefix + $IP.Replace('.', '_')
if (-not (Get-NetFirewallRule -Name $TechnicalName -ErrorAction SilentlyContinue)) {
$Description = "Type: $Type. Attempts: $($Offender.Count). Created: $(Get-Date)"
New-NetFirewallRule -Name $TechnicalName -DisplayName "$FirewallPrefix$CurDate`_$IP" -Direction Inbound -Action Block -RemoteAddress $IP -Description $Description | Out-Null
# --- НОВЫЙ БЛОК ДЛЯ БД ---
# Вычисляем подсеть: берем всё до последней точки и добавляем .0
$Subnet = $IP.Substring(0, $IP.LastIndexOf('.')) + ".0"
# SQL запрос сохраняет и сам IP, и его подсеть
$LogQuery = "INSERT INTO ban_log (ban_addr, ban_subnet) VALUES (INET_ATON('$IP'), INET_ATON('$Subnet'));"
# Выполняем запись
& $mysql_path --user=$mysql_user --password=$mysql_password --database=$mysql_dbName --execute="$LogQuery" 2>$null
# -------------------------
}
}
}
Как видно из этого кода, данный скрипт использует общие настройки системы из файла common.ps1, а также документирует свою деятельность в таблице ban_log (это необходимо для работы других модулей, задачей которых является вторичный бан - рецидивисты, блоки адресов и т.п.).
| © Extra Systems, 2026 |
|