Навеяно темой на форуме: http://forum.sysfaq.ru/index.php?showtopic=13274
Итак, есть задача отслеживать события удаления объектов (файлов и/или папок) с файлового сервера. Итак, для начала необходимо настроить аудит на файловом сервере. Приведу рекомендации коллеги WindowsNT:
- Включить аудит успешных событий типа Object Access.
- Отрегулировать размер журнала и параметры перезаписи.
- В свойствах папки Shared Documents (и других папок общего доступа) включить Аудит на Успешные Everyone: Delete, Delete Subfolders and Files.
Учитывая сопутствующую проблематику удалений, что для части программ при работе нормально удалять файлы при сохранении было предложено фиксировать 5 событий удаления в секунду. Такая схема вполне сгодится для среднестатистического решения. В любом случае предложенный скрипт можно будет изменить под свои нужды вполне свободно. За основу будет взят пост из моего предыдущего блога (Аудит входов на сервере терминалов с использованием PowerShell), но с некоторыми доработками.
Итак, задача разбивается на 4 составные части:
- получение всех эвентов с кодом EventID = 560;
- из полученных эвентов получить массив с уникальным временем;
- подсчитать количество эвентов для каждого уникального времени из массива, который был получен на втором этапе;
- если кол-во эвентов больше или равно 5 (цифра может быть и немного другой), то записываем их в лог и отмечаем, как "возможно нелегальное".
Итак, давайте пробовать решить все этапы:
1) получение массива эвентов по коду 560:
$Events = Get-EventLog security | ?{$_.eventid -eq 560 -and
$_.EntryType -eq "SuccessAudit" -and
$_.message -like "*Object Name:`tD:\Shared Documents\*" -and
$_.message -like "*Accesses:`t%delete*"
}
Итак, здесь я сделал 3 фильтра: код события - 560, Тип аудита Success Audit (т.к. под кодом 560 регистрируются и неуспешные аудиты), имя корневой папки, которая нас будет интересовать (только для случаев, если настроено несколько аудитов на различных папках) и явно будем интересоваться действием $Delete. Теперь из этого массива нужно получить массив уникального времени:
$UniqueTime = $Events | select -Unique TimeGenerated | %{($_.timegenerated).datetime}
Здесь я получил массив с набором уникального времени. Отмечу, что я взял свойство DateTime, которое даст нам точность до 1 секунды. Массив мы делаем затем, чтобы потом считать сколько событий удаления зафиксировано с этим временем (отличить легальное удаление от нелегального). Теперь при помощи полученной переменной соберём кол-во эвентов удаления на момент уникального времени. Иными словами мы берём отметку времени, когда зафиксирован лог удаления файла или папки и посмотрим, сколько ещё логов было зафиксировано за эту секунду:
[object[]]$SelectedEvents = $Events | ?{($_.timegenerated).datetime -eq UniqueTime}
$SelectedEvents.count
Переменная $SelectedEvents будет содержать все эвенты удаления в течении секунды. И их количество можно посчитать свойством Count. И дальше можно проводить сравнительный анализ по кол-ву эвентов. Если их за секунду зафиксировано больше 5 (вероятность нелегального удаления файлов), то продолжаем разбирать переменную $SelectedEvents. Разбирается скрипт по той же схеме, что и в упомянутой выше статье по аудиту доступа на терминальный сервер. В итоге мы получим такой скрипт:
########################################################
# FileServerDeleteAudit.ps1
# Version 1.0
#
# Windows Server 2003 eventlog parser
#
# Vadims Podans (c) 2008
# http://www.sysadmins.lv/
########################################################
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty FileName ($null)
$Data | Add-Member NoteProperty EventCount ($null)
$Events = Get-EventLog security | ?{$_.eventid -eq 560 -and
$_.EntryType -eq "SuccessAudit" -and
$_.message -like "*Object Name:`tD:\Shared Documents\*" -and
$_.message -like "*Accesses:`t%delete*"
}
$UniqueTime = $Events | select -Unique TimeGenerated | %{($_.timegenerated).datetime}
foreach ($time in $UniqueTime) {[object[]]$SelectedEvents = $Events | ?{($_.timegenerated).datetime -eq $time}
if ($SelectedEvents.count -ge 5) {
$Data.EventCount = $SelectedEvents.Count
$SelectedEvents | %{
$message = $_.message.split("`n") | %{$_.trim()}
$Data.time = $_.TimeGenerated
if ($message -like "Primary User Name:`t*$") {
$Data.UserName = ($message | ?{$_ -like "Client User Name:*"} | %{$_ -replace "^.+`t *"})}
else {
$Data.UserName = ($message | ?{$_ -like "Primary User Name:*"} | %{$_ -replace "^.+`t *"})}
$Data.FileName = ($message | ?{$_ -like "Object Name:*"} | %{$_ -replace "^.+`t *"})
$Data
}
}
}
Что касается поля $Data.UserName, то здесь я сделал проверку поля Primary User Name. Если файл или папка были удалены с компьютера локально, то данное поле заполняется именем пользователя. Если же файл или папку удалили по сети, то в данном поле будет указано имя компьютера в формате ComputerName$, а имя пользователя будет отражено в поле Client User Name. Поэтому если в поле Primary User Name будет встречаться знак доллара ($), то мы в поле $Data.UserName записываем имя пользователя из поля эвентлога Client User Name. Жирным в скрипте я отметил те места, которые в зависимости от местных условий могут изменяться. В первом случае отмечена корневая папка, которая будет изучаться и кол-во инцидентов удаления в секунду описывает порог срабатывания скрипта. И результат работы скрипта:
Time UserName FileName EventCount
---- -------- -------- ----------
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\AR 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\... 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\... 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\BG 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\... 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\... 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\DA 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\... 140
2008.11.15. 23:33:44 Administrator C:\New Folder\dasblog\bin\... 140
Enjoy!