Windows 事件日志 - 电子邮件通知

Windows 事件日志 - 电子邮件通知

当特定服务的特定严重性事件到达 Windows 服务器事件日志时,是否有一种简单的方法可以发送电子邮件?这在 Windows Server 2003 上,如果有区别的话。

注意:我们确实对我工作场所的生产服务器进行了适当的监控和警报,但我们只是需要为开发中的这项服务提供快速解决方案。

答案1

你可以这样做操作系统安全评估中心,一款多平台开源软件:

OSSEC 是一个用于监控和控制系统的完整平台。它将 HIDS(基于主机的入侵检测)、日志监控和 SIM/SIEM 的所有方面融合在一个简单、强大且开源的解决方案中。

对于日志监控/警报:

实时且可配置的警报

OSSEC 允许客户配置他们想要收到警报的事件,这样他们就可以专注于提高关键事件的优先级,而不是任何系统上的常规噪音。与 smtp、sms 和 syslog 的集成允许客户通过将这些警报发送到电子邮件和手持设备(如手机和寻呼机)来掌握警报。

[...]

网络中的每个操作系统、应用程序和设备都会生成日志(事件),让您了解正在发生的事情。OSSEC 会收集、分析和关联这些日志,让您知道是否发生了错误(攻击、误用、错误等)。

这是一个360° Security 上有关 OSSEC 的文章


专业的商业替代方案:事件追踪器(Prism Microssystems):

EventTracker 是一个完整的安全信息和事件管理 (SIEM) 解决方案,它将实时日志管理与强大的配置和变更管理结合在一个交钥匙软件包中。

答案2

这是我编写的另一个愚蠢的 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) & "/" & Mid(objEvent.TargetInstance.TimeGenerated, 7, 2) & "/" & 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 服务运行非吸吮服务经理或 SRVANY 进行安装。使用 NSSM,命令行如下:

nssm install SimpleEventLogMonitor %SystemRoot%\System32\cscript.exe "\"Pull_path_and_filename_of_script\""

请务必替换您的电子邮件收件人、发件人和 SMTP 服务器名称。

您可以使用“PushEventToMonitor”调用定义要发出警报的事件。参数包括:事件 ID、事件日志名称、来源、类别、类型、用户以及可以与日志消息匹配的正则表达式。我有一个与 TELNET 服务的启动/停止匹配的示例,以及一个与脚本本身的启动匹配的示例(将事件记录到应用程序日志中)。

这是初稿,因为我为客户编写的版本实际上“已投入生产”,是他们出钱写的,并且“属于”他们。因此,我重新编写了此版本(实际上与客户使用的版本有很大不同),其中可能隐藏着愚蠢的错误。今晚我在我的一些系统上运行了一段时间,没有发现任何问题。

也许我最终会让它变得更好一点。如果它能从注册表中提取配置(这样就可以用组策略来控制),并且将其打包为 MSI 以便轻松部署到服务器组,那就太好了。哦,好吧。

答案3

您可以使用 Windows 任务执行此操作
参见此处http://www.vistax64.com/tutorials/67961-event-viewer-email-notification.html

答案4

GFI 的集中事件日志管理工具(GFI 活动管理器) 确实做到了这一点,尽管它不是 FOSS。

实时警报、SNMPv2 陷阱警报 包括

GFI EventsManager™ 的最新版本提高了在网络上检测到的关键事件或入侵的警报级别。GFI EventsManager 允许您触发脚本等操作,或通过电子邮件、网络消息、通过电子邮件到短信网关或服务发送的短信通知向一个或多个人发送警报,现在包括 SNMPv2 陷阱。SNMP 警报的生成还将允许管理员将 GFI EventsManager 与预先存在或通用的监控机制集成。

相关内容