@Lokaha

Как сделать автоматический бан адресов из eventlog?

Всем доброго дня. Подскажите пожалуйста как в PS правильно выцеплять аргументы из event log виндового журнала? Заметил, что ломятся на sql сервер ко мне. выглядит вот так:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="MSSQLSERVER" /> 
  <EventID Qualifiers="49152">18456</EventID> 
  <Level>0</Level> 
  <Task>4</Task> 
  <Keywords>0x90000000000000</Keywords> 
  <TimeCreated SystemTime="2021-03-09T12:07:20.000000000Z" /> 
  <EventRecordID>5858623</EventRecordID> 
  <Channel>Application</Channel> 
  <Computer>user_or</Computer> 
  <Security /> 
  </System>
- <EventData>
  <Data>sa</Data> 
  <Data>Reason: Password did not match that for the login provided.</Data> 
  <Data>[CLIENT: 210.212.172.117]</Data> 
  <Binary>184800000E0000000800000055005300450052005F004F0052000000070000006D00610073007400650072000000</Binary> 
  </EventData>
  </Event>

По тех заданию нельзя отключать sa юзера. Хочу сделать авто бан адресов из поля client, но что-то видимо с моим скриптом не то. Подскажите куда копать? Скрипт ниже:

$Last_n_Hours = [DateTime]::Now.AddHours(-2)
$badRDPlogons = Get-EventLog -LogName 'Application' -after $Last_n_Hours -InstanceId 18456 | ?{$_.Message -match 'sa'} | Select-Object @{n='CLIENT';e={$_.ReplacementStrings[-2]} }
$getip = $badRDPlogons | group-object -property CLIENT | where {$_.Count -gt 5} | Select -property Name
$log = "C:\ps\blocked_ip.txt"
$current_ips = (Get-NetFirewallRule -DisplayName "BlockSQLBruteForce" | Get-NetFirewallAddressFilter ).RemoteAddress
foreach ($ip in $getip)
{
$current_ips += $ip.name
(Get-Date).ToString() + ' ' + $ip.name + ' IP заблокирован за ' + ($badRDPlogons | where {$_.CLIENT -eq $ip.name}).count + ' попыток за 2 часа'>> $log # запись события блокировки IP адреса в лог файл
}
Set-NetFirewallRule -DisplayName "BlockSQLBruteForce" -RemoteAddress $current_ips


буду благодарен любой помощи
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 3
vesper-bot
@vesper-bot
Любитель файрволлов
Где конкретно косяк? IP-адреса не распознаются, или ещё что? Что вообще прилетает в "message"? Что в файле, правильные ли адреса? Проверяли ли состояние $current_ips до и после обработки следующих событий? Падают ли новые события в файл логов? Копать в отладку, вообще говоря, логируете (write-host или write-output) всё и вся, собираете лог, если запускаете скрипт через task scheduler, думаете, правите синтаксис, запускаете руками, вот это всё.
Ответ написан
@BeatHazard
По вашему вопросу рекомендую использовать вместо устаревшего командлета Get-EventLog более новый его вариант Get-WinEvent, который показывает информацию в более удобном виде.
Полученные логи можно пропустить через метод конвертации XML и получить удобный доступ к распарсенному логу. Вот пример:
$Compname = "PC01" #если надо подключаться к удаленному ПК
$logs = Get-WinEvent -Computer $Compname #Далее либо -FilterXML $XMLQuery (я предпочитаю его) либо
# -FilterHashTable с условиями выборки лога) + дополнительно можно фильтрануть Where-Object
$Foreach ($Log in $Logs) {
$event = [xml]$Log.ToXml() #Конвертируем лог в XML и получаем удобный распарсенный лог
#Получаем доступ к нужным данным, в вашем случае что-то типа того:
$event.event.eventdata.data[2] #тут сами посмотрите по вашему логу к какому полю и номеру строки #обращаться и далее работаете уже с полученными данными
}

P.S. При использовании фильтра -FilterXml данные для фильтрации можно вставлять из фильтра оснастки Просмотр событий после настройки фильтра и переключении его в режим XML
$XMLQuery = @'
Сюда вставляем данные из фильтра
'@
Ответ написан
@mexxy
Системный администратор
Я уже давно юзаю cyberarms ids, бесплатно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы