Вопрос или проблема
Есть ли простой способ отправить электронное письмо, когда событие определенной серьезности от определенного сервиса попадает в журнал событий Windows Server? Это на Windows Server 2003, если это имеет значение.
Примечание: у нас есть надлежащее мониторинг и оповещение для серверов в рабочей среде, но нам просто нужно быстрое решение для этого сервиса в разработке.
Вы можете сделать это с помощью OSSEC, многоплатформенного программного обеспечения с открытым исходным кодом:
OSSEC — это полноценная платформа для мониторинга и управления вашими системами. Он сочетает в себе все аспекты HIDS (хостового обнаружения вторжений), мониторинга журналов и SIM/SIEM в одном простом, мощном и открытом решении.
И для мониторинга/оповещения по журналам:
Оповещения в реальном времени и настраиваемые оповещения
OSSEC позволяет клиентам настраивать инциденты, о которых они хотят быть уведомленными, что позволяет им сосредотачиваться на повышении приоритета критических инцидентов по сравнению с обычным шумом в любой системе. Интеграция с smtp, sms и syslog позволяет клиентам быть в курсе оповещений, отправляя их на электронную почту и портативные устройства, такие как мобильные телефоны и пейджеры.
[…]
Каждая операционная система, приложение и устройство в вашей сети генерируют журналы (события), чтобы вы знали, что происходит. OSSEC собирает, анализирует и коррелирует эти журналы, чтобы уведомить вас, если происходит что-то неправильное (атака, злоупотребление, ошибки и т.д.).
Вот статья о OSSEC на 360° Security.
Специализированная, коммерческая альтернатива: EventTracker (Prism Microssystems):
EventTracker — это полное решение для управления информацией о безопасности и событиях (SIEM), которое сочетает в себе управление журналами в реальном времени с мощным управлением конфигурацией и изменениями в одном комплексном программном пакете.
Вот еще одно забавное создание на VBScript от меня, собранное из нескольких других скриптов.
Option Explicit
' Main
Dim objShell, objWMIService, objEventSink, dictEventsToMonitor, eventToMonitor
' =====================( Configuration )=====================
' Set to 0 to disable event log reporting of bans / unbans
Const USE_EVENTLOG = 1
Const EVENTLOG_SOURCE = "SimpleEventMonitor"
' SMTP configuration
Const EMAIL_SENDER = "[email protected]"
Const EMAIL_RECIPIENT = "[email protected]"
Const EMAIL_SMTP_SERVER = "smtp-server"
Const EMAIL_SMTP_PORT = 25
Const EMAIL_TIMEOUT = 20
Set dictEventsToMonitor = CreateObject("Scripting.Dictionary")
' Define events that should be monitored. Matches are based on exact matches of all non-NULL fields
' Monitor our own startup and alert based on starting
PushEventToMonitor "100", "Application", EVENTLOG_SOURCE, NULL, NULL, NULL, NULL
PushEventToMonitor "7036", "System", "Service Control Manager", NULL, NULL, NULL, "Telnet service.*(running|stopped).*state"
' ===================( End Configuration )===================
Set objShell = CreateObject("WScript.Shell")
' Create event sink to catchevents
Set objWMIService = GetObject("winmgmts:{(security)}!root/cimv2")
Set objEventSink = WScript.CreateObject("WbemScripting.SWbemSink", "eventSink_")
objWMIService.ExecNotificationQueryAsync objEventSink, "SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'"
' Loop sleeping for one week, logging an event each week to say we're still alive
While (True)
LogEvent 100, "INFORMATION", "Simple Event Log Monitor started"
WScript.Sleep(7 * 24 * 60 * 60 * 1000)
Wend
' Fires each time new events are generated
Sub eventSink_OnObjectReady(objEvent, objWbemAsyncContext)
Dim evt, field, boolAlert, regexpMessage
For Each evt In dictEventsToMonitor.Keys
boolAlert = True
For Each field In dictEventsToMonitor.Item(evt).Keys
If UCase(Field) = "MESSAGE" Then
Set regexpMessage = new Regexp
regexpMessage.Pattern = dictEventsToMonitor.Item(evt).Item(Field)
regexpMessage.IgnoreCase = True
If NOT regexpMessage.Test(objEvent.TargetInstance.Properties_(Field)) then boolAlert = False
Else
If UCase(objEvent.TargetInstance.Properties_(Field)) <> UCase(dictEventsToMonitor.Item(evt).Item(field)) Then boolAlert = False
End If
Next ' field
if boolAlert = True Then
SendMessage "Simple Event Log Monitor notification from " & objEvent.TargetInstance.ComputerName, _
"Event ID: " & objEvent.TargetInstance.EventCode & VbCrLf _
& "Date/Time: " & Mid(objEvent.TargetInstance.TimeGenerated, 5, 2) & "https://serverfault.com/" & Mid(objEvent.TargetInstance.TimeGenerated, 7, 2) & "https://serverfault.com/" & Mid(objEvent.TargetInstance.TimeGenerated, 1, 4) & " " & Mid(objEvent.TargetInstance.TimeGenerated, 9, 2) & ":" & Mid(objEvent.TargetInstance.TimeGenerated, 11, 2) & ":" & Mid(objEvent.TargetInstance.TimeGenerated, 13, 2) & VbCrLf _
& "Computer: " & objEvent.TargetInstance.ComputerName & vbCrLf _
& "Event Log: " & objEvent.TargetInstance.LogFile & vbCrLf _
& "Event Source: " & objEvent.TargetInstance.SourceName & vbCrLf _
& "Event Category: " & objEvent.TargetInstance.CategoryString & vbCrLf _
& "Event Type: " & objEvent.TargetInstance.Type & vbCrLf _
& "User Name: " & objEvent.TargetInstance.User & vbCrLf _
& "Message:" & vbCrLf & vbCrLF _
& objEvent.TargetInstance.Message
Exit Sub
End If
Next ' evt
End Sub
Sub LogEvent(ID, EventType, Message)
' Log an event to the Windows event log
If USE_EVENTLOG Then objShell.Exec "EVENTCREATE /L APPLICATION /SO " & EVENTLOG_SOURCE & " /ID " & ID & " /T " & EventType & " /D """ & Message & """"
End Sub
Sub SendMessage(strSubject, strBody)
Dim objCDOMessage
Set objCDOMessage = CreateObject("CDO.Message")
objCDOMessage.From = EMAIL_SENDER
objCDOMessage.To = EMAIL_RECIPIENT
objCDOMessage.Subject = strSubject
objCDOMessage.Textbody = strBody
objCDOMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = EMAIL_SMTP_SERVER
objCDOMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = EMAIL_SMTP_PORT
objCDOMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = EMAIL_TIMEOUT
objCDOMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objCDOMessage.Configuration.Fields.Update
objCDOMessage.send
End Sub
Sub PushEventToMonitor(strID, strLog, strSource, strCategory, strType, strUser, strMessagePattern)
Dim x
x = dictEventsToMonitor.Count
Set dictEventsToMonitor.Item(x) = CreateObject("Scripting.Dictionary")
If NOT IsNull(strID) Then dictEventsToMonitor.Item(x).Add "EventCode", strID
If NOT IsNull(strLog) Then dictEventsToMonitor.Item(x).Add "LogFile", strLog
If NOT IsNull(strSource) Then dictEventsToMonitor.Item(x).Add "SourceName", strSource
If NOT IsNull(strCategory) Then dictEventsToMonitor.Item(x).Add "CategoryString", strCategory
If NOT IsNull(strType) Then dictEventsToMonitor.Item(x).Add "Type", strType
If NOT IsNull(strType) Then dictEventsToMonitor.Item(x).Add "User", strUser
If NOT IsNull(strMessagePattern) Then dictEventsToMonitor.Item(x).Add "Message", strMessagePattern
End Sub
Вы можете запустить это как службу Windows, если использовать что-то вроде Non-Sucking Service Manager или SRVANY для установки. Используя NSSM, командная строка будет:
nssm install SimpleEventLogMonitor %SystemRoot%\System32\cscript.exe "\"Pull_path_and_filename_of_script\""
Обязательно замените на вашего получателя, отправителя и имя SMTP-сервера в электронной почте.
Вы определяете события, по которым хотите получать уведомления, с помощью вызова “PushEventToMonitor”. Аргументы: ID события, имя лога, источник, категория, тип, пользователь и регулярное выражение, которое может быть сопоставлено с сообщением журнала. У меня есть пример, который соответствует запуску / остановке службы TELNET, а также один, который будет соответствовать запуску самого скрипта (который записывает событие в журнал приложений).
Это первый черновик, потому что тот, который я написал для клиента, действительно “в производстве”, был написан за их деньги и “принадлежит” им. Таким образом, я переписал этот (который на самом деле существенно отличается от используемого клиентом), и он, возможно, имеет глупые ошибки. Я некоторое время запустил его сегодня вечером на некоторых своих системах и пока не наблюдаю проблем.
Может быть, я со временем сделаю это немного лучше. Будет замечательно, если конфигурация будет извлечена из реестра (так что ее можно будет контролировать с помощью групповой политики) и она будет упакована в MSI для легкого развертывания на группы серверов. Ну ладно.
Вы можете сделать это с помощью задания Windows
Смотрите здесь http://www.vistax64.com/tutorials/67961-event-viewer-email-notification.html
Servers alive может сделать это для вас. Продукт бесплатен для мониторинга до 10 событий.
Монитор журналов событий NT — это бесплатный плагин, расположенный здесь. Довольно просто в использовании и настройке.
Тема старая, но все еще актуальная для любой ОС Windows, поэтому я поделюсь решением, которое я успешно использую много лет:
-
Скачайте и установите Mail Alert Simple Mailer:
https://sourceforge.net/projects/mail-alert/ -
Отредактируйте файл C:\MailAlert\MailAlert.ini с помощью Notepad.exe и укажите свои учетные данные электронной почты.
-
Сохраните файл и протестируйте настройку Mail Alert Simple Mailer, запустив в командной строке:
MailAlert.exe -t
Ваш пароль к почтовому серверу в конфигурационном файле MailAlert.ini будет зашифрован после первого запуска MailAlert.exe. Проверьте ваш почтовый ящик. Если что-то пошло не так, вы можете установить “VerboseMode=yes” в MailAlert.ini, чтобы получить более подробную информацию от вашего почтового сервера.
-
Запустите Event View и найдите событие Windows, которое вы хотите мониторить и получать уведомления по электронной почте при его возникновении.
-
Выберите событие и нажмите ссылку “Attach Task To This Event…” в правой панели Event Viewer.
-
Заполните информацию, нажмите “Next” и выберите “Start a program” в окне Action. Нажмите “Next”.
-
В окне “Run a program” нажмите “Browse…”, чтобы указать на файл C:\MailAlert\MailAlert.exe. Заполните поле параметров командной строки следующей строкой:
-s “Windows Event ID XXXX from host YYY” -d
-
Нажмите “Next”, затем “Finish”.
Вы даже можете мониторить конкретное событие, которое еще не произошло в журнале событий, создав одно задание в расписании задач с одной командной строкой. Вам нужно знать ID события, источник и имя журнала, а также иметь установленный и настроенный MailAlert. Вот полезный пример, как мониторить свободное место на диске на сервере или рабочей станции Windows и получать уведомления по электронной почте при достижении порога:
schtasks /Create /RU SYSTEM /NP /RL HIGHEST /SC ONEVENT /MO "*[System[Provider[@Name="Srv"] and EventID=2013]]" /EC System /TN "Event ID 2013" /TR "C:\MailAlert\MailAlert.exe -d -s \"ALERT from SERVER: Low disk space.\" "
Централизованный инструмент управления журналами событий от GFI (GFI EventsManager) делает это, хотя и не FOSS.
Оповещения в реальном времени, SNMPv2-ловушки включены
Последняя сборка GFI EventsManager™ улучшила уровень оповещений для ключевых событий или вторжений, обнаруженных в сети. GFI EventsManager позволяет запускать действия, такие как скрипты, или отправлять оповещения одному или нескольким людям по электронной почте, сетевым сообщениям, SMS-уведомлениям, отправляемым через шлюз или службу email-to-SMS, и теперь включает SNMPv2-ловушки. Генерация SNMP-оповещений также позволит администраторам интегрировать GFI EventsManager с предварительно существующими или универсальными механизмами мониторинга.
См. https://serverfault.com/a/517457/75770 для способа отправки электронной почты на основе пользовательских фильтров событий.
Проверено работает на Server 2008, и даже когда требуется аутентификация SMTP.
Ответ или решение
Отправка уведомлений по email при попадании события в журнал событий Windows на сервере Windows Server 2003 может быть реализована несколькими способами. Ниже приведены рекомендации и методы, которые помогут настроить и автоматизировать этот процесс.
Описание задачи
Основной целью является создание системы, которая будет автоматически отправлять email-уведомления при возникновении событий определенной важности от конкретной службы в журнале событий Windows. Это особенно актуально в среде разработки, где требуется быстрое и оперативное решение, не требующее сложной настройки.
Решения
1. Использование OSSEC
OSSEC представляет собой мощную открытую платформу для мониторинга и управления системами, которая позволяет настроить уведомления в реальном времени. Вы можете интегрировать OSSEC с вашим SMTP-сервером, чтобы отправлять оповещения по электронной почте.
- Преимущества: Поддерживает множество платформ и позволяет настраивать смешивание IDS, мониторинг журналов и SIEM-функции.
- Как настроить: Установите OSSEC на ваш сервер, настройте правила мониторинга для нужных событий и укажите параметры SMTP для отправки оповещений.
2. Использование VBScript
Для более гибкой настройки можно использовать скрипт на VBScript для мониторинга событий и отправки email-уведомлений:
- Описание работы: Скрипт будет реагировать на созданные события в журнале событий и отправлять уведомления по email посредством CDO.Message.
- Как использовать: Найдите в коде параметры Email-сервера и измените их на свои. Используйте NSSM или аналогичный инструмент для запуска скрипта как службы Windows.
3. Планировщик заданий Windows
Windows Task Scheduler позволяет настроить задачи, которые запускаются при возникновении определенных событий:
- Оптимальное использование: Подходит для простых настроек без установки дополнительного ПО.
- Как настроить: В Event Viewer на каждом нужном событии выберите "Attach Task To This Event…" и настройте запуск программы для отправки email (например, MailAlert).
4. Использование утилиты MailAlert
MailAlert — это простая утилита для отправки email:
- Настройка: Скачайте и настройте MailAlert, затем создайте задачи в Windows Task Scheduler для автоматического запуска утилиты при возникновении событий в журнале.
- Преимущества: Простота настройки и использования.
Заключение
Выбор решения зависит от ваших требований к функциональности, уровня знаний в администрировании сервера и желаемого уровня автоматизации. OSSEC предлагает наибольшую степень интеграции и контроля, но требует начальных затрат времени на настройку. Использование PBScript или Windows Task Scheduler предоставляет более легкий и быстрый путь для внедрения мониторинга и оповещения в среде разработки.