We rise up for the things we believe in over and over again

Наверняка каждый системный администратор сталкивался с задачей - вынуть да положить руководству на стол информацию о том, кто стер какой-либо очень нужный файл с сетевого хранилища. Почти все знают, как включить аудит событий файловой системы. Если кто-то не знает, очень рекомендую ознакомиться вот с этой статьей: How do I enable auditing on certain files/directories? - это очень просто и быстро.
После включения аудита в логе безопасности файлового сервера станут появляться события о работе с файловой системой. Вот как, например, выглядит запись о запросе на удаление какого-либо файла:


В этом сообщении видно все, что нам нужно для отчета. Единственная проблема заключается в том, что в логе безопасности сообщений будет огромное количество. И среди всего этого вороха данных нам нужно будет как-то отыскать нужную информацию. Известно, что все логи сервера - это файлы, значит, нужно каким-то образом в автоматическом режиме прочитать файл лога, вытащить оттуда записи согласно определенным критериям, и этот комплект записей выложить на стол руководству. Осталось лишь найти инструмент, которым можно этого добиться. Он есть, называется LogParser, взять можно вот здесь: LogParser @ Microsoft.com.
Инструмент этот относится к разряду CLI-утилит - вся работа осуществляется при помощи командной строки. В разборе того, что и куда вводить, чтобы прочитать нужные данные, мне очень сильно помогла вот эта страница: Log Parser - The "Swiss Army Knife" for Intrusion Investigators and Computer Forensics Examiners. По прочтению и пониманию материала был сформирован следующий ярлык вызова утилиты:


А в качестве содержимого файла запроса DeleteEvents.sql используется следующее:

Да, это самый обычный SQL запрос. Допустим, меня очень сильно интересовало, какой нехороший человек стер мой любимый файлик, называвшийся "тест.txt". Вводим запрос, нажимаем Enter, и в ответ получаем красивую табличку вот такого вида:

Откуда видим, что нахала, стершего файл, зовут user01, принадлежит он к домену TEST. И файл был стерт сегодня. Что ж, задача выполнена, мерзавец найден. Дальше уже пусть руководство разбирается, что с user01 делать и какие санкции к нему применять.

P.S. Все вышеописанное справедливо для Windows 2008 Server. В версии 2003 формат записей в логе безопасности был иным, поэтому файл sql запроса скорее всего нужно будет серьезно менять.
P.P.S. Небольшая хохма на десерт. Существуют платные решения из сферы аудита, одно из таких я сегодня захотел попробовать: sсript Logic File System Audit. Как всегда при запросе пробной версии нужно заполнить простыню. Ок, давайте, посмотрим, что и куда писать надо. Вот кусок этой простыни:

Ничего более подходящего, чем Вооруженные силы Европы я там не нашел. А что, хорошая страна ведь ;)

P.P.P.S. Окинул запись взглядом анонимного пользователя - ГРАФИЧЕСКИЕ СМАЙЛЫ! УБЕЙТЕ СЕБЯ О СТЕНУ В КРОВАВЫЕ ОШМЕТКИ!!!

@музыка: KOTO - Die Klapperschlange

@темы: Security

Комментарии
10.08.2011 в 16:44

Хаотичный нейтрал.
Swiss Army Knife
:five:
pS: отключи смайлики в записи-внизу галочка... а то не копирабельна командострочка.
10.08.2011 в 16:46

We rise up for the things we believe in over and over again
уже... преобразовал в код все это дело.
10.08.2011 в 17:31

Слова "не надо нервничать" хорошо помогают привести человека в нормальное состояние бешенства.
А я все это через Powershell делаю :) Get-EventLog и Get-WinEvent (Get-WinEvent получше и помощнее, посзоляет использовать xquery, но совершенно не работает с Win2003 и кривовато работает в Win2008 зато в Win2008 R2 работает замечательно.)
Кстати. Ты еще не столкнулся с проблемой что в лог пишется столько событий, что все что старше нескольких часов в лог просто не влезает и перезатирается? Увеличивать размер лога до бесконечности не вариант, да и систему большой лог будет подтормаживать. В итоге я набросал базу данных, и каждый час выгружаю новые логи с интересующих меня серверов. Да и получить из базы что-то выходит гораздо быстрее. Если интересно - могу поделиться набросками.
10.08.2011 в 17:44

Быть, а не казаться.
Hikedaya, спасибо огромное! :)
10.08.2011 в 17:44

We rise up for the things we believe in over and over again
Cybeon Нет, с проблемой переполнения лога еще не столкнулся по той простой причине, что только собираюсь это все внедрять ;) Но вообще я представляю, как быстро он заполняется, тестовый домен это отлично показывает.
Насчет PowerShell - у нас пока нет Win 2008 R2 (и я даже затрудняюсь сказать, когда будет). Но все равно было бы неплохо почитать код скрипта, для общего развития )
Плюс, еще столкнулся с такой закавыкой - AccessMask для разных случаев удаления данных. Если, например, папка удаляется локально на сервере, то искать его нужно там, где уже написано. Если же папка удаляется через SMB, то искать ее следует вот тут:
EXTRACT_TOKEN(Strings,10,'|') AS FolderAccessMask,
FolderAccessMask - это я ее так обозвал. Код запроса в записи обновил, чтобы он и файлы, и папки искал.
10.08.2011 в 18:08

Слова "не надо нервничать" хорошо помогают привести человека в нормальное состояние бешенства.
>>Насчет PowerShell - у нас пока нет Win 2008 R2
Я потому и указал 2 командлета. Если Get-WinEvent использовать нельзя, то можно Get-Eventlog
>>Плюс, еще столкнулся с такой закавыкой - AccessMask для разных случаев удаления данных
Не уверен в правильности своего суждения, но скорее всего дело в том что для событий 4656 и 4663 информация о доступе записывается в разные поля.
Есть 2 параметра описывающие доступ: Accesses и Accessmask
в 4656 они пишутся в поля 10 и 11 соответственно
в 4663 в поля 9 и 10

Очень хорошо структура полей разных событий расписана на ресурсе eventopedia.cloudapp.net/Events/?/Operating+Sys...
10.08.2011 в 18:40

We rise up for the things we believe in over and over again
скорее всего дело в том что для событий 4656 и 4663 информация о доступе записывается в разные поля.
Действительно, это от меня ускользнуло, проверил только что. Значит можно проверять по парам (Id 4663 / поле 9) и (id 4656 / поле 10).
А вот на указанном сайте интересность. На странице описания эвента 4656 указано, что Access Mask нужно выбирать из 11 поля, тогда как скрипт выбирает его из 10-го.
Да, из get-eventlog можно выудить всю интересующую информацию. Попробую составить сценарий, используя именно его, хотя и жаль, что get-winevent в версии не R2 ведет себя неадекватно.
10.08.2011 в 19:07

Слова "не надо нервничать" хорошо помогают привести человека в нормальное состояние бешенства.
С Get-WinEvent на Win2008 - как повезет. Может работать нормально, а может не выдавать ряд полей. Для отдельного частного случая может сойти, но для задач выполняемых в автоматическом режиме по регламенту в product среде на W2008 я бы не стал его использовать.
Если дашь кооррдинаты какого-нибудь E-mail могу подкинуть готовый скрипт как на Get-WinEvent так и на Get-Eventlog
10.08.2011 в 19:14

We rise up for the things we believe in over and over again
К сожалению, дело не в везении. Много народу в Сети подтверждают, что на Win 2008 Get-WinEvent показывает пустое поле Message, а оно-то и нужно. Так что только Get-EventLog.
А что до скрипта - попробую сначала сам его составить и посмотреть, как работать будет. Иначе - неспортивно ;) Потом можно будет сравнить.
10.08.2011 в 21:44

Слова "не надо нервничать" хорошо помогают привести человека в нормальное состояние бешенства.
Дело конечно не в везении, а в обработке прав доступа. Get-WinEvent глючит, если решает что ему не хватает прав доступа (несмотря на то что права таки есть). У меня он работал под одной учеткой локально, отказывался работать под той же учеткой через PSRemoting и не работал даже локально под другой учеткой. А вот под какой учеткой он у тебя захочет работать - это, за неимением точного знания что ему надо, как раз вопрос везения. Надеюсь MS все же исправят багу.
Что до поля Message, то оно желательно для визуальной оценци, но не нужно для автоматической обработки. Реально тебе нужны Properties или ReplacementStrings (в объектах выдаваемых разными командлетами оно называется по разному) - именно там хранятся нужные тебе значения, к которым можно обращаться но номеру. Но Properties выдаваемое Get-WinEvent'ом в случае глюка тоже пустые :(
10.08.2011 в 22:34

We rise up for the things we believe in over and over again
В этом случае все проще - ядром скрипта будет нечто подобное:
get-eventlog -logname security -instanceid 4663,4656 | where {$_.replacementstrings -match '0x10000' } | %{ $name = $_.replacementstrings[%INSERT IGNORE_INDEXES%];write-host $name }
Это выведет все записи об удаленных объектах. Дальше останется только добавить критерии "какой файл/папку искать". Но это уже явно не сегодня ;)
В любом случае - спасибо за наводку относительно ReplacementStrings )