Я собрал эту функцию PowerShell, чтобы в основном извлекать события из журнала NPS (в частности, запрещенные попытки аутентификации) с последней точки, в которой был запущен скрипт (переменная $ date), отсортировать IP-адрес и дату, когда была записана запись в журнале, и добавить его в массив ($ array) и экспортировать в журнал CSV.
Затем я использую тот же массив ($ array) для сортировки журналов за последний час, проверяю, существует ли 10 или более, и перемещаю все, которые соответствуют этим критериям, в новый массив ($ getip). (Вроде как установка fail2ban, но для Windows)
Все работает, за исключением того, что в конце функции есть строка, в которой я использую сортировку и подсчет записей, я считаю хорошо, но на самом деле она не удаляет записи, которые находятся через 1 час.
Может ли кто-нибудь увидеть что-нибудь, чего мне не хватает? Я ценю любую помощь.
function Get-DeniedIP {
$denied = 'C:\bin\denied.csv' #CSV log of IP's that have been linked to denied auth attempts
$whitelist = Import-Csv 'C:\bin\whitelist.csv' #Location of whitelist csv
$datepath = 'C:\bin\cache' #If it does not exist that is fine
$bannedip = 'C:\bin\banned.csv' #CSV log of IP's that have reached the max failed auth and are banned
$check = [System.IO.File]::Exists($datepath)
if ($check -like '*False*') {
(get-date).ToString() | Out-File $datepath
$date = Get-Date
}
else {
$date = Get-Content $datepath
$date = Get-Date -Date $date
}
$log = Get-EventLog -LogName Security -Message "*Network Policy Server denied*" -After $date
$array = @()
foreach ($message in $log) {
$address = ($message.message | Select-String -Pattern "Calling Station Identifier:\s*\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.Value
$address = ($address | Select-String -Pattern "\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.Value
$object = New-Object -TypeName PSObject
$object | Add-Member -Name 'IP' -MemberType Noteproperty -Value $address
$object | Add-Member -Name 'Date' -MemberType NoteProperty -Value $message.TimeWritten
$array += $object
}
$final = $array | where {$whitelist.IP -notcontains $_.IP}
if ($final -eq $null) {}
else {$final | Export-Csv $denied -Append}
$final
$DT = [DateTime]::Now.AddHours(-1)
$getip = $array | group-object -property IP | where {$_.Count -gt 10 -and
$array.Date -ge $DT} | Select -Property Name | Export-Csv $bannedip -Append
}
$DT = [DateTime]::Now.AddHours(-1)
содержит полную дату и время, я бы предложил удалить все, кроме времени, так как это может помешать сценарию сопоставить журналы на основе времени.