Некоторые картинки не загружаются из РФ и РК, используйте VPN.

среда, 13 сентября 2023 г.

Powershell Fail2ban for RDP

 Да, можно использовать VPN, разрешенные списки IP адресов и прочее, но бывают случаи, когда требуется прямой доступ к машине без всего этого. Тогда встает вопрос о хотя бы защите от грубого перебора паролей? Есть некоторое количество программ, которые позволяют это сделать, но к сожалению они не являются частью ОС Windows. На просторах интернета был найден скрипт и слегка доработан, можно его использовать повесив в планировщике на событие 4625 журнала безопасность.



Также для работы нужно правило в firewall с именем BlockRDP (читай комментарии к скрипту)


# After first run you need to create firewall rule
# New-NetFirewallRule -DisplayName "BlockRDPBruteForce" –RemoteAddress 1.1.1.1 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Block
# In action task scheduler. Check name script file 
# %systemroot%\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\ps\ban_rdp_brutfors.ps1"

$log = "C:\ps\blocked_ip.txt"
$interval = 600000; #600000ms = 10min
$count_fail = 5
# фильтр событий в журнале
$XPath = "*[System[Provider[@Name=""Microsoft-Windows-Security-Auditing""]
and Task = 12544
and (band(Keywords,4503599627370496))
and (EventID=4625)
and TimeCreated[timediff(@SystemTime) >= $interval]]]";

$list_IP =@();
$Events = @();
# выбираем события
try { $Events = Get-WinEvent -Logname "security" -FilterXPath $XPath -ErrorAction Stop
}
catch [Exception] {
    if ($_.Exception -match "Не удалось найти события, соответствующие указанному условию выбора.") {
        Write-Host "Не найдены события перебора паролей за последние $($interval/60000) мин.";
        exit;
    }
}
# выбираем IP адреса
$list_IP = $Events | ForEach-Object {
([xml]$_.ToXML()).Event.EventData.Data | Where-Object {$_.Name -eq "IpAddress"} | ForEach-Object {$_."#text"}} | Where-Object {$_ -ne "-" };

$current_ips = @((Get-NetFirewallRule -DisplayName "BlockRDP" | Get-NetFirewallAddressFilter ).RemoteAddress)

foreach ($ip in $list_IP) {
    if ( $((($list_IP | where {$_ -eq $ip}).count) -gt $count_fail) -AND $(($current_ips | where {$_ -eq $ip}).count -eq 0)) {
        (Get-Date).ToString() + " " + $ip + " IP заблокирован за " +  $cnt_try + " попыток за $($interval/60000) мин.">> $log # запись события блокировки IP адреса в лог файл
        $current_ips += $ip
    }
}
$current_ips = $current_ips | gu
if ($current_ips.Length -gt 0) {
    Set-NetFirewallRule -DisplayName "BlockRDP" -RemoteAddress $current_ips
}


Комментариев нет:

Отправить комментарий