Создать задание с интервалом выполнения каждые 5 минут.
Ниже переделанный скрипт для блокировки всех протоколов для указанного адреса (используется порт равный 0), если по случился перебор паролей с этого ip.
В скрипте используется несколько раз (Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name) для того, чтобы избежать конфликтной ситуации, если вдруг запустится копия скрипта или пока выполняется скрипт, руками кто-то создаст данное правило.
Import-Module "Microsoft.Powershell.Management"
Import-Module "International"
Import-Module "NetSecurity"
$start_time_event_search = (Get-Date).AddMinutes(-5)
$current_locale=(Get-WinSystemLocale).Name
$time_span=(New-TimeSpan -Start $start_time_event_search -End (get-date)).Minutes
$firewall_rule_name="BanIP"
$local_port=-1 #0 is mean all protocols, 1-65535 - block this TCP and UDP ports
$ip_address_list=@()
if ($current_locale -eq 'ru-RU') {
$match_pattern='Тип входа'
} else {
$match_pattern='Logon type'
}
$match_pattern+=':\s+(3)\s'
if ($local_port -eq -1) {
$local_port=(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\" -name PortNumber).PortNumber
if (!($?)) {
$local_port=3389 #if no value, than use default 3389 port
}
}
$bad_RDP_logons = Get-EventLog -LogName 'Security' -After $start_time_event_search -InstanceId 4625 | ? {$_.Message -match $match_pattern} | select @{n='IpAddress';e={$_.ReplacementStrings[-2]} }
$get_ip = $bad_RDP_logons | group -property IpAddress | ? {$_.Count -gt 5} | Select -property Name
if (Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name) {
foreach ($ip in (Get-NetFirewallRule -DisplayName $firewall_rule_name | Get-NetFirewallAddressFilter).RemoteAddress) {$ip_address_list+=$ip}
}
foreach ($ip in $get_ip.Name) {
foreach ($exist_ip in $ip_address_list) {
if ($exist_ip -eq $ip) {
$this_ip_exist=$true
break
}
}
if (!($this_ip_exist)) {$ip_address_list+=$ip}
$this_ip_exist=$false
$log_body='IP ' + $ip + ' заблокирован за ' + ($bad_RDP_logons | ? {$_.IpAddress -eq $ip}).Count + " попыток входа в систему за $time_span минут"
if (!(Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name)) {
if ($local_port -eq 0) {
New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound -Action Block
} else {
New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound –LocalPort $local_port -Action Block -Protocol TCP
New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound –LocalPort $local_port -Action Block -Protocol UDP
}
} else {
Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name | Set-NetFirewallRule -RemoteAddress $ip_address_list
}
Write-EventLog -LogName 'System' -Source 'System' -Message $log_body -EventId 666 -EntryType Warning
}
#(Get-NetFirewallRule -DisplayName $firewall_rule_name | Get-NetFirewallAddressFilter).RemoteAddress | sort
Ниже переделанный скрипт для блокировки всех протоколов для указанного адреса (используется порт равный 0), если по случился перебор паролей с этого ip.
В скрипте используется несколько раз (Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name) для того, чтобы избежать конфликтной ситуации, если вдруг запустится копия скрипта или пока выполняется скрипт, руками кто-то создаст данное правило.
Import-Module "Microsoft.Powershell.Management"
Import-Module "International"
Import-Module "NetSecurity"
$start_time_event_search = (Get-Date).AddMinutes(-5)
$current_locale=(Get-WinSystemLocale).Name
$time_span=(New-TimeSpan -Start $start_time_event_search -End (get-date)).Minutes
$firewall_rule_name="BanIP"
$local_port=-1 #0 is mean all protocols, 1-65535 - block this TCP and UDP ports
$ip_address_list=@()
if ($current_locale -eq 'ru-RU') {
$match_pattern='Тип входа'
} else {
$match_pattern='Logon type'
}
$match_pattern+=':\s+(3)\s'
if ($local_port -eq -1) {
$local_port=(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\" -name PortNumber).PortNumber
if (!($?)) {
$local_port=3389 #if no value, than use default 3389 port
}
}
$bad_RDP_logons = Get-EventLog -LogName 'Security' -After $start_time_event_search -InstanceId 4625 | ? {$_.Message -match $match_pattern} | select @{n='IpAddress';e={$_.ReplacementStrings[-2]} }
$get_ip = $bad_RDP_logons | group -property IpAddress | ? {$_.Count -gt 5} | Select -property Name
if (Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name) {
foreach ($ip in (Get-NetFirewallRule -DisplayName $firewall_rule_name | Get-NetFirewallAddressFilter).RemoteAddress) {$ip_address_list+=$ip}
}
foreach ($ip in $get_ip.Name) {
foreach ($exist_ip in $ip_address_list) {
if ($exist_ip -eq $ip) {
$this_ip_exist=$true
break
}
}
if (!($this_ip_exist)) {$ip_address_list+=$ip}
$this_ip_exist=$false
$log_body='IP ' + $ip + ' заблокирован за ' + ($bad_RDP_logons | ? {$_.IpAddress -eq $ip}).Count + " попыток входа в систему за $time_span минут"
if (!(Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name)) {
if ($local_port -eq 0) {
New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound -Action Block
} else {
New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound –LocalPort $local_port -Action Block -Protocol TCP
New-NetFirewallRule -DisplayName $firewall_rule_name –RemoteAddress $ip_address_list -Direction Inbound –LocalPort $local_port -Action Block -Protocol UDP
}
} else {
Get-NetFirewallRule | ? DisplayName -eq $firewall_rule_name | Set-NetFirewallRule -RemoteAddress $ip_address_list
}
Write-EventLog -LogName 'System' -Source 'System' -Message $log_body -EventId 666 -EntryType Warning
}
#(Get-NetFirewallRule -DisplayName $firewall_rule_name | Get-NetFirewallAddressFilter).RemoteAddress | sort
Комментариев нет:
Отправить комментарий