среда, 21 декабря 2016 г.

Ntfs Audit Log Parser

GPO
Computer Configuration -Windows Settings - Security Settings - Local Policies/Audit Policy - Audit Object Access - Success, Failure
Computer Configuration -Windows Settings - Security Settings - Advanced Audit Configuration - Object Access Audit File System - Success, Failure



В c:\windows\ делаем сжатый каталог NTFS-AUDIT. Исправляем "под себя" исключения - adminLogin и SERVERNAME$.Скрипт запускаем 1 раз в час.

# источник https://habrahabr.ru/post/150149/. переработано @2016
#Задаем период, в течении которого мы будем запускать один раз скрипт, и искать нужные нам события. Здесь период задан - 1 час. Т.е. проверяются все события за последний час.
$time =  (get-date) - (new-timespan -min 60)
$t1= get-date
$timeStart = get-date
#$BodyL - переменная для записи в лог-файл
$BodyL = "Start in " + $timeStart+"...`r`n"

#$Body - переменная, в которую записываются ВСЕ события с нужным ID. 
$Body = Get-WinEvent -FilterHashtable @{LogName="Security";ID=4663;StartTime=$Time}|
select TimeCreated, 
@{n="Файл_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "ObjectName"} | %{$_.'#text'}}},
@{n="Пользователь_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}},
@{n="AccessList_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "AccessList"} | %{$_.'#text'}}}, 
@{n="AccessMask_";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "AccessMask"} | %{$_.'#text'}}} |sort TimeCreated

#Далее в цикле проверяем содержит ли событие определенное слово (к примеру название шары, например: Secret)
foreach ($bod in $body)
{
if ($Bod.Пользователь_ -ne "adminLogin" -And $Bod.Пользователь_ -ne "SERVERNAME$")
{
$err_code = $Bod.AccessList_.trim() +"-"+ $Bod.AccessMask_.trim()
                switch ($err_code)
{
"%%4416-0x1" { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[Read Data/List Dir]"+ "`t"+$Bod.Файл_+"`r`n" }
"%%4417-0x2" { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[Write Data/Add File]"+ "`t"+$Bod.Файл_+"`r`n" }
"%%4418-0x4" { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[AppendData/AddSubdir]"+ "`t"+$Bod.Файл_+"`r`n" }
"%%4419-0x8" { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[ReadEA] "+ "`t"+$Bod.Файл_+"`r`n" }
"%%4423-0x80" { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[Read Attributes]"+ "`t"+$Bod.Файл_+"`r`n" }
"%%1537-0x10000"{ $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[Delete] "+ "`t"+$Bod.Файл_+"`r`n" }
"%%1538-0x20000"{ $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[READ_CONTROL] "+ "`t"+$Bod.Файл_+"`r`n" }
"%%4424-0x100" { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+"[Write Attributes]"+ "`t"+$Bod.Файл_+"`r`n" }
default { $BodyL=$BodyL+$Bod.TimeCreated+"`t"+$Bod.Пользователь_+"`t"+$Bod.AccessList_+"`t"+$Bod.AccessMask_+ "`t"+$Bod.Файл_+"`r`n" }
}
}
}

#Т.к. записей может быть очень много (в зависимости от активности использования общего ресурса), то лучше разбить лог #на дни. Каждый день - новый лог. Имя лога состоит из Названия AccessFile и даты: день, месяц, год.
$Day = $time.Day.tostring()
$Month = $Time.Month.tostring()
$Year = $Time.Year.tostring()
#$name = "AccessFileLog-"+$Day+"-"+$Month+"-"+$Year+".txt"
$name= $Year+"-"+$Month+"-"+$Day+"--dacl1-server2-AccessFileLog.txt"
$Outfile = "C:\Windows\NTFS-AUDIT\"+$name

$t2 = get-date
$timeFinish = get-date

$timeDelta = NEW-TIMESPAN -Start $t1 -End $t2

$BodyL=$BodyL+"Finished in "+$timeFinish+"...eplased + " +$timeDelta+".`r`n"

#Пишем нашу переменную со всеми данными за последний час в лог-файл.
$BodyL | out-file $Outfile -append