Wazuh-Anbindung der WAF (Coraza) Rocky: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „=Wazuh-Anbindung der WAF (Coraza)= Die '''WAF''' (HAProxy + Coraza-SPOA) liefert die Abwehr-Telemetrie an das SIEM: welcher Angriff wurde von welcher Regel geb…“) |
|||
| (4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 37: | Zeile 37: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | == | + | == Audit-Log in Coraza aktivieren == |
| − | + | Die Grundinstallation aus [[WAF-Demo: HAProxy mit Coraza auf Rocky Linux]] setzt nur ''SecRuleEngine On''. Coraza blockt damit zwar, protokolliert die Treffer aber nirgends. Ohne Audit-Log hat der Agent nichts zu lesen. | |
| − | '''Wichtig:''' '' | + | '''Wichtig:''' Die ''SecAudit''-Direktiven sind SecRules-Anweisungen, keine YAML-Optionen. Sie gehören in den ''directives''-Block der Anwendung — und '''hinter''' die Includes, da ''@coraza.conf-recommended'' eigene Audit-Voreinstellungen mitbringt, die sonst gewinnen. |
| − | ;In ''/etc/coraza-spoa/ | + | |
| + | ;Zielverzeichnis anlegen | ||
| + | <syntaxhighlight lang="bash"> | ||
| + | mkdir -p /var/log/coraza | ||
| + | </syntaxhighlight> | ||
| + | ;In ''/etc/coraza-spoa/config.yaml'' den ''directives''-Block der Anwendung ''revproxy'' ergänzen | ||
<syntaxhighlight lang="yaml"> | <syntaxhighlight lang="yaml"> | ||
| − | |||
| − | |||
directives: | | directives: | | ||
| + | Include @coraza.conf-recommended | ||
| + | Include /etc/coraza-spoa/crs-setup.conf | ||
| + | Include /etc/coraza-spoa/coreruleset/rules/*.conf | ||
SecRuleEngine On | SecRuleEngine On | ||
SecAuditEngine RelevantOnly | SecAuditEngine RelevantOnly | ||
| + | SecAuditLogRelevantStatus "^(?:4|5)" | ||
| + | SecAuditLogParts ABIJDEFHZ | ||
SecAuditLogType Serial | SecAuditLogType Serial | ||
SecAuditLogFormat JSON | SecAuditLogFormat JSON | ||
SecAuditLog /var/log/coraza/audit.log | SecAuditLog /var/log/coraza/audit.log | ||
| − | |||
| − | |||
| − | |||
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | ; | + | ;Bedeutung der Zeilen |
| + | * ''SecAuditEngine RelevantOnly'' — nur auffällige Transaktionen, nicht jeder normale Seitenaufruf | ||
| + | * ''SecAuditLogRelevantStatus'' — was als auffällig gilt; hier alle 4xx und 5xx, damit der 403 der WAF sicher erfasst wird | ||
| + | * ''SecAuditLogType Serial'' — eine gemeinsame Logdatei. Ohne diese Zeile legt Coraza pro Transaktion eine eigene Datei in einem Verzeichnisbaum an, und der Agent findet nichts | ||
| + | * ''SecAuditLogFormat JSON'' — statt des nativen ModSecurity-Formats (Multiline mit Trennern wie ''--aaCuCNaqNi-A--''), das Wazuh nicht parsen kann | ||
;Daemon neu starten | ;Daemon neu starten | ||
| − | + | <syntaxhighlight lang="bash"> | |
| − | ; | + | systemctl restart coraza-spoa |
| − | + | systemctl status coraza-spoa | |
| + | </syntaxhighlight> | ||
| + | ;Angriff absetzen und eine Zeile prüfen — muss mit { beginnen | ||
| + | <syntaxhighlight lang="bash"> | ||
| + | Über den browser auf www.it2XX.xinmen.de und dann eine SQL Injection auslösen. | ||
| + | tail -1 /var/log/coraza/audit.log | ||
| + | </syntaxhighlight> | ||
== Audit-Log anbinden == | == Audit-Log anbinden == | ||
| Zeile 73: | Zeile 87: | ||
* /var/ossec/bin/wazuh-logcollector -t | * /var/ossec/bin/wazuh-logcollector -t | ||
| − | == SELinux | + | <!--- |
| − | + | ||
| − | ;Kontext prüfen | + | == SELinux und Leserechte == |
| + | Beide Dienste laufen auf dieser Maschine unbeschränkt — coraza-spoa als eigene Unit ohne Policy, der Wazuh-Logcollector als ''root''. In der Regel ist hier nichts zu tun. Die folgenden Schritte sind Kontrollen für den Fall, dass das Audit-Log zwar gefüllt wird, aber nichts im SIEM ankommt. | ||
| + | ;Kontext prüfen — erwartet wird ''var_log_t'' | ||
* ls -Zd /var/log/coraza /var/log/coraza/audit.log | * ls -Zd /var/log/coraza /var/log/coraza/audit.log | ||
| − | ; | + | ;Bei abweichendem Kontext dauerhaft setzen |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
semanage fcontext -a -t var_log_t "/var/log/coraza(/.*)?" | semanage fcontext -a -t var_log_t "/var/log/coraza(/.*)?" | ||
| Zeile 84: | Zeile 100: | ||
;Gegenprobe bei Verdacht auf SELinux | ;Gegenprobe bei Verdacht auf SELinux | ||
* ausearch -m avc -ts recent | * ausearch -m avc -ts recent | ||
| − | + | ;Lesezugriff testen | |
| − | |||
| − | |||
| − | ; | ||
* sudo -u wazuh cat /var/log/coraza/audit.log > /dev/null | * sudo -u wazuh cat /var/log/coraza/audit.log > /dev/null | ||
| − | ; | + | ;Nur bei "Permission denied" — ''acl'' ist auf Rocky-Minimal nicht vorinstalliert |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
dnf install -y acl | dnf install -y acl | ||
| − | |||
setfacl -m u:wazuh:rx /var/log/coraza/ | setfacl -m u:wazuh:rx /var/log/coraza/ | ||
setfacl -m u:wazuh:r /var/log/coraza/audit.log | setfacl -m u:wazuh:r /var/log/coraza/audit.log | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | ---> | ||
== Agent neu starten == | == Agent neu starten == | ||
| − | + | <syntaxhighlight lang="bash"> | |
| + | systemctl restart wazuh-agent | ||
| + | </syntaxhighlight> | ||
;Kontrolle, dass die Datei überwacht wird | ;Kontrolle, dass die Datei überwacht wird | ||
* grep "audit.log" /var/ossec/logs/ossec.log | * grep "audit.log" /var/ossec/logs/ossec.log | ||
| + | Der Logcollector liest nur Zeilen, die '''nach''' dem Öffnen der Datei dazukommen. Angriffe von vorher tauchen nicht mehr auf. | ||
== Decoder und Regel (auf dem Wazuh-Manager) == | == Decoder und Regel (auf dem Wazuh-Manager) == | ||
| Zeile 127: | Zeile 143: | ||
</group> | </group> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | ;Regel-IDs prüfen | ||
| + | Sind 100100/100101 auf diesem Manager bereits vergeben, startet ''wazuh-manager'' nicht mehr und meldet ''Duplicated rule ID'' im ossec.log. Dann auf freie IDs ausweichen. | ||
| + | * grep -rh 'rule id="1001' /var/ossec/etc/rules/ | ||
;Eigentümer und Rechte setzen | ;Eigentümer und Rechte setzen | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
| Zeile 141: | Zeile 160: | ||
;Angriff von der Kali gegen die WAF | ;Angriff von der Kali gegen die WAF | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
| − | + | Angriff über die Weboberfläche www.it2XX.xinmen.de - Command und SQl Injection | |
</syntaxhighlight> | </syntaxhighlight> | ||
;Im Dashboard | ;Im Dashboard | ||
* Öffne ''Threat Hunting'', Filter ''rule.id:100101'' | * Öffne ''Threat Hunting'', Filter ''rule.id:100101'' | ||
* Der Alert "Coraza WAF: Angriff geblockt" muss erscheinen | * Der Alert "Coraza WAF: Angriff geblockt" muss erscheinen | ||
| + | ;Beide Blickwinkel nebeneinander | ||
| + | * Filter ''rule.id:100101 OR rule.id:31103'' zeigt die geblockte Anfrage auf der WAF und — falls durchgelassen — dieselbe Anfrage im Apache-Log der VulnSite | ||
== Fehlersuche == | == Fehlersuche == | ||
| − | + | Die Kette von unten nach oben prüfen, in dieser Reihenfolge. | |
| − | ;1. Schreibt Coraza | + | ;1. Blockt Coraza überhaupt? |
| + | <syntaxhighlight lang="bash"> | ||
| + | curl -k -o /dev/null -w "%{http_code}\n" "https://waf.it2XX.xinmen.de/?id=1'+OR+'1'='1" | ||
| + | </syntaxhighlight> | ||
| + | Kommt 200 statt 403, ist die Rule-Engine das Problem, nicht das SIEM. | ||
| + | ;2. Schreibt Coraza ins Audit-Log? | ||
* tail -f /var/log/coraza/audit.log — dann den curl absetzen | * tail -f /var/log/coraza/audit.log — dann den curl absetzen | ||
| − | ; | + | ;3. Liest der Agent die Datei? |
* grep "Analyzing file" /var/ossec/logs/ossec.log | * grep "Analyzing file" /var/ossec/logs/ossec.log | ||
| − | ; | + | ;4. Erreichen die Zeilen den Manager? Auf dem Manager ''logall_json'' aktivieren |
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<global> | <global> | ||
| Zeile 161: | Zeile 187: | ||
* tail -f /var/ossec/logs/archives/archives.json | jq 'select(.agent.name=="waf")' | * tail -f /var/ossec/logs/archives/archives.json | jq 'select(.agent.name=="waf")' | ||
* Nach der Übung wieder auf ''no'' — Archives werden nicht rotiert | * Nach der Übung wieder auf ''no'' — Archives werden nicht rotiert | ||
| − | ; | + | ;5. Steht die Verbindung? |
* Auf dem Manager: /var/ossec/bin/agent_control -l | * Auf dem Manager: /var/ossec/bin/agent_control -l | ||
* Auf der WAF: grep -E "Connected to the server|Unable to connect" /var/ossec/logs/ossec.log | * Auf der WAF: grep -E "Connected to the server|Unable to connect" /var/ossec/logs/ossec.log | ||
Aktuelle Version vom 9. September 2026, 11:14 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
rpm --import https://packages.wazuh.com/key/GPG-KEY-WAZUH
- Repository hinzufügen
cat > /etc/yum.repos.d/wazuh.repo << 'EOF'
[wazuh]
name=Wazuh repository
baseurl=https://packages.wazuh.com/4.x/yum/
gpgcheck=1
gpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH
enabled=1
protect=1
EOF
Agent installieren
- Agent mit Manager-Adresse und Namen installieren
WAZUH_MANAGER="wazuh.dkbi.com" WAZUH_AGENT_NAME="waf" dnf install -y wazuh-agent
- Dienst aktivieren und starten
systemctl daemon-reload
systemctl enable --now wazuh-agent
- Repository deaktivieren (verhindert ungewollte Updates)
sed -i "s/^enabled=1/enabled=0/" /etc/yum.repos.d/wazuh.repo
Audit-Log in Coraza aktivieren
Die Grundinstallation aus WAF-Demo: HAProxy mit Coraza auf Rocky Linux setzt nur SecRuleEngine On. Coraza blockt damit zwar, protokolliert die Treffer aber nirgends. Ohne Audit-Log hat der Agent nichts zu lesen.
Wichtig: Die SecAudit-Direktiven sind SecRules-Anweisungen, keine YAML-Optionen. Sie gehören in den directives-Block der Anwendung — und hinter die Includes, da @coraza.conf-recommended eigene Audit-Voreinstellungen mitbringt, die sonst gewinnen.
- Zielverzeichnis anlegen
mkdir -p /var/log/coraza
- In /etc/coraza-spoa/config.yaml den directives-Block der Anwendung revproxy ergänzen
directives: |
Include @coraza.conf-recommended
Include /etc/coraza-spoa/crs-setup.conf
Include /etc/coraza-spoa/coreruleset/rules/*.conf
SecRuleEngine On
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:4|5)"
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial
SecAuditLogFormat JSON
SecAuditLog /var/log/coraza/audit.log
- Bedeutung der Zeilen
- SecAuditEngine RelevantOnly — nur auffällige Transaktionen, nicht jeder normale Seitenaufruf
- SecAuditLogRelevantStatus — was als auffällig gilt; hier alle 4xx und 5xx, damit der 403 der WAF sicher erfasst wird
- SecAuditLogType Serial — eine gemeinsame Logdatei. Ohne diese Zeile legt Coraza pro Transaktion eine eigene Datei in einem Verzeichnisbaum an, und der Agent findet nichts
- SecAuditLogFormat JSON — statt des nativen ModSecurity-Formats (Multiline mit Trennern wie --aaCuCNaqNi-A--), das Wazuh nicht parsen kann
- Daemon neu starten
systemctl restart coraza-spoa
systemctl status coraza-spoa
- Angriff absetzen und eine Zeile prüfen — muss mit { beginnen
Über den browser auf www.it2XX.xinmen.de und dann eine SQL Injection auslösen.
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>
- Syntax prüfen, bevor neu gestartet wird
- /var/ossec/bin/wazuh-logcollector -t
Agent neu starten
systemctl restart wazuh-agent
- Kontrolle, dass die Datei überwacht wird
- grep "audit.log" /var/ossec/logs/ossec.log
Der Logcollector liest nur Zeilen, die nach dem Öffnen der Datei dazukommen. Angriffe von vorher tauchen nicht mehr auf.
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>
- Regel-IDs prüfen
Sind 100100/100101 auf diesem Manager bereits vergeben, startet wazuh-manager nicht mehr und meldet Duplicated rule ID im ossec.log. Dann auf freie IDs ausweichen.
- grep -rh 'rule id="1001' /var/ossec/etc/rules/
- 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
Angriff über die Weboberfläche www.it2XX.xinmen.de - Command und SQl Injection
- Im Dashboard
- Öffne Threat Hunting, Filter rule.id:100101
- Der Alert "Coraza WAF: Angriff geblockt" muss erscheinen
- Beide Blickwinkel nebeneinander
- Filter rule.id:100101 OR rule.id:31103 zeigt die geblockte Anfrage auf der WAF und — falls durchgelassen — dieselbe Anfrage im Apache-Log der VulnSite
Fehlersuche
Die Kette von unten nach oben prüfen, in dieser Reihenfolge.
- 1. Blockt Coraza überhaupt?
curl -k -o /dev/null -w "%{http_code}\n" "https://waf.it2XX.xinmen.de/?id=1'+OR+'1'='1"
Kommt 200 statt 403, ist die Rule-Engine das Problem, nicht das SIEM.
- 2. Schreibt Coraza ins Audit-Log?
- tail -f /var/log/coraza/audit.log — dann den curl absetzen
- 3. Liest der Agent die Datei?
- grep "Analyzing file" /var/ossec/logs/ossec.log
- 4. Erreichen die Zeilen den Manager? Auf dem Manager logall_json aktivieren
<global>
<logall_json>yes</logall_json>
</global>
- tail -f /var/ossec/logs/archives/archives.json | jq 'select(.agent.name=="waf")'
- Nach der Übung wieder auf no — Archives werden nicht rotiert
- 5. Steht die Verbindung?
- Auf dem Manager: /var/ossec/bin/agent_control -l
- Auf der WAF: grep -E "Connected to the server|Unable to connect" /var/ossec/logs/ossec.log