KeyWeb

Сбор событий / Экспорт Windows EVTX в SQL или как оптимизировать работу с EVTX

1111111111Rating 0.00 (0 Votes)
Проблема. Evtx медленно фильтруются, сами себе тяжелые, при необходимости сделать выборку по тем или иным событиям из достаточно "больших" evtx файлов, все попросту встает "колом". Особенно это актуально для логов аудита AD или файловой системы. Самый быстрый метод сборки / фильтрации и т.п. событий на мой взгляд можно было бы производить из БД SQL, что и  было сделано - создана БД, написан скрипт отправляющий данные в БД, автоматизирован процесс при помощи планировщика задач. Для решения задачи пришлось использовать то, что есть под рукой - сервер с MS SQL и собственно сервера с которых нудно собирать логи в БД.

Создание базы SQL

Для создания БД был использован скрипт

CREATE DATABASE EvtxCollector
COLLATE Cyrillic_General_CI_AS
GO
USE EvtxCollector
GO
/* Создаем DB */
CREATE TABLE [dbo].[WinEvents](
[Id] [int] NULL,
[LevelDisplayName] [varchar](255) NULL,
[LogName] [varchar](255) NULL,
[MachineName] [varchar](255) NULL,
[Message] [varchar](max) NULL,
[ProviderName] [varchar](255) NULL,
[RecordID] [bigint] NULL,
[TaskDisplayName] [varchar](255) NULL,
[TimeCreated] [smalldatetime] NULL
)
/* Без дубликатов */
CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-EventCombo] ON [dbo].[WinEvents]
(
[RecordID] ASC,
[MachineName] ASC,
[LogName] ASC
) WITH (IGNORE_DUP_KEY = ON)
GO

Назначаем соответсвующие разрешения на доступ к БД, далее открываем PowerShell на машине, от куда необходимо отправлять логи, пишем скрипт:

$xml = @'
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*</Select>
</Query>
</QueryList>
'@

$events = Get-WinEvent -FilterXml $xml | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated

$connectionString = "Data Source=dbServer.local;Integrated Security=SSPI;Initial Catalog=EvtxCollector;"

$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString
$bulkCopy.DestinationTableName = "WinEvents"
$dt = New-Object "System.Data.DataTable"

# build the datatable
$cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name
foreach ($col in $cols) {$null = $dt.Columns.Add($col)}

foreach ($event in $events)
{
$row = $dt.NewRow()
foreach ($col in $cols) { $row.Item($col) = $event.$col }
$dt.Rows.Add($row)
}

$bulkCopy.WriteToServer($dt)

Пробуем, смотрим в свою БД. Радуемся ))

Оптимизация экспорта за счет FilterHashtable

По факту будет произведен экспорт всех событий, что нам не особо нужно, поэтому можно сделать выборку нужных EventID используя FilterHashtable, во первых это значительно сократит скорость обработки запроса, во вторых снизит количество передаваемых данных на SQL сервер и сам размер БД, куда эти данные будут складываться, поэтому можно немного изменить условия фильтрации логов, используя следующую конструкцию:

[int32[]]$ID = @(4624..4634 + 4663)
$filter = @{Logname='Security';
ID=$ID}

$events = Get-WinEvent -FilterHashtable $filter | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated

где ID это диапазон логов + отдельное событие, далее немного изменено условие фильтрации запроса Get-WinEvent.

Сбор логов в одном месте с последующей отправкой

В какой то момент я уже настраивал сборщик логов с отправкой уведомлений на почту, такой сборщик назыввается Event Collector, по факту нужные мне логи я отправил на сборщик, после чего настроил отбор событий за посдение 3 часа с последующей отправкой в БД, для этих целей можно использовать обычный запрос, как например я делал это здесь или здесь, в данном случае можно использовать такой запрос:

$xml = @'
<QueryList>
<Query Id="0" Path="ForwardedEvents">
<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 11700000]]]</Select>
</Query>
</QueryList>
'@

Автоматизациия отправки evtx в БД SQL

Далее все это дело можно оптимизировать используя планировщик задач, для этих целей была создана учетная запись с минимальными привилегиями с системе, с доступом на чтение логов, с минимальными разрешениями на доступ к БД, с минимальными параметрами на запуск задачи в планировщике задач, с параметрами запуска скрипта - см. на форуме...

Работа с БД

Здесь уже можно работать столько, на сколько хватит фанатзии, например использовать различные запросы, типа:

select * from WinEvents
Where Message LIKE '%username%'
AND
MachineName LIKE '%servername%'

Или по EventID:

select * from WinEvents
Where Id LIKE 4663

Итог

Что мы имеем - скорость, гибкость, в идеале хотелось бы перевести хранение данных например в MySQL, о чем можно подумать, как будет время. В данный момент есть идея написать либо web клиента, либо Windows приложение для удобной фильтрации, отображения данных Системному Администратору с последующим экспортом например в csv...

Добавить комментарий


Обновить
Защитный код

KeyWeb

Сейчас 66 гостей и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз