Wazug HAProxy WAF mit Coraza: Unterschied zwischen den Versionen
| (2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 62: | Zeile 62: | ||
setfacl -m u:wazuh:r /var/log/coraza/audit.log | setfacl -m u:wazuh:r /var/log/coraza/audit.log | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | === Neustarten des Wazuh Agents === | ||
| + | *systemctl restart wazuh-agent.service | ||
==== Decoder und Regel (auf dem Wazuh-Manager) ==== | ==== Decoder und Regel (auf dem Wazuh-Manager) ==== | ||
Coraza-JSON wird vom generischen JSON-Decoder zerlegt, aber von keiner eingebauten Regel klassifiziert. Beides ergänzen. | Coraza-JSON wird vom generischen JSON-Decoder zerlegt, aber von keiner eingebauten Regel klassifiziert. Beides ergänzen. | ||
| + | |||
;Decoder in ''/var/ossec/etc/decoders/local-coraza_decoders.xml'' | ;Decoder in ''/var/ossec/etc/decoders/local-coraza_decoders.xml'' | ||
| − | |||
<pre> | <pre> | ||
<decoder name="coraza-audit"> | <decoder name="coraza-audit"> | ||
| Zeile 73: | Zeile 75: | ||
</decoder> | </decoder> | ||
</pre> | </pre> | ||
| − | ;Regel in ''/var/ossec/etc/rules/local_rules.xml'' | + | ;Regel in ''/var/ossec/etc/rules/local_rules.xml'' ergänzen |
<pre> | <pre> | ||
<group name="coraza,waf,"> | <group name="coraza,waf,"> | ||
| Zeile 83: | Zeile 85: | ||
<rule id="100101" level="10"> | <rule id="100101" level="10"> | ||
<if_sid>100100</if_sid> | <if_sid>100100</if_sid> | ||
| − | <description>Coraza WAF: Angriff geblockt.</description> | + | <field name="transaction.is_interrupted">true</field> |
| + | <description>Coraza WAF: Angriff geblockt auf $(transaction.request.uri) von $(transaction.client_ip).</description> | ||
<group>attack,web,</group> | <group>attack,web,</group> | ||
</rule> | </rule> | ||
</group> | </group> | ||
</pre> | </pre> | ||
| − | ;Manager neu starten | + | ;Eigentümer und Rechte setzen |
| + | <syntaxhighlight lang="bash"> | ||
| + | chown wazuh:wazuh /var/ossec/etc/decoders/local-coraza_decoders.xml /var/ossec/etc/rules/local_rules.xml | ||
| + | chmod 660 /var/ossec/etc/decoders/local-coraza_decoders.xml /var/ossec/etc/rules/local_rules.xml | ||
| + | </syntaxhighlight> | ||
| + | ;Vor dem Neustart mit logtest prüfen — eine echte JSON-Audit-Zeile reinpasten | ||
| + | * /var/ossec/bin/wazuh-logtest | ||
| + | Erwartete Ausgabe: ''transaction.is_interrupted: 'true''' in Phase 2 und ''Rule id: '100101''' in Phase 3. | ||
| + | ;Erst dann Manager neu starten | ||
* systemctl restart wazuh-manager | * systemctl restart wazuh-manager | ||
Aktuelle Version vom 1. Juli 2026, 13:12 Uhr
Wazuh-Anbindung der WAF (Coraza)
Die WAF (HAProxy + Coraza-SPOA) liefert die Abwehr-Telemetrie an das SIEM: welcher Angriff wurde von welcher Regel geblockt. Das ergänzt die VulnSite-Sicht — dort sieht Wazuh den Angriffsversuch im Apache-Log, hier sieht es die Abwehr davor.
Hinweis: Wazuhs eingebaute ModSecurity-Regeln greifen nur auf das Apache-error.log klassischer ModSecurity. Coraza-SPOA schreibt ein eigenes Audit-Log und läuft nicht über Apache — daher binden wir das Coraza-JSON-Audit-Log ein und ergänzen einen eigenen Decoder samt Regel auf dem Manager.
Repository einrichten
- GPG-Schlüssel importieren
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import
chmod 644 /usr/share/keyrings/wazuh.gpg
- Repository hinzufügen
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" > /etc/apt/sources.list.d/wazuh.list
apt update
Agent installieren
- Agent mit Manager-Adresse und Namen installieren
WAZUH_MANAGER="wazuh.dkbi.com" WAZUH_AGENT_NAME="waf" apt install -y wazuh-agent
- Dienst aktivieren und starten
systemctl daemon-reload
systemctl enable --now wazuh-agent
- Repository deaktivieren
sed -i "s/^deb /#deb /" /etc/apt/sources.list.d/wazuh.list
apt update
Coraza-Audit-Log auf JSON umstellen
Das Audit-Log liegt standardmäßig im nativen ModSecurity-Format (Multiline mit Trennern wie --aaCuCNaqNi-A--). Das kann Wazuh nicht sauber parsen. Auf JSON umstellen.
- In /etc/coraza-spoa/coraza-spoa.yaml ergänzen
SecAuditLogFormat JSON
- Daemon neu starten
- systemctl restart coraza-spoa
- Eine Zeile prüfen — muss jetzt mit { beginnen
- tail -1 /var/log/coraza/audit.log
Audit-Log anbinden
- In /var/ossec/etc/ossec.conf auf der WAF
<localfile> <log_format>json</log_format> <location>/var/log/coraza/audit.log</location> </localfile>
Leserechte für den Agent
Der wazuh-User muss das Audit-Log lesen können, sonst werden keine Ereignisse übertragen.
- Zugriff testen
- sudo -u wazuh cat /var/log/coraza/audit.log > /dev/null
- Bei "Permission denied" Gruppe/Rechte setzen
chmod 640 /var/log/coraza/audit.log
setfacl -m u:wazuh:rx /var/log/coraza/
setfacl -m u:wazuh:r /var/log/coraza/audit.log
Neustarten des Wazuh Agents
- systemctl restart wazuh-agent.service
Decoder und Regel (auf dem Wazuh-Manager)
Coraza-JSON wird vom generischen JSON-Decoder zerlegt, aber von keiner eingebauten Regel klassifiziert. Beides ergänzen.
- Decoder in /var/ossec/etc/decoders/local-coraza_decoders.xml
<decoder name="coraza-audit">
<prematch>^{"transaction":</prematch>
<plugin_decoder>JSON_Decoder</plugin_decoder>
</decoder>
- Regel in /var/ossec/etc/rules/local_rules.xml ergänzen
<group name="coraza,waf,">
<rule id="100100" level="0">
<decoded_as>json</decoded_as>
<field name="transaction.client_ip">\.+</field>
<description>Coraza WAF Audit-Log.</description>
</rule>
<rule id="100101" level="10">
<if_sid>100100</if_sid>
<field name="transaction.is_interrupted">true</field>
<description>Coraza WAF: Angriff geblockt auf $(transaction.request.uri) von $(transaction.client_ip).</description>
<group>attack,web,</group>
</rule>
</group>
- Eigentümer und Rechte setzen
chown wazuh:wazuh /var/ossec/etc/decoders/local-coraza_decoders.xml /var/ossec/etc/rules/local_rules.xml
chmod 660 /var/ossec/etc/decoders/local-coraza_decoders.xml /var/ossec/etc/rules/local_rules.xml
- Vor dem Neustart mit logtest prüfen — eine echte JSON-Audit-Zeile reinpasten
- /var/ossec/bin/wazuh-logtest
Erwartete Ausgabe: transaction.is_interrupted: 'true in Phase 2 und Rule id: '100101 in Phase 3.
- Erst dann Manager neu starten
- systemctl restart wazuh-manager
Kontrolle
- Angriff von der Kali gegen die WAF
curl "http://waf.it213.xinmen.de/?id=1'+OR+'1'='1"
- Im Dashboard
- Öffne Threat Hunting, Filter rule.id:100101
- Der Alert "Coraza WAF: Angriff geblockt" muss erscheinen