Первым дело следует включить аудит всех необходимых операций (управление учетными записями и контроль целостности файлов) в доменной политике. И если с аудитом операций над объектами Active Directory все просто, то вот с аудитом файловых операций придется повозиться. Тут, как нельзя кстати, компания Netwrix (не сочтите за рекламу, — компания автор коммерческого софта для аудита) подготовила замечательную статью: «Настройка аудита файловых серверов: подробная инструкция и шпаргалка» (.pdf).
Но вернемся к нашим «костылям». После успешной активации аудита всех необходимых операций и обнаружения в журналах Windows интересующих нас событий, встал вопрос об их отправке на сервер мониторинга… Логично было бы воспользоваться встроенными инструментами ("Attach Task To This Event" не самый информативный инструмент, зато «родной» для Windows), но тут всплывает первый любопытный и не приятный момент от Microsoft — «Send an email and Display a message are deprecated for from Windows Server 2012 and Windows 8».
Согласно рекомендациям от Microsoft, как замену встроенному «deprecated» функционалу решили использовать скрипты PowerShell для фильтрации журналов и отправки по E-mail, благо есть подробные инструкции:
«Аудит Active Directory средствами Powershell с оповещением об изменениях».
«Аудит удаления и доступа к файлам и запись событий в лог-файл средствами Powershell»
Но тут возникла сложность другого характера: приведенные выше скрипты отсылали на E-mail только заголовки (темы) событий, тело письма было пустым :( При всем при этом — если скрипт PowerShell запустить в PowerShell ISE «as Administrator», то приходит полное сообщение, как и было задумано!
$time = (get-date) - (new-timespan -min 60)
$Subject = “Заблокирован аккаунт"
$Theme = “Только что был заблокирован аккаунт”
$Server = “smtp.server.local”
$From = “AD@domain.local”
$To = “support@domain.local”
$encoding = [System.Text.Encoding]::UTF8
#Выбирается последнее произошедшее событие с таким ID.
$TimeSpan = new-TimeSpan -sec 1
foreach($event in $events)
{
$PrevEvent = $Event.Запись
$PrevEvent = $PrevEvent - 1
$TimeEvent = $Event.TimeCreated
$TimeEventEnd = $TimeEvent+$TimeSpan
$TimeEventStart = $TimeEvent- (new-timespan -sec 1)
$Body=Get-WinEvent -maxevents 1 -FilterHashtable @{LogName=”Security”;ID=4725;StartTime=$TimeEventStart;} | Select TimeCreated,@{n=”Account Name”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”} |%{$_.’#text’}}},@{n=”Computer”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetDomainName”}| %{$_.’#text’}}}
$body = $body -replace "@{" -replace "}" -replace "=", ": " -replace ";","`n" -replace "TimeCreated","Время события" -replace "^","`n"
$BodyM = $Body
}
Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$BodyM `n$Theme” -Subject $Subject -Encoding $encoding
В общем, если у вас есть реально рабочие скрипты для такого случая — милости прошу в комментарии.
Мы же перешли к другому способу (вдохновила вот эта статья: "Мониторинг и оповещение о событиях в журналах Windows: триггеры событий" и выручила эта утилита: sendEmail):
- Добавляем в Task Scheduler задание по интересующему нас событию (прямо из журнала "Security" -> "Attach Task To This Event..."
- В Actions указываем запуск скрипта, в котором с помощью утилиты wevtutil делаем выборку из журнала и сохраняем результат в файл.
пример скрипта - выборка событий с Event ID 4726del c:\Audit\query_ID4726.txt wevtutil qe Security /q:"*[System[(EventID=4726)]]" /f:text /rd:true /c:1 > c:\Audit\query_ID4726.txt
- Вторым действием, с помощью утилиты sendEmail отправляем сохраненный файл по назначению:
пример аргументов для команды запуска sendEmail:-f audit_AD@domain.local -s smtp.domain.local:25 -t support@domain.local -m "AD User Account Management - Event ID 426 - Account was Deleted" -a C:\Audit\query_ID4726.txt
В результате должны получать что-то типа этого:
P.S. Спасибо всем авторам источников, указанных ранее!
Комментарии (17)
Deks
23.06.2015 21:33На самом деле проще разбирать виндовое событие по подстрокам. Я об этом вскользь упомянул в статье про мониторинг ад, короткую вы указали выше. Выборка по подстрокам имеет более читабельный код.
С хмл сложнее, т.к. слишком много служебных символов — велика вероятность ошибки в коде.
Попробуйте использовать подстроки и у вас все получиться:)VFedorV Автор
23.06.2015 22:15хм, — ничего не пони :) можете на конкретном примере, для Task Scheduler создать задание с необходимыми параметрами? думаю многие будут Вам благодарны, — я в первую очередь :) хотя бы в Вашу статью…
Deks
23.06.2015 22:38Пожалуй вы правы. Напишу ещё статьи, как логическое продолжение предыдущих. Займусь на этой неделе. Думаю к концу недели сделаю.
Постараюсь там более подробно все описать.
ildarz
24.06.2015 12:24приведенные выше скрипты отсылали на E-mail только заголовки (темы) событий, тело письма было пустым
Пайплайн — это здорово, но плохо читабельно и плохо поддается отладке. В вашей ситуации я бы разбил код формирования $body на несколько строк и делал бы отладочный вывод в текстовый файл, чтобы понять, на каком этапе косяк.
выборка событий с Event ID 4726
Ужасный способ. Нет никакой гарантии, что вы выберете из лога именно то событие, на которое выскочил триггер. Искать надо по параметру EventRecordID (уникальный номер события в логе) — подробнее, например, тут.
fleaump
24.06.2015 15:271. Если есть exchange, то ничего придумывать не надо, отправка мыла работает по умолчанию.
2. Системы мониторинга, тот же zabbix может снимать логи с винды из коробки(Item->zabbix active= eventlog[«Security»] ), и уже на нем накручивай какие хочешь триггеры на события|коды событий, а уж оповещалки и на мыло, и на телефон через тот же pushbullet, и даже через sip позвонить голосом, а так же градация по важности. И не надо городить велосипеды с тем что с разного оборудования одни алерты как то клеить, с других осей третьи свистелки оповещалки.
Лень двигатель прогресса.ildarz
24.06.2015 15:46Причем тут Exchange, и как он связан с «отправкой мыла по умолчанию»?
fleaump
24.06.2015 16:00sendemail.exe
fleaump
24.06.2015 16:08про то как слать через powershell
$EmailFrom = «server@mail.local»
$EmailTo = «some@mail.local»
$Subject = «Subject theme»
$Body = «Hello»
$SMTPServer = «mail-srv»
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
###Если надо акредитоваться
###$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“usr”, “pass”);
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
Но лучше не страдать ерундой, а делать оповещения через централизованный мониторинг.
VFedorV Автор
24.06.2015 17:20а Zabbix умеет забирать другие журналы, кроме «Security» — была задачка забирать логи Kaspersky Endpoint Security, который пишет в свой собственный журнал… решили с помощью SolarWinds Event Log Forwarder for Windows. Тот же Snare не смогли заставить этот журнал забирать!
fleaump
24.06.2015 17:27Любой журнал, любое событие забирать, а на своей стороне потом уже вешать обрабочик с регуляркой или счетчиком для обработки, в край можно через внешний скрипт обрабатывать(хоть через питон пропускай, хоть через php, хоть через brainfuck).
А то что с журнал(channel) не мог читать — прав не хватает агенту, или не правильно вписали имя канала.
www.zabbix.com/documentation/2.0/ru/manual/config/items/itemtypes/zabbix_agent/win_keys
ChiefPilot
24.06.2015 18:04А не подскажет ли кто-нибудь, кому не трудно, актуальные номера событий, за которыми стоит следить? Где бы про это почитать? А то они, такое ощущение, постоянно меняются от версии к версии (Server 2003, 2008, 2012...)
VFedorV Автор
25.06.2015 10:07да, есть такое предположение :) я всего лишь пару Event ID вычислил (сам генерил события), которые мне нужны были…
ildarz
25.06.2015 12:18Ну товарищи, а RTFM? По запросу в гугле «microsoft windows <версия> security events» сходу выдает ссылки на сайт MS (статьи в Knowledge base или таблицы с описанием событий). Номера менялись при переходе от 2003 к 2008, в 2012 остались те же.
navion
Что мешает выполнять задание с повышенными привелегиями, если проблема в них?
VFedorV Автор
Ничего не мешает, — так задание и выполняется… Дело видать не совсем в них, выяснить в чем именно не удалось :(