Скрипт для получения отчета о событиях доступа к файлу.

Потребовалось мне на днях провести аудит доступа к файлу. Ситуация стандартная: кто-то из пользователей внес “кривые” данные в очень важный файл. Все пользователи, имеющие доступ к файлу в один голос заявляют: “это не я”. Необходимо найти того, кто это сделал и расстрелять. Все важные файлы у нас лежат на файловом сервере, аудит доступа к объектам включен. Диапазон времени, когда произошел этот инцедент, известен. Т.о. наша задача сводится к просмотру событий в журнале безопасности файлового сервера с event id, равным 560 и определения того, кто совершал манипуляции с заданным файлом.

Понятное дело, что событий с event id 560 на файловом сервере наблюдается чуть более, чем до хрена, а потому просматривать их в ручную – дело неблагодарное. Вспомнив о том, что не так давно я уже писал скрипт для получения отчета о событиях входа/выхода, где мне пришлось парсить security log, решил взять его за основу. Собственно, изменений было не много, нужно было только подправить функцию, которая “вытягивала” данные из лога безопасности. На скорую руку получилось вот, что:

Function Get-AccessEvts ($CompName, $Before=$DateBefore, $After=$DateAfter) { #массив, в который будем собирать информацию $arrEvts=@() #Перебираем все события с EventID равными 560 в заданном диапазоне даты/времени $filter="logfile='Security' and (eventcode='560') and TimeGenerated >= '$([System.Management.ManagementDateTimeConverter]::ToDMTFDateTime($After))'" $filter+= " and TimeGenerated <= '$([System.Management.ManagementDateTimeConverter]::ToDMTFDateTime($Before))'" gwmi -ComputerName $CompName -Class Win32_NTlogEvent -Filter $filter -ErrorAction Stop|%{ #создадим новый объект, в который будем записывать информацию об очередном событии входа/выхода $objEvt=New-Object PSObject -Property @{ CompName=$CompName; TimeGenerated=$null; User=$null; Domain=$null; UserClient=$null; EventIdentifier=$null; ObjectName=$null; Access=$nul; } #и сохраняем всю полезную информацию о событии в объете $objEvt $objEvt.TimeGenerated=[datetime]$_.TimeGenerated $objEvt.EventIdentifier=$_.EventIdentifier switch -regex ($_.Message) { "(?:Пользователь|User):\t+(\w+(?:\s?[\w-]+)*)" {$objEvt.User=$Matches[1]} "(?:Пользователь-клиент|Client User Name):\t+(\w+)" {$objEvt.UserClient=$Matches[1]} "(?:Домен|Domain):\t+(\w+(?:\s?[\w-]+)*)" {$objEvt.Domain=$Matches[1]} "(?:Имя объекта|Object Name):\t+(.+)" {$objEvt.ObjectName=$Matches[1]} "(?:Доступ|Access):\t+(\w+)" {$objEvt.Access=$Matches[1]} } #добавляем информацию об очередном событии в массив $arrEvts+=$objEvt } #возвращаем, как результат работы функции, информацию о всех собранных событиях $arrEvts }

использовать эту функцию можно следующим образом:

Get-AccessEvts -CompName "myserver" -Before "05/19/2011 00:00" -After "05/18/2011 08:00"|?{$_.ObjectName -like "*.xls*"}| 
Export-Csv -Encoding utf8 -UseCulture -Path c:\_tmp\def.csv

В результате получаем следующий отчет:

events_id_560

Обратите внимание, что в поле Access отчета содержится только первая строка соответствующего поля события с event id 560, состоящего из массива строк. Для того, чтобы скрипт извлекал весь массив значений, которые содержится  поле Acces события, его надо будет модифицировать. Но на текущий момент меня он вполне устраивает и в таком виде.

За сим прощаюсь, искренне ваш “и всё такое”…

15 Comments

  1. т.е. скрипт на win 2008 не отрабатывает? и как отработать этот скрипт корректно, сначала первый скрипт (функцию), а потом Get-AccessEvts…
    PS не кидайтесь в меня тапками, тока не совсем кумекую..

    • скрипт отрабатывает, но не приносит желаемого результата. Для того, чтобы скрипт выдавал нужную информацию на win2k8 и выше, его надо переделать (как минимум изменить условия отбора сообщений см. переменную $filter, как максимум- отследить связи между различными сообщениями по их HandleId)

      http://social.technet.microsoft.com/Forums/en/winserversecurity/thread/3e29e0c8-a491-4a84-8d61-044d48997862

      The event 4660 is logged when an object is deleted where that object’s audit policy has auditing enabled for deletions for the user who just deleted it or a group to which the user belongs.

      To find out the object’s name and type you will need to correlate back to the event 4656 that has the same Handle ID.

  2. Скрипт вываливается в ошибку:

    Cannot convert value “20160307103521.000000+120” to type “System.DateTime”. Error: “String was not recognized as a valid DateTime

  3. запускаю скрипт так на файловом серве W2K3, локализация – English, вот так:
    Get-AccessEvts -CompName “МойСерв” -Before “04/07/2016 10:00” -After “04/07/2016 09:00″|?{$_.ObjectName -like “*.xls*”}|
    Export-Csv -Encoding utf8 -UseCulture -Path “C:\Documents and Settings\Юсер\My Documents\check.csv”
    получаю очень много таких строчек:
    Cannot convert value “20160407093227.000000+180” to type “System.DateTime”. Error: “String was not recognized as a valid DateTime.”
    At line:26 char:44
    + $objEvt.TimeGenerated=[datetime]$_. <<<< TimeGenerated
    + CategoryInfo : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

    Cannot convert value "20160407093227.000000+180" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
    At line:26 char:44
    + $objEvt.TimeGenerated=[datetime]$_. <<<< TimeGenerated
    + CategoryInfo : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

    Cannot convert value "20160407093227.000000+180" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
    At line:26 char:44
    + $objEvt.TimeGenerated=[datetime]$_. <<<< TimeGenerated
    + CategoryInfo : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException
    и т.д. …..

  4. заработало !! )
    а в чем соль то? – в принципе о преобразовании WMI-даты читал, но куда в вашем скрипте засунуть – не додумался…

    а еще вопрос: я так понимаю тянутся все события где проскакивает действие DELETE – а вот как потянуть те что точно удаление, а не переименование или добавление информации?…

    • я вижу в *.csv файле, что не потянулись значения: “User”,”Access” – можете подсказать почему?

      спасибо

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.