Не так давно, для успешного прохождения аудита на соответствие стандартам PCI DSS, потребовалось включить аудит событий Windows серверов и что самое главное — настроить отправку уведомлений о критичных событиях на E-mail. Для Linux серверов вопрос решается установкой и настройкой OSSEC (ну еще могут понадобиться syslog ws loganalyzer и auditd), для Windows Server 2012 R2 да еще и русской версии он не подошел (в последствии нам таки удалось его адекватно настроить, если будет интересно — смогу описать как). Так что решили искать другие способы…

Первым дело следует включить аудит всех необходимых операций (управление учетными записями и контроль целостности файлов) в доменной политике. И если с аудитом операций над объектами 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».

Send an e-mail (deprecated)


Согласно рекомендациям от Microsoft, как замену встроенному «deprecated» функционалу решили использовать скрипты PowerShell для фильтрации журналов и отправки по E-mail, благо есть подробные инструкции:
«Аудит Active Directory средствами Powershell с оповещением об изменениях».
«Аудит удаления и доступа к файлам и запись событий в лог-файл средствами Powershell»
Но тут возникла сложность другого характера: приведенные выше скрипты отсылали на E-mail только заголовки (темы) событий, тело письма было пустым :( При всем при этом — если скрипт PowerShell запустить в PowerShell ISE «as Administrator», то приходит полное сообщение, как и было задумано!

пример скрипта отправки уведомления о событии 'Заблокирован аккаунт' - Event ID 4725:
$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):

  1. Добавляем в Task Scheduler задание по интересующему нас событию (прямо из журнала "Security" -> "Attach Task To This Event..."

  2. В Actions указываем запуск скрипта, в котором с помощью утилиты wevtutil делаем выборку из журнала и сохраняем результат в файл.

    пример скрипта - выборка событий с Event ID 4726
    del c:\Audit\query_ID4726.txt
    wevtutil qe Security /q:"*[System[(EventID=4726)]]" /f:text /rd:true /c:1 > c:\Audit\query_ID4726.txt
    


  3. Вторым действием, с помощью утилиты 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)


  1. navion
    23.06.2015 20:31

    При всем при этом — если скрипт PowerShell запустить в PowerShell ISE «as Administrator», то приходит полное сообщение, как и было задумано!

    Что мешает выполнять задание с повышенными привелегиями, если проблема в них?


    1. VFedorV Автор
      23.06.2015 20:46

      Ничего не мешает, — так задание и выполняется… Дело видать не совсем в них, выяснить в чем именно не удалось :(


  1. Deks
    23.06.2015 21:33

    На самом деле проще разбирать виндовое событие по подстрокам. Я об этом вскользь упомянул в статье про мониторинг ад, короткую вы указали выше. Выборка по подстрокам имеет более читабельный код.
    С хмл сложнее, т.к. слишком много служебных символов — велика вероятность ошибки в коде.
    Попробуйте использовать подстроки и у вас все получиться:)


    1. VFedorV Автор
      23.06.2015 22:15

      хм, — ничего не пони :) можете на конкретном примере, для Task Scheduler создать задание с необходимыми параметрами? думаю многие будут Вам благодарны, — я в первую очередь :) хотя бы в Вашу статью…


      1. Deks
        23.06.2015 22:38

        Пожалуй вы правы. Напишу ещё статьи, как логическое продолжение предыдущих. Займусь на этой неделе. Думаю к концу недели сделаю.
        Постараюсь там более подробно все описать.


  1. ildarz
    24.06.2015 12:24

    приведенные выше скрипты отсылали на E-mail только заголовки (темы) событий, тело письма было пустым


    Пайплайн — это здорово, но плохо читабельно и плохо поддается отладке. В вашей ситуации я бы разбил код формирования $body на несколько строк и делал бы отладочный вывод в текстовый файл, чтобы понять, на каком этапе косяк.

    выборка событий с Event ID 4726


    Ужасный способ. Нет никакой гарантии, что вы выберете из лога именно то событие, на которое выскочил триггер. Искать надо по параметру EventRecordID (уникальный номер события в логе) — подробнее, например, тут.


    1. VFedorV Автор
      24.06.2015 13:32

      спасибо за интересную информацию, попробую и этот способ


  1. fleaump
    24.06.2015 15:27

    1. Если есть exchange, то ничего придумывать не надо, отправка мыла работает по умолчанию.

    2. Системы мониторинга, тот же zabbix может снимать логи с винды из коробки(Item->zabbix active= eventlog[«Security»] ), и уже на нем накручивай какие хочешь триггеры на события|коды событий, а уж оповещалки и на мыло, и на телефон через тот же pushbullet, и даже через sip позвонить голосом, а так же градация по важности. И не надо городить велосипеды с тем что с разного оборудования одни алерты как то клеить, с других осей третьи свистелки оповещалки.

    Лень двигатель прогресса.


    1. ildarz
      24.06.2015 15:46

      Причем тут Exchange, и как он связан с «отправкой мыла по умолчанию»?


      1. fleaump
        24.06.2015 16:00

        sendemail.exe


        1. 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)


          Но лучше не страдать ерундой, а делать оповещения через централизованный мониторинг.


    1. VFedorV Автор
      24.06.2015 17:20

      а Zabbix умеет забирать другие журналы, кроме «Security» — была задачка забирать логи Kaspersky Endpoint Security, который пишет в свой собственный журнал… решили с помощью SolarWinds Event Log Forwarder for Windows. Тот же Snare не смогли заставить этот журнал забирать!


      1. fleaump
        24.06.2015 17:27

        Любой журнал, любое событие забирать, а на своей стороне потом уже вешать обрабочик с регуляркой или счетчиком для обработки, в край можно через внешний скрипт обрабатывать(хоть через питон пропускай, хоть через php, хоть через brainfuck).

        А то что с журнал(channel) не мог читать — прав не хватает агенту, или не правильно вписали имя канала.

        www.zabbix.com/documentation/2.0/ru/manual/config/items/itemtypes/zabbix_agent/win_keys


  1. ildarz
    24.06.2015 15:45

    <дубль, удалено>


  1. ChiefPilot
    24.06.2015 18:04

    А не подскажет ли кто-нибудь, кому не трудно, актуальные номера событий, за которыми стоит следить? Где бы про это почитать? А то они, такое ощущение, постоянно меняются от версии к версии (Server 2003, 2008, 2012...)


    1. VFedorV Автор
      25.06.2015 10:07

      да, есть такое предположение :) я всего лишь пару Event ID вычислил (сам генерил события), которые мне нужны были…


      1. ildarz
        25.06.2015 12:18

        Ну товарищи, а RTFM? По запросу в гугле «microsoft windows <версия> security events» сходу выдает ссылки на сайт MS (статьи в Knowledge base или таблицы с описанием событий). Номера менялись при переходе от 2003 к 2008, в 2012 остались те же.