Мониторинг и оповещение о событиях в журналах Windows: отправка на E-mail в Windows Server 2012 R2

    Не так давно, для успешного прохождения аудита на соответствие стандартам 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. Спасибо всем авторам источников, указанных ранее!
    Support the author
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 17

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

      Что мешает выполнять задание с повышенными привелегиями, если проблема в них?
        0
        Ничего не мешает, — так задание и выполняется… Дело видать не совсем в них, выяснить в чем именно не удалось :(
        0
        На самом деле проще разбирать виндовое событие по подстрокам. Я об этом вскользь упомянул в статье про мониторинг ад, короткую вы указали выше. Выборка по подстрокам имеет более читабельный код.
        С хмл сложнее, т.к. слишком много служебных символов — велика вероятность ошибки в коде.
        Попробуйте использовать подстроки и у вас все получиться:)
          0
          хм, — ничего не пони :) можете на конкретном примере, для Task Scheduler создать задание с необходимыми параметрами? думаю многие будут Вам благодарны, — я в первую очередь :) хотя бы в Вашу статью…
            0
            Пожалуй вы правы. Напишу ещё статьи, как логическое продолжение предыдущих. Займусь на этой неделе. Думаю к концу недели сделаю.
            Постараюсь там более подробно все описать.
          0
          приведенные выше скрипты отсылали на E-mail только заголовки (темы) событий, тело письма было пустым


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

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


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

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

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

            Лень двигатель прогресса.
              0
              Причем тут Exchange, и как он связан с «отправкой мыла по умолчанию»?
                0
                sendemail.exe
                  0
                  про то как слать через 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)


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

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

                  www.zabbix.com/documentation/2.0/ru/manual/config/items/itemtypes/zabbix_agent/win_keys
                0
                <дубль, удалено>
                  0
                  А не подскажет ли кто-нибудь, кому не трудно, актуальные номера событий, за которыми стоит следить? Где бы про это почитать? А то они, такое ощущение, постоянно меняются от версии к версии (Server 2003, 2008, 2012...)
                    0
                    да, есть такое предположение :) я всего лишь пару Event ID вычислил (сам генерил события), которые мне нужны были…
                      0
                      Ну товарищи, а RTFM? По запросу в гугле «microsoft windows <версия> security events» сходу выдает ссылки на сайт MS (статьи в Knowledge base или таблицы с описанием событий). Номера менялись при переходе от 2003 к 2008, в 2012 остались те же.

                  Only users with full accounts can post comments. Log in, please.