nordicmike
Goto Top

Zabbix soll pro Event eine Email versenden

Moin zusammen,

ich hätte gerne, dass mir Funde vom Defender als Email versendet werden. In der Email sollten dann die dementsprechenden Pfade zu sehen sein, wo der Admin schauen soll.

Defender meldet es als Ereignis ID 1116.

Ich habe, weil es bereits vorhanden ist, Zabbix damit gefüttert:

Item:
logeventid(/antivirus-vm/eventlog[Microsoft-Windows-Windows Defender/Operational,,,,1116,,skip],#1,"1")>1

Trigger:
logeventid(/antivirus-vm/eventlog[Microsoft-Windows-Windows Defender/Operational,,,,1116,,skip],#1,"1")>1

Das funktioniert schon mal, in der Email sieht man den kompletten Inhalt der Ereignis ID inklusive dem Pfad wo Defender den Fund gemacht hat.

Nur:
Defender meldet mehrere Funde gleichzeitig erst am Ende des Scans und schreibt mehrere Ereignisse gleichzeitig in die Event Datenbank. Zabbix registriert nur das letzte Event und man könnte so ein paar Pfade von Treffern übersehen. Es bleibt dann nichts anderes übrig als sich nochmal mit der Ereignisanzeige zu verbinden und alle Ereignisse des Tages zu durchsuchen.

Ist es möglich eine Email "pro Event" zu versenden? Evtl mit anderen Mitteln?

Danke schon mal and keep rockin'

Der Mike

Content-ID: 667933

Url: https://administrator.de/contentid/667933

Printed on: October 15, 2024 at 03:10 o'clock

NordicMike
NordicMike Sep 06, 2024 at 09:27:16 (UTC)
Goto Top
Nachtrag: Wenn ich den Mode von skip auf all ändere, wird gar nicht mehr getriggert, also dann auch keine Email mehr.
14260433693
14260433693 Sep 06, 2024, updated at Sep 09, 2024 at 09:56:31 (UTC)
Goto Top
Ist es möglich eine Email "pro Event" zu versenden? Evtl mit anderen Mitteln?
Eventtrigger im Taskplaner importieren:
<?xml version="1.0" encoding="UTF-16"?>  
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">  
  <RegistrationInfo>
    <URI>\Aufgaben der Ereignisanzeige\Windows Defender Malware Notification</URI>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Microsoft-Windows-Windows Defender/Operational"&gt;&lt;Select Path="Microsoft-Windows-Windows Defender/Operational"&gt;*[System[(EventID=1116)]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>  
	 <ValueQueries>
		 <Value name="EventRecordID">Event/System/EventRecordID</Value>  
	</ValueQueries>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">  
      <UserId>S-1-5-18</UserId>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">  
    <Exec>
      <Command>powershell</Command>
      <Arguments>-EP ByPass -File "C:\malware-info.ps1" -eventrecordid $(EventRecordID)</Arguments>  
    </Exec>
  </Actions>
</Task>

Powershell Script anlegen (Beispiel: C:\malware-info.ps1

param(
    [string]$eventrecordid
)
$event = Get-WinEvent -LogName "Microsoft-Windows-Windows Defender/Operational" -FilterXPath "*[System/EventRecordID = '$eventrecordid']"  
if ($event){
    Send-MailMessage -From 'from@domain.tld' -To 'to@domain.tld' -Subject "New Malware Threat" -Body $event.Message -SmtpServer 'smpt.domain.tld' -Port 587 -UseSsl -Encoding ([System.Text.Encoding]::UTF8) -Credential (new-Object PSCredential('USERNAME',(ConvertTo-SecureString 'PASS' -AsPlainText -Force)))   
}

Schon kommt bei jedem 1116 Event eine Mail mit den Infos aus dem Event.

Gruß
NordicMike
NordicMike Sep 06, 2024 at 11:20:26 (UTC)
Goto Top
Interessant, gleichzeitig habe ich auch in diese Richtig angefangen mich über get-winevent und get-eventlog einzulesen.

Was ich noch nicht aus dem Code erkannt habe: Wie merkt es sich welche EventRecordId bereits bearbeitet wurde und welche "noch" nicht?
14260433693
14260433693 Sep 06, 2024 updated at 11:34:45 (UTC)
Goto Top
Zitat von @NordicMike:
Was ich noch nicht aus dem Code erkannt habe: Wie merkt es sich welche EventRecordId bereits bearbeitet wurde und welche "noch" nicht?
Die EventRecordID wird aus dem Event als Variable an das Skript übergeben somit entspricht das Event automatisch dem durch welches es getriggert wurde face-wink.

Die Variable wurde im XML des Triggers deklariert
<ValueQueries>
   <Value name="EventRecordID">Event/System/EventRecordID</Value>    
</ValueQueries>

so wird sie an das Skript als Parameter übergeben
-eventrecordid $(EventRecordID)

Und hier wird die Variable im Skript in den Filter für die Abfrage des Events eingebaut
......... -FilterXPath "*[System/EventRecordID = '$eventrecordid']"   

Du kannst auch direkt einzelne Werte aus dem Event direkt an das Skript übergeben wenn du nicht alle brauchst, so verringert halt man nur die Anzahl der an das Skript übergebenen Parameter wenn man alle Eigenschaften des Events benötigt.
NordicMike
NordicMike Sep 09, 2024 at 06:18:05 (UTC)
Goto Top
Hmmm... aber er kann sich nicht "merken", dass diese Event ID bereits gesendet wurde. Beim nächsten Durchlauf wird doch die selbe Event ID wieder verarbeitet und gesendet, oder nicht?
14260433693
14260433693 Sep 09, 2024 updated at 06:48:29 (UTC)
Goto Top
Zitat von @NordicMike:

Hmmm... aber er kann sich nicht "merken", dass diese Event ID bereits gesendet wurde. Beim nächsten Durchlauf wird doch die selbe Event ID wieder verarbeitet und gesendet, oder nicht?

Nein! Die EventRecordID ist immer die aus dem jeweiligen Event, die wird aus dem Event extrahiert und an das Skript per Parameter übergeben, das ist ja der Trick 😉....

Du verwechselst hier EventID mit EventRecordID, das sind zwei ganz unterschiedliche IDs!
Das erste ist der Typ eines Events und das zweite der eindeutige Bezeichner des Events innerhalb des Defender Logs.
NordicMike
NordicMike Sep 09, 2024 at 06:54:42 (UTC)
Goto Top
Ich glaube jetzt bin ich der Sache auf der Spur: Die Aufgabenplanung wird nicht alle paar Minuten das Script neu starten, sondern nur, wenn ein neues Event rein kommt. Und ich habe die ganze Zeit das Script analysiert face-smile
14260433693
14260433693 Sep 09, 2024 updated at 07:16:30 (UTC)
Goto Top
Zitat von @NordicMike:

Ich glaube jetzt bin ich der Sache auf der Spur: Die Aufgabenplanung wird nicht alle paar Minuten das Script neu starten, sondern nur, wenn ein neues Event rein kommt.
So ist es, deswegen heißen die Dinger "Eventtrigger" 🙂
NordicMike
NordicMike Sep 09, 2024 updated at 09:28:04 (UTC)
Goto Top
Im Moment hänge ich, dass Send-MailMessage den Body "$event.Message" nicht mag. Es kommt nicht zur Sendung. Sobald ich es gegen ein "test" austausche, wird die Email gesendet.

Send-MailMessage -From 'root@xxx.xx' -To 'xxx@xxx.xx' -Subject "New Malware Threat" -Body "test" -SmtpServer 10.1.2.3 -Encoding ([System.Text.Encoding]::UTF8)

(Server 2022)
NordicMike
NordicMike Sep 09, 2024 at 09:52:42 (UTC)
Goto Top
Ich habe es mal ohne $event.Message laufen lassen.

Auch hier ist es so, dass bei 3 Events mit der Event-ID 1116 nur eine Email versendet wurde. Vermutlich holt sich das Script auch nur die Letzte.
14260433693
14260433693 Sep 09, 2024 updated at 09:58:48 (UTC)
Goto Top
Vermutlich holt sich das Script auch nur die Letzte.
Nö, klappt hier einwandfrei bei allen Events (Server 2022) ...
Im Moment hänge ich, dass Send-MailMessage den Body "$event.Message" nicht mag. Es kommt nicht zur Sendung.
Kann ich nicht nachvollziehen, klappt hier im Test auch einwandfrei, Body des Events kommt problemlos an.
Lass dir doch einfach mal die Fehlermeldungen in eine Datei ausgeben, Start-Transcript ist dein Freund