Contents of this directory is archived and no longer updated.

Навеяно темой на форуме: http://forum.sysfaq.ru/index.php?showtopic=13274

Итак, есть задача отслеживать события удаления объектов (файлов и/или папок) с файлового сервера. Итак, для начала необходимо настроить аудит на файловом сервере. Приведу рекомендации коллеги WindowsNT:

  1. Включить аудит успешных событий типа Object Access.
  2. Отрегулировать размер журнала и параметры перезаписи.
  3. В свойствах папки Shared Documents (и других папок общего доступа) включить Аудит на Успешные Everyone: Delete, Delete Subfolders and Files.

Учитывая сопутствующую проблематику удалений, что для части программ при работе нормально удалять файлы при сохранении было предложено фиксировать 5 событий удаления в секунду. Такая схема вполне сгодится для среднестатистического решения. В любом случае предложенный скрипт можно будет изменить под свои нужды вполне свободно. За основу будет взят пост из моего предыдущего блога (Аудит входов на сервере терминалов с использованием PowerShell), но с некоторыми доработками.

Итак, задача разбивается на 4 составные части:

  1. получение всех эвентов с кодом EventID = 560;
  2. из полученных эвентов получить массив с уникальным временем;
  3. подсчитать количество эвентов для каждого уникального времени из массива, который был получен на втором этапе;
  4. если кол-во эвентов больше или равно 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!


Share this article:

Comments:

Comments are closed.