Wazuh Container Monitoring
Dieser Artikel baut auf dem Docker-Stack mit Traefik auf und integriert ihn in das SIEM. Der Wazuh-Agent läuft dabei auf dem Docker-Host, nicht in den Containern. Drei Telemetriequellen werden eingebunden: Docker-Engine-Events, die Anwendungslogs und Datei-Integritätsüberwachung auf den Volumes.
Konzept
- Agent auf dem Host
- Der Wazuh-Agent wird auf dem Docker-Host installiert. Über das
docker-listener-Modul liest er die Events der Docker-Engine direkt vom Socket.
- Was im SIEM ankommt
- Container start, stop und die
- Image-Pulls
docker execin laufende Container (jemand klettert in den Container)- Netzwerk- und Volume-Events
- Drei Quellen
- Engine-Events (docker-listener), Anwendungslogs (Traefik, Nextcloud, MediaWiki) und FIM auf den Daten-Volumes.
Voraussetzung: Python-Modul docker
Das docker-listener-Modul benötigt das Python-docker-SDK in der Wazuh-eigenen Python-Umgebung. Ohne dieses Modul startet der Listener still nicht.
- SDK in die Wazuh-Python-Umgebung installieren
/var/ossec/framework/python/bin/pip3 install docker
- Installation prüfen
/var/ossec/framework/python/bin/pip3 show docker
Agent-Konfiguration (ossec.conf)
Der folgende Block kommt in die /var/ossec/etc/ossec.conf des Agents auf dem Docker-Host.
docker-listener aktivieren
<wodle name="docker-listener">
<interval>10m</interval>
<attempts>5</attempts>
<run_on_start>yes</run_on_start>
<disabled>no</disabled>
</wodle>
- interval / attempts
- Der Listener verbindet sich beim Start mit dem Docker-Socket.
attemptsregelt, wie oft er es bei Nichterreichbarkeit erneut versucht.
- run_on_start
- Startet das Modul direkt beim Hochfahren des Agents, nicht erst nach dem ersten Intervall.
Anwendungslogs einsammeln
Die Container loggen auf stdout. Bei json-file-Logtreiber liegen die Logs auf dem Host und können direkt als Datei eingelesen werden. Einfacher und stabiler ist es, die relevanten Anwendungslogs auf ein gemountetes Verzeichnis zu schreiben und dieses zu überwachen.
<localfile>
<log_format>json</log_format>
<location>/var/lib/docker/containers/*/*-json.log</location>
</localfile>
- json-Logtreiber
- Docker schreibt pro Container eine
*-json.log. Wazuh kann diese alsjsoneinlesen und die Felder direkt auswerten.
FIM auf den Volumes
Datei-Integritätsüberwachung auf den Daten-Volumes der Anwendungen. Veränderungen an hochgeladenen Dateien oder an der Wiki-Konfiguration lösen ein FIM-Event aus (Rule 554 bei neuen Dateien).
<syscheck>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_nextcloud_data/_data/data</directories>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_mediawiki_data/_data</directories>
</syscheck>
- realtime
realtime="yes"meldet Änderungen sofort über inotify, statt erst beim nächsten Scan-Durchlauf.
- Volume-Pfade
- Die genauen Pfade hängen vom Compose-Projektnamen ab (Präfix des Verzeichnisses). Mit dem folgenden Befehl ermitteln.
docker volume inspect docker-stack_nextcloud_data
Kompletter ossec.conf-Block
Alle drei Bausteine (docker-listener, Anwendungslogs, FIM) am Stück zum Einfügen in die /var/ossec/etc/ossec.conf des Agents auf dem Docker-Host. Die Volume-Pfade ggf. an den eigenen Compose-Projektnamen anpassen.
<wodle name="docker-listener">
<interval>10m</interval>
<attempts>5</attempts>
<run_on_start>yes</run_on_start>
<disabled>no</disabled>
</wodle>
<localfile>
<log_format>json</log_format>
<location>/var/lib/docker/containers/*/*-json.log</location>
</localfile>
<syscheck>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_nextcloud_data/_data/data</directories>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_mediawiki_data/_data</directories>
</syscheck>
Agent neu starten
systemctl restart wazuh-agent
Funktionsprüfung
Modul-Status im Agent-Log
- ossec.log auf dem Agent prüfen
tail -f /var/ossec/logs/ossec.log
- Auf docker-listener-Meldungen achten
grep docker-listener /var/ossec/logs/ossec.log
Erscheint hier eine Meldung über ein fehlendes Python-Modul, wurde das docker-SDK nicht in die Wazuh-Python-Umgebung installiert (siehe oben).
Event auslösen
- Test-Container starten und wieder entfernen
docker run --rm hello-world
- In einen laufenden Container klettern
docker exec -it nextcloud sh
Im Manager prüfen
- archives.json mitlesen (alle Events)
tail -f /var/ossec/logs/archives/archives.json
- alerts.json mitlesen (nur Alerts)
tail -f /var/ossec/logs/alerts/alerts.json
Die Docker-Events erscheinen mit dem Decoder docker. Das docker exec ist didaktisch der interessanteste Fall: Es zeigt, dass ein Eindringen in einen laufenden Container im SIEM sichtbar wird.
Hinweis zum Datenfluss
- Engine-Events vs. Anwendungslogs
- Der docker-listener meldet, dass ein Container gestartet oder betreten wurde – nicht, was innerhalb der Anwendung passiert. Für Angriffe auf die Webanwendung (z.B. gegen MediaWiki oder Nextcloud) liefern die Anwendungslogs und FIM die Telemetrie.
- Zusammenspiel
- Erst die Kombination macht das Bild vollständig: Engine-Ebene (Container-Lifecycle), Anwendungs-Ebene (Logs) und Datei-Ebene (FIM).