このPowerShell関数をまとめて、基本的に、スクリプトが最後に実行された時点($ date変数)からNPSログ(特に認証の試行が拒否された)からイベントをプルし、IPとログエントリが書き込まれた日付を並べ替えます。それを配列($ array)に追加し、CSVログにエクスポートします。
次に、同じ配列($ array)を使用して、過去1時間のログを並べ替え、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)
には完全な日付と時刻が含まれています。スクリプトが時刻に基づいてログを照合できなくなる可能性があるため、時刻以外のすべてを削除することをお勧めします。