Wazuh Container Monitoring: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(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-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.
+
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 (Traefik, Nextcloud, MediaWiki) und FIM auf den Daten-Volumes.
+
* 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>&lt;verzeichnis&gt;_&lt;volume&gt;</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 aktivieren===
+
===docker-listener===
  
 
<syntaxhighlight lang="xml">
 
<syntaxhighlight lang="xml">
Zeile 39: Zeile 49:
 
</wodle>
 
</wodle>
 
</syntaxhighlight>
 
</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
 
; 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.
  
===Anwendungslogs einsammeln===
+
; attempts
 +
* Anzahl der Verbindungsversuche zum Docker-Socket, falls dieser beim Start noch nicht bereit ist.
  
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.
+
===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 kann diese als <code>json</code> einlesen und die Felder direkt auswerten.
+
* 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===
 
 
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">
 
<syntaxhighlight lang="xml">
 
<syscheck>
 
<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/nextcloud_data/_data/data</directories>
   <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_mediawiki_data/_data</directories>
+
   <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.
 
 
; 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==
 
==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.
+
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/docker-stack_nextcloud_data/_data/data</directories>
+
   <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/docker-stack_mediawiki_data/_data</directories>
+
   <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 prüfen
+
; 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 achten
+
; 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 wieder entfernen
+
; 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===
  
; archives.json mitlesen (alle Events)
+
; alle Events mitlesen
 
* <code>tail -f /var/ossec/logs/archives/archives.json</code>
 
* <code>tail -f /var/ossec/logs/archives/archives.json</code>
  
; alerts.json mitlesen (nur Alerts)
+
; 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 (z.B. gegen MediaWiki oder Nextcloud) liefern die Anwendungslogs und FIM die Telemetrie.
+
* 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 exec in 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 als json ein 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).