Docker Stack Traefik: Unterschied zwischen den Versionen
| Zeile 1: | Zeile 1: | ||
| − | Dieser Artikel | + | Dieser Artikel baut auf dem [[Docker-Stack-Traefik|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== | ==Konzept== | ||
| − | ; | + | ; Agent auf dem Host |
| − | * | + | * Der Wazuh-Agent wird auf dem Docker-Host installiert. Über das <code>docker-listener</code>-Modul liest er die Events der Docker-Engine direkt vom Socket. |
| − | ; | + | ; Was im SIEM ankommt |
| − | * | + | * Container start, stop und die |
| + | * Image-Pulls | ||
| + | * <code>docker exec</code> in 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 <code>docker-listener</code>-Modul benötigt das Python-<code>docker</code>-SDK in der '''Wazuh-eigenen''' Python-Umgebung. Ohne dieses Modul startet der Listener still nicht. | |
| − | |||
| − | ; | + | ; SDK in die Wazuh-Python-Umgebung installieren |
| − | * | + | * <code>/var/ossec/framework/python/bin/pip3 install docker</code> |
| − | ; | + | ; Installation prüfen |
| − | * | + | * <code>/var/ossec/framework/python/bin/pip3 show docker</code> |
| − | + | ==Agent-Konfiguration (ossec.conf)== | |
| − | + | Der folgende Block kommt in die <code>/var/ossec/etc/ossec.conf</code> des Agents auf dem Docker-Host. | |
| − | + | ===docker-listener aktivieren=== | |
| − | docker- | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | ==docker- | + | <syntaxhighlight lang="xml"> |
| + | <wodle name="docker-listener"> | ||
| + | <interval>10m</interval> | ||
| + | <attempts>5</attempts> | ||
| + | <run_on_start>yes</run_on_start> | ||
| + | <disabled>no</disabled> | ||
| + | </wodle> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | ; interval / attempts | ||
| + | * Der Listener verbindet sich beim Start mit dem Docker-Socket. <code>attempts</code> regelt, 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 <code>stdout</code>. 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. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | <syntaxhighlight lang="xml"> | |
| − | + | <localfile> | |
| − | + | <log_format>json</log_format> | |
| − | + | <location>/var/lib/docker/containers/*/*-json.log</location> | |
| − | + | </localfile> | |
| − | + | </syntaxhighlight> | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | ; json-Logtreiber | |
| − | + | * Docker schreibt pro Container eine <code>*-json.log</code>. Wazuh kann diese als <code>json</code> einlesen 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). | |
| − | |||
| − | |||
| − | |||
| − | + | <syntaxhighlight lang="xml"> | |
| − | + | <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> | |
</syntaxhighlight> | </syntaxhighlight> | ||
| − | = | + | ; realtime |
| + | * <code>realtime="yes"</code> 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. | ||
| + | * <code>docker volume inspect docker-stack_nextcloud_data</code> | ||
| − | + | ==Kompletter ossec.conf-Block== | |
| − | |||
| − | + | Alle drei Bausteine (docker-listener, Anwendungslogs, FIM) am Stück zum Einfügen in die <code>/var/ossec/etc/ossec.conf</code> des Agents auf dem Docker-Host. Die Volume-Pfade ggf. an den eigenen Compose-Projektnamen anpassen. | |
| − | |||
| − | + | <syntaxhighlight lang="xml"> | |
| − | + | <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> | ||
| + | </syntaxhighlight> | ||
| − | + | ==Agent neu starten== | |
| − | |||
| − | + | <syntaxhighlight lang="bash"> | |
| − | + | systemctl restart wazuh-agent | |
| + | </syntaxhighlight> | ||
| − | == | + | ==Funktionsprüfung== |
| − | + | ===Modul-Status im Agent-Log=== | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | ; | + | ; ossec.log auf dem Agent prüfen |
| − | * | + | * <code>tail -f /var/ossec/logs/ossec.log</code> |
| − | + | ; Auf docker-listener-Meldungen achten | |
| + | * <code>grep docker-listener /var/ossec/logs/ossec.log</code> | ||
| − | + | Erscheint hier eine Meldung über ein fehlendes Python-Modul, wurde das <code>docker</code>-SDK nicht in die Wazuh-Python-Umgebung installiert (siehe oben). | |
| − | |||
| − | |||
| − | + | ===Event auslösen=== | |
| − | |||
| − | ; | + | ; Test-Container starten und wieder entfernen |
| − | * <code>docker | + | * <code>docker run --rm hello-world</code> |
| − | ; | + | ; In einen laufenden Container klettern |
| − | * <code>docker | + | * <code>docker exec -it nextcloud sh</code> |
| − | == | + | ===Im Manager prüfen=== |
| − | + | ; archives.json mitlesen (alle Events) | |
| + | * <code>tail -f /var/ossec/logs/archives/archives.json</code> | ||
| − | ; | + | ; alerts.json mitlesen (nur Alerts) |
| − | * <code> | + | * <code>tail -f /var/ossec/logs/alerts/alerts.json</code> |
| − | + | Die Docker-Events erscheinen mit dem Decoder <code>docker</code>. Das <code>docker exec</code> 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). |
| − | |||
Version vom 27. Juni 2026, 16:21 Uhr
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).