Этот скрипт на днях сделал для server 2016 - но и на корпоративной win10 тоже проверил - работает.
Включаем аудиты входа в систему, чтобы фиксировались ошибки входа в журнале безопасности.
Добавляем входящее правило в брандмауэр, блокирующее все порты от ip например 1.1.1.1(просто чтобы создать правило), имя правилу я дал "IPBanWeBi"
Код ниже добавляем в файл с расширением .ps1
Файл скрипта я поместил в папку C:\IPBanWeBi - там же и лог будет создаваться.
Скрипт отслеживает неудачные попытки входа, 5 попыток за 2 часа.
Далее я добавил в планировщик этот скрипт с запуском каждые 2 часа.
Если у кого-то английская версия, то нужно изменить [....-match 'Тип входа:\.....] на [.....-match 'logon type:\....]
За основу взял скрипт из интернета и не много модернизировал, чтобы не дергалось правило брандмауэера при каждой проверке, а лишь когда есть новые ip для бана.
PS
После добавления кода здесь изменились символы * на *
$log = "C:\IPBanWeBi\blocked_ip.txt" # лог
$flag=0 # флаг, что найдены IP для бана и нужно обновить правило брандмауэра
$Last_n_Hours = [DateTime]::Now.AddHours(-2) # количество часов для выборки
# выдергиваем все ip с неудачным входом за последние 2 часа
$badRDPlogons = Get-EventLog -LogName 'Security' -after $Last_n_Hours -InstanceId 4625 | ?{$_.Message -match 'Тип входа:\s+(3)\s'} | Select-Object *{n='IpAddress';e={$_.ReplacementStrings[-2]} }
# Теперь оставляем из этих ip лишь те, которые встречаются чаще 5 раз
$getip = $badRDPlogons | group-object -property IpAddress | where {$_.Count -gt 5} | Select -property Name
# если объект с IP сформировался, начинаем дальнейшую обработку
if($getip -ne $null){
# сначала получаем из брандмауэера текущие забаненные IP
$current_ips = *() # создаем обязательно пустой массив
# и теперь в этот пустой массив добавляем массив Айпишников из брендмауэра
$current_ips += (Get-NetFirewallRule -DisplayName "IPBanWeBi" | Get-NetFirewallAddressFilter ).RemoteAddress
# начинаем перебор IP которые будем банить
foreach ($ip in $getip)
{
# если очередной ip уже есть в массиве который получили из брандмауэра, не будем его добавлять, иначе будут добавляться дубли
if($ip.name -in $current_ips){
(Get-Date).ToString() + ' ' + $ip.name + ' этот IP уже есть а бане брандмауэра и его не должно быть в журнале, возможно правило брандмауэра не блокирует этот ip и он по прежнему долбит ' + ($badRDPlogons | where {$_.IpAddress -eq $ip.name}).count + ' попыток за 2 часа'>> $log # запись события блокировки IP адреса в лог файл
}else{
# а если этого ip нет в списке брандмауэра, добавляем ip к текущему списку брандмауэра
$current_ips += $ip.name
(Get-Date).ToString() + ' ' + $ip.name + ' IP заблокирован за ' + ($badRDPlogons | where {$_.IpAddress -eq $ip.name}).count + ' попыток за 2 часа'>> $log # запись события блокировки IP адреса в лог файл
$flag=1 # ставим признак, что нужно обновить правило брандмауэра, что добавили новый ip в массив
}
}
# если требуется обновление правила брандмауэра
if($flag -eq 1){
# добавляем массив с ip в правило
# просто добавить один ip в правило нельзя, можно только загружать массив новый.
Set-NetFirewallRule -DisplayName "IPBanWeBi" -RemoteAddress $current_ips
}
}else{
(Get-Date).ToString() + ' Никаких плохих IP не найдено'>> $log
}
Показать