Защита от подбора паролей

Смотрим кто и под каким логином пытался авторизоваться

директива AddHours(-24) указывает количество анализируемых часов

$result = Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625; StartTime=(get-date).AddHours(-24)} | ForEach-Object {
$eventXml = ([xml]$_.ToXml()).Event
[PsCustomObject]@{
UserName = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
IpAddress = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
EventDate = [DateTime]$eventXml.System.TimeCreated.SystemTime
}
}
$result
Блокируем подборщиков паролей

Ниже приведен скрипт напрочь блокирующий ip-адрес с которого пытались подключиться!

# количество неудачных попыток входа с одного IP адреса, при достижении которого нужно заблокировать IP
$badAttempts = 5
# Просмотр лога за последние 1 час
$intervalHours = 1
# Если в блокирующем правиле более 100 уникальных IP адресов, создать новое правило Windows Firewall
$ruleMaxEntries = 100
# файл с логом работы PowerShell скрипта
$log = "c:\ps\fail2ban-badlogons.txt"
# Список доверенных IP адресов, которые нельзя блокировать
$trustedIPs = @("192.168.0.1", "192.168.1.100", "192.168.2.5")
#Пишем в телегу
$token = "Токен:Телеграм-Бота"
$chat_id = "id-чата"
$mestext = "%E2%9B%94 Заблокирован брутфорсер на хосте -имя хоста- c ip "

$badlogons = Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625; StartTime=([DateTime]::Now.AddHours(-$intervalHours))} | ForEach-Object {
$eventXml = ([xml]$_.ToXml()).Event
[PsCustomObject]@{IpAddress = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'}} 
$ipsArray = $badlogons | group-object -property IpAddress | where {$_.Count -gt $badAttempts} | Select -property Name
# Удалить доверенные IP адреса 
$ipsArray = $ipsArray.name | Where-Object { $trustedIPs -notcontains $_ }
if ($ipsArray.Count -eq 0) { return }
[System.Collections.ArrayList]$ips = @()
[System.Collections.ArrayList]$current_ip_lists = @()
$ips.AddRange([string[]]$ipsArray)
$ruleCount = 1
$ruleName = "Подборщики паролей " + $ruleCount
$foundRuleWithSpace = 0
while ($foundRuleWithSpace -eq 0) {
    $firewallRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
    if ($null -eq $firewallRule) {
        New-NetFirewallRule -DisplayName $ruleName –RemoteAddress 1.1.1.1 -Direction Inbound -Action Block
        $firewallRule = Get-NetFirewallRule -DisplayName $ruleName
        $current_ip_lists.Add(@(($firewallRule | Get-NetFirewallAddressFilter).RemoteAddress))
        $foundRuleWithSpace = 1
    } else {
        $current_ip_lists.Add(@(($firewallRule | Get-NetFirewallAddressFilter).RemoteAddress))
        if ($current_ip_lists[$current_ip_lists.Count – 1].Count -le ($ruleMaxEntries – $ips.Count)) {
            $foundRuleWithSpace = 1
        } else {
            $ruleCount++
            $ruleName = "Подборщики паролей " + $ruleCount
        }
    }
}
# Удалить IP адреса, которые уже есть в правиле 
for ($i = $ips.Count – 1; $i -ge 0; $i--) {
    foreach ($current_ip_list in $current_ip_lists) {
        if ($current_ip_list -contains $ips[$i]) {
            $ips.RemoveAt($i)
            break
        }
    }
}
if ($ips.Count -eq 0) {
    exit
}

#записать в лог
$current_ip_list = $current_ip_lists[$current_ip_lists.Count – 1]
foreach ($ip in $ips) {
    $current_ip_list += $ip
    (Get-Date).ToString().PadRight(22) + ' | ' + $ip.PadRight(15) + ' | Добавлен в правило "' + $ruleName + '"' >> $log
}

#Пишем в телегу
foreach ($ip in $ips) {
    $text = $mestext + $ip.PadRight(15)
    $URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text + "&disable_notification=True"
    $Request = Invoke-WebRequest -URI ($URI)
}

# Заблокировать IP в firewall
Set-NetFirewallRule -DisplayName $ruleName -RemoteAddress $current_ip_list