Einleitung
Die Überwachung offener Ports gehört zu den klassischen Sicherheitsmaßnahmen in Wazuh. Mit der integrierten Regel 533 („Listened ports status changed – netstat“) erkennt Wazuh zuverlässig Änderungen im Listening-Port-Status eines Systems. In der Praxis zeigt sich jedoch schnell ein Problem: Die Alerts enthalten komplette Snapshots der vorherigen und aktuellen Netstat-Ausgaben. Gerade auf Systemen mit vielen offenen Ports wird die Analyse dadurch unübersichtlich und zeitaufwendig. Für Security-Teams ist jedoch nicht der vollständige Zustand entscheidend, sondern die konkrete Änderung – also welche Ports neu geöffnet oder geschlossen wurden.
Ausgangslage / Problemstellung
Die bestehende Regel 533 funktioniert technisch korrekt. Sie erkennt Veränderungen und löst Alerts aus, sobald sich der Zustand der Listening-Ports ändert. Allerdings liefert sie im Feld full_log sowohl den vorherigen als auch den aktuellen Zustand als vollständige Ausgabe.
Das führt zu mehreren Herausforderungen:
- Große Logmengen pro Alert bei vielen offenen Ports
- Manuelle Diff-Analyse notwendig
- Keine direkte Hervorhebung der tatsächlichen Änderung
- Eingeschränkte Nutzbarkeit für automatisierte Reaktionen
Ziel ist daher eine Darstellung nach dem Prinzip:
OPENED_PORT tcp 0.0.0.0:12345
CLOSED_PORT tcp 0.0.0.0:54321
Technische Analyse
Der entscheidende Punkt liegt in der internen Funktionsweise von Wazuh:
- Die Regel 533 basiert auf Command Monitoring (
netstatbzw.ss) - Wazuh speichert dabei den vorherigen Zustand (
previous_output) - Der Vergleich erfolgt intern, aber nicht granular auf Feldebene
- Der Standard-Decoder (
ossec) verarbeitet das Ergebnis und stellt es als vollständigen Log dar
Das bedeutet:
Wazuh erkennt Änderungen, führt aber keine semantische Diff-Analyse durch, sondern vergleicht lediglich den gesamten Output als String.
Ein direktes Anpassen der Regel 533 oder des zugrunde liegenden Decoders ist aus mehreren Gründen nicht empfehlenswert:
- Built-in Decoder sind nicht update-sicher modifizierbar
- Die Logstruktur enthält keine klar trennbaren Felder für Ports
- Regex-basierte Extraktion aus vollständigen Dumps ist fehleranfällig
Auch Index-Templates helfen hier nicht weiter, da sie lediglich beeinflussen, was indexiert wird – nicht, wie Alerts entstehen.
Lösung / Best Practices
Die saubere Lösung besteht darin, die Diff-Logik vor Wazuh zu verlagern – konkret auf den Agenten. Statt Wazuh komplette Snapshots vergleichen zu lassen, erzeugt ein Script bereits die gewünschten Delta-Events.
1. Script zur Port-Differenz-Erkennung
Auf dem Agenten wird ein Script implementiert, das aktuelle und vorherige Portzustände vergleicht:
#!/bin/bashSTATE="/var/tmp/ports_prev"
CURRENT="/var/tmp/ports_now"
LOG="/var/log/netstat_port_changes.log"ss -tuln | awk 'NR>1 {print $5}' | sort > $CURRENTif [ -f "$STATE" ]; then
comm -13 $STATE $CURRENT | while read p; do
echo "$(date '+%Y-%m-%dT%H:%M:%S') OPENED_PORT $p" >> $LOG
done comm -23 $STATE $CURRENT | while read p; do
echo "$(date '+%Y-%m-%dT%H:%M:%S') CLOSED_PORT $p" >> $LOG
done
fimv $CURRENT $STATE
Dieses Script nutzt comm, um Differenzen zwischen zwei sortierten Listen zu berechnen:
- Neue Ports →
OPENED_PORT - Entfernte Ports →
CLOSED_PORT
2. Ausführung über Wazuh Command Monitoring
Integration in die Agent-Konfiguration:
<wodle name="command">
<disabled>no</disabled>
<tag>port_monitor</tag>
<command>/usr/local/bin/port_delta.sh</command>
<interval>60s</interval>
<ignore_output>yes</ignore_output>
<run_on_start>yes</run_on_start>
<timeout>0</timeout>
</wodle>
Damit wird das Script regelmäßig ausgeführt, ohne selbst Output an Wazuh zu senden.
3. Monitoring der generierten Logdatei
<localfile>
<log_format>syslog</log_format>
<location>/var/log/netstat_port_changes.log</location>
</localfile>
Jetzt übernimmt Wazuh wieder seine Kernkompetenz: strukturierte Analyse von Logs.
4. Custom Decoder
<decoder name="port_change">
<prematch>_PORT</prematch>
<regex>\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d (\w+)_PORT (\S+):(\d+)</regex>
<order>status,ip,port</order>
</decoder>
5. Custom Rules
<group name="port_change">
<rule id="100200" level="6">
<decoded_as>port_change</decoded_as>
<field name="status">OPENED</field>
<description>Port $(port) wurde geöffnet ($(ip))</description>
</rule> <rule id="100201" level="6">
<decoded_as>port_change</decoded_as>
<field name="status">CLOSED</field>
<description>Port $(port) wurde geschlossen ($(ip))</description>
</rule>
</group>
6. Optional: Regel 533 deaktivieren
Falls die neuen Alerts ausreichend sind:
<rule id="533" level="0">
Lessons Learned / Best Practices
Dieser Fall zeigt eine zentrale Designgrenze von Wazuh:
Wazuh ist stark in der Erkennung von Zustandsänderungen, aber nicht in der semantischen Interpretation komplexer Diffs innerhalb unstrukturierter Outputs.
Daraus ergeben sich wichtige Best Practices:
- Komplexe Vergleiche möglichst vor der Übergabe an Wazuh durchführen
- Wazuh für Parsing, Korrelation und Alerting nutzen, nicht für Rohdatenanalyse
- Built-in Regeln nur überschreiben, nicht umbauen
- Delta-basierte Logs sind operativ deutlich wertvoller als Zustands-Snapshots
Ein weiterer Vorteil des Script-Ansatzes ist die Flexibilität:
- Erweiterung um Protokolle (TCP/UDP)
- Whitelisting bestimmter Ports
- Integration in Incident-Response-Workflows
Fazit
Die Standardregel 533 erfüllt ihren Zweck, ist aber für operative Analysen oft zu grobgranular. Eine direkte Anpassung innerhalb von Wazuh ist weder praktikabel noch stabil. Der entscheidende Schritt ist daher, die Diff-Logik aus Wazuh herauszulösen und bereits auf Agent-Seite in klare, strukturierte Events zu überführen.
Mit einem einfachen Script, Command Monitoring und Custom Rules entsteht so eine deutlich präzisere und besser nutzbare Überwachung von Portänderungen – genau abgestimmt auf die Anforderungen moderner Security-Teams.
Quellenverweis
https://documentation.wazuh.com/current/user-manual/capabilities/command-monitoring/configuration.html
https://documentation.wazuh.com/current/user-manual/capabilities/log-data-collection/monitoring-log-files.html
https://documentation.wazuh.com/current/user-manual/ruleset/rules/index.html
https://documentation.wazuh.com/current/user-manual/ruleset/rules/custom.html#changing-existing-rules
Mehr zu Wazuh …
https://wazuh.com/?utm_source=ambassadors&utm_medium=referral&utm_campaign=ambassadors+program
Mehr zum Wazuh Ambassador Program …
https://wazuh.com/ambassadors-program/?utm_source=ambassadors&utm_medium=referral&utm_campaign=ambassadors+program
https://wazuh.slack.com/archives/C07CCCCGHHP/p1775711643821979