Wazuh Container Monitoring: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „Dieser Artikel baut auf dem Docker-Stack mit Traefik auf und integriert ihn in das SIEM. Der Wazuh-Agent läuft dabei auf dem '''Docke…“) |
|||
| Zeile 1: | Zeile 1: | ||
| − | Dieser Artikel baut auf dem [[Docker-Stack-Traefik|Docker- | + | Dieser Artikel baut auf dem [[Docker-Stack-Traefik|Docker-Aufbau mit Traefik]] auf und integriert ihn in das SIEM. Der Wazuh-Agent läuft 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== | ==Konzept== | ||
| Zeile 13: | Zeile 13: | ||
; Drei Quellen | ; Drei Quellen | ||
| − | * Engine-Events (docker-listener), Anwendungslogs ( | + | * Engine-Events (docker-listener), Anwendungslogs (Container-stdout) und FIM auf den Daten-Volumes. |
==Voraussetzung: Python-Modul docker== | ==Voraussetzung: Python-Modul docker== | ||
| Zeile 24: | Zeile 24: | ||
; Installation prüfen | ; Installation prüfen | ||
* <code>/var/ossec/framework/python/bin/pip3 show docker</code> | * <code>/var/ossec/framework/python/bin/pip3 show docker</code> | ||
| + | |||
| + | ==Volume-Pfade ermitteln== | ||
| + | |||
| + | Da jede Anwendung ein eigenes Compose-Projekt ist, lautet der Volume-Name <code><verzeichnis>_<volume></code>. Bei den Verzeichnissen <code>nextcloud/</code> und <code>mediawiki/</code> also <code>nextcloud_data</code> und <code>mediawiki_data</code>. Im Zweifel prüfen: | ||
| + | |||
| + | ; Volumes auflisten | ||
| + | * <code>docker volume ls</code> | ||
| + | |||
| + | ; Mountpoint eines Volumes anzeigen | ||
| + | * <code>docker volume inspect nextcloud_data</code> | ||
==Agent-Konfiguration (ossec.conf)== | ==Agent-Konfiguration (ossec.conf)== | ||
| Zeile 29: | Zeile 39: | ||
Der folgende Block kommt in die <code>/var/ossec/etc/ossec.conf</code> des Agents auf dem Docker-Host. | Der folgende Block kommt in die <code>/var/ossec/etc/ossec.conf</code> des Agents auf dem Docker-Host. | ||
| − | ===docker-listener | + | ===docker-listener=== |
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
| Zeile 39: | Zeile 49: | ||
</wodle> | </wodle> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | |||
| − | |||
| − | |||
; run_on_start | ; run_on_start | ||
* Startet das Modul direkt beim Hochfahren des Agents, nicht erst nach dem ersten Intervall. | * Startet das Modul direkt beim Hochfahren des Agents, nicht erst nach dem ersten Intervall. | ||
| − | + | ; attempts | |
| + | * Anzahl der Verbindungsversuche zum Docker-Socket, falls dieser beim Start noch nicht bereit ist. | ||
| − | + | ===Anwendungslogs=== | |
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
| Zeile 58: | Zeile 66: | ||
; json-Logtreiber | ; json-Logtreiber | ||
| − | * Docker schreibt pro Container eine <code>*-json.log</code>. Wazuh | + | * Docker schreibt pro Container eine <code>*-json.log</code>. Wazuh liest diese als <code>json</code> ein und kann die Felder direkt auswerten. |
| − | ==FIM auf den Volumes== | + | ===FIM auf den Volumes=== |
| − | |||
| − | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<syscheck> | <syscheck> | ||
| − | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/ | + | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/nextcloud_data/_data/data</directories> |
| − | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/ | + | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/mediawiki_data/_data</directories> |
</syscheck> | </syscheck> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
; realtime | ; realtime | ||
| − | * <code>realtime="yes"</code> meldet Änderungen sofort über inotify, statt erst beim nächsten Scan-Durchlauf. | + | * <code>realtime="yes"</code> meldet Änderungen sofort über inotify, statt erst beim nächsten Scan-Durchlauf. Neue Dateien lösen Rule 554 aus. |
| − | |||
| − | |||
| − | |||
| − | |||
==Kompletter ossec.conf-Block== | ==Kompletter ossec.conf-Block== | ||
| − | Alle drei Bausteine | + | Alle drei Bausteine am Stück zum Einfügen. Volume-Pfade ggf. an die tatsächlichen Namen anpassen. |
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
| Zeile 96: | Zeile 98: | ||
<syscheck> | <syscheck> | ||
| − | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/ | + | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/nextcloud_data/_data/data</directories> |
| − | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/ | + | <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/mediawiki_data/_data</directories> |
</syscheck> | </syscheck> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Zeile 111: | Zeile 113: | ||
===Modul-Status im Agent-Log=== | ===Modul-Status im Agent-Log=== | ||
| − | ; ossec.log auf dem Agent | + | ; ossec.log auf dem Agent verfolgen |
* <code>tail -f /var/ossec/logs/ossec.log</code> | * <code>tail -f /var/ossec/logs/ossec.log</code> | ||
| − | ; Auf docker-listener-Meldungen | + | ; Auf docker-listener-Meldungen filtern |
* <code>grep docker-listener /var/ossec/logs/ossec.log</code> | * <code>grep docker-listener /var/ossec/logs/ossec.log</code> | ||
| Zeile 121: | Zeile 123: | ||
===Event auslösen=== | ===Event auslösen=== | ||
| − | ; Test-Container starten und | + | ; Test-Container starten und entfernen |
* <code>docker run --rm hello-world</code> | * <code>docker run --rm hello-world</code> | ||
| Zeile 129: | Zeile 131: | ||
===Im Manager prüfen=== | ===Im Manager prüfen=== | ||
| − | ; | + | ; alle Events mitlesen |
* <code>tail -f /var/ossec/logs/archives/archives.json</code> | * <code>tail -f /var/ossec/logs/archives/archives.json</code> | ||
| − | ; | + | ; nur Alerts mitlesen |
* <code>tail -f /var/ossec/logs/alerts/alerts.json</code> | * <code>tail -f /var/ossec/logs/alerts/alerts.json</code> | ||
| Zeile 140: | Zeile 142: | ||
; Engine-Events vs. Anwendungslogs | ; 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 | + | * Der docker-listener meldet, '''dass''' ein Container gestartet oder betreten wurde – nicht, was innerhalb der Anwendung passiert. Für Angriffe auf die Webanwendung liefern die Anwendungslogs und FIM die Telemetrie. |
; Zusammenspiel | ; Zusammenspiel | ||
* Erst die Kombination macht das Bild vollständig: Engine-Ebene (Container-Lifecycle), Anwendungs-Ebene (Logs) und Datei-Ebene (FIM). | * Erst die Kombination macht das Bild vollständig: Engine-Ebene (Container-Lifecycle), Anwendungs-Ebene (Logs) und Datei-Ebene (FIM). | ||
Version vom 27. Juni 2026, 16:27 Uhr
Dieser Artikel baut auf dem Docker-Aufbau mit Traefik auf und integriert ihn in das SIEM. Der Wazuh-Agent läuft 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 (Container-stdout) 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
Volume-Pfade ermitteln
Da jede Anwendung ein eigenes Compose-Projekt ist, lautet der Volume-Name <verzeichnis>_<volume>. Bei den Verzeichnissen nextcloud/ und mediawiki/ also nextcloud_data und mediawiki_data. Im Zweifel prüfen:
- Volumes auflisten
docker volume ls
- Mountpoint eines Volumes anzeigen
docker volume inspect nextcloud_data
Agent-Konfiguration (ossec.conf)
Der folgende Block kommt in die /var/ossec/etc/ossec.conf des Agents auf dem Docker-Host.
docker-listener
<wodle name="docker-listener">
<interval>10m</interval>
<attempts>5</attempts>
<run_on_start>yes</run_on_start>
<disabled>no</disabled>
</wodle>
- run_on_start
- Startet das Modul direkt beim Hochfahren des Agents, nicht erst nach dem ersten Intervall.
- attempts
- Anzahl der Verbindungsversuche zum Docker-Socket, falls dieser beim Start noch nicht bereit ist.
Anwendungslogs
<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 liest diese alsjsonein und kann die Felder direkt auswerten.
FIM auf den Volumes
<syscheck>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/nextcloud_data/_data/data</directories>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/mediawiki_data/_data</directories>
</syscheck>
- realtime
realtime="yes"meldet Änderungen sofort über inotify, statt erst beim nächsten Scan-Durchlauf. Neue Dateien lösen Rule 554 aus.
Kompletter ossec.conf-Block
Alle drei Bausteine am Stück zum Einfügen. Volume-Pfade ggf. an die tatsächlichen Namen 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/nextcloud_data/_data/data</directories>
<directories check_all="yes" realtime="yes">/var/lib/docker/volumes/mediawiki_data/_data</directories>
</syscheck>
Agent neu starten
systemctl restart wazuh-agent
Funktionsprüfung
Modul-Status im Agent-Log
- ossec.log auf dem Agent verfolgen
tail -f /var/ossec/logs/ossec.log
- Auf docker-listener-Meldungen filtern
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 entfernen
docker run --rm hello-world
- In einen laufenden Container klettern
docker exec -it nextcloud sh
Im Manager prüfen
- alle Events mitlesen
tail -f /var/ossec/logs/archives/archives.json
- nur Alerts mitlesen
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 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).