SIEM Echtzeit Alarmierung
Wazuh sendet SIEM-Alerts in Echtzeit per ntfy – einfache Integration mit Skript und Konfigurationsupdate.

Ich hatte bereits mehrfach über mein SIEM geschrieben. Gelegentlich habe ich auch erwähnt, dass ich Realtime-Informationen bevorzuge. Da ich seit einiger Zeit auf NTFY umgestiegen bin, musste auch wazuh damals entsprechend umgebaut werden, was deutlich einfacher funktionierte, als ich dachte.
Push-Server
Damit überhaupt Nachrichten verschickt werden, braucht man einen Benachrichtigungs-Server: NFTY.

Nachrichten würde ich folgendermaßen versenden:
curl -u "$MM_API_USER":"$MM_API_PASS" -H "Title: SIEM-Alert" -H "Priority: 3" -H "Tag: skull" -d "$ALERT" https://push.mein-server.de/siem
Jetzt muss wazuh noch passend konfiguriert werden.
wazuh-Config anpassen
Damit wazuh weiß, wann eine Nachricht zu senden ist, muss die zentrale Konfiguration angepasst werden. Ich habe folgenden Abschnitt hinzugefügt:
<command>
<name>wazuh2ntfy</name>
<executable>wazuh2ntfy.sh</executable>
<timeout_allowed>no</timeout_allowed>
</command>
<active-response>
<command>wazuh2ntfy</command>
<location>server</location>
<level>11</level>
</active-response>
Darin erkläre ich zuerst das neue Script. Im zweiten Abschnitt definiere ich, wann es genutzt werden soll. In diesem Fall starte ich es auf dem Wazuh-Server, sobald der Alarm-Level 11 oder größer ist.
Das wazuh Benachrichtigungs-Script
Es ist extrem wichtig, dass dieses Script dem User root:wazuh
gehört. Es muss im Verzeichnis /var/ossec/active-response/bin/
liegen und den Rechten 750
ausgestattet sein. Ist das nicht der Fall, startet der wazuh-manager nicht mehr.
root@wazuh:~ # ls -ls /var/ossec/active-response/bin/
total 288
...
24 -rwxr-x--- 1 root wazuh 21032 Jan 15 12:07 firewall-drop
20 -rwxr-x--- 1 root wazuh 19336 Jan 15 12:07 host-deny
...
4 -rwxr-x--- 1 root wazuh 389 Feb 2 14:08 wazuh2ntfy.sh
...
Wenn wazuh das Script aufruft, wird der Alarm über STDOUT auf das Script umgeleitet. Man kann ihn folglich über STDIN entgegennehmen. Ein Alarm sieht im Wesentlichen so aus:
{
"timestamp": "2025-02-06T07:08:33.330-0500",
"rule": {
"level": 3,
"description": "Host Blocked by firewall-drop Active Response",
"id": "651",
"firedtimes": 8,
"mail": false,
"groups": [
"ossec",
...
"data": {
"srcip": "190.156.238.162",
"version": "1",
"origin": {
"name": "node01",
"module": "wazuh-execd"
},
"command": "add",
"parameters": {
"extra_args": [],
"alert": {
"timestamp": "2025-02-06T07:08:31.459-0500",
"rule": {
"level": "5",
"description": "sshd: Attempt to login using a non-existent user",
"id": "5710",
"mitre": {
"id": [
...
Vielleicht ist das Feld "firedtimes": 8
aufgefallen. Dieses werte ich in einer späteren Rule aus.
Uns interessiert hier für die Echtzeitnachricht die description
und die scrip
.
#!/bin/bash
MM_API_USER="api"
MM_API_PASS="ux7Ttf0Omfqwp2yvhTSmpcMRJakJfbsxTQMmdY1"
# Alarm-Daten aus der Standardeingabe (stdin) lesen
ALARM_MESSAGE="$(cat -)"
# Extrahiert die Beschreibung
description="$(echo $ALARM_MESSAGE | jq -r '.rule.description')"
# Extrahiert die Source IP
source_ip="$(echo $ALARM_MESSAGE | jq -r '.data.srcip')"
# Nachricht an ntfy senden
curl -u "$MM_API_USER:$MM_API_PASS" -H "Title: SIEM-ALERT" -H "Priority: 3" -H "Tag: skull" -d "${source_ip}: ${description}" https://push.my-server.net/siem
exit 0
Der Test
Ich habe eine Rule geschrieben, die beobachtet, ob nach vielen fehlgeschlagenen Loginversuchen plötzlich ein erfolgreicher Login vom selben Host erfolgt. Vereinfacht gesagt: Ob eine Brute-Force-Attack erfolgreich war. Sie ist mit Level 12 eingestuft.
Ich werde versuchen diese Rule mit hydra auszulösen:
hydra -l locadmin -P /usr/share/wordlists/rockyou.txt mmcenter.dyndns.org ssh
^C
ssh locadmin@mmcenter.dyndns.org
...
Durch den zertifikatsbasierten Login ist kein Passwort erforderlich und der Alarm kommt sofort:

Fazit
Die Integration von wazuh mit ntfy ermöglicht eine einfache und effiziente Echtzeit-Benachrichtigung für SIEM-Alerts. Durch die Anpassung der Wazuh-Konfiguration und ein simples Bash-Skript werden sicherheitsrelevante Ereignisse sofort per Push-Nachricht übermittelt. Die Lösung ist leicht umzusetzen, zuverlässig und flexibel anpassbar.