WAF-Schutz zu Apache hinzufügen
Zwei Ansätze, um Apache mit einer WAF zu schützen. Verwenden Sie ModSecurity als natives Apache-Modul oder ersetzen Sie Apache durch Caddy+Coraza für ein einfacheres, modernes Setup mit denselben OWASP-CRS-Regeln.
Apache hat unter allen Webservern die längste Geschichte, wenn es um WAF-Schutz geht. ModSecurity wurde ursprünglich 2002 als Apache-Modul entwickelt, und die Kombination aus Apache + ModSecurity + CRS gilt seit über zwei Jahrzehnten als Goldstandard für quelloffene WAF-Bereitstellungen.
Ein Punkt vorab: Trustwave hat den kommerziellen Support für ModSecurity am 1. Juli 2024 eingestellt, und die Verantwortung für die Engine ist an OWASP übergegangen, wo sie inzwischen im Stability-/Maintenance-Modus gepflegt wird (Sicherheits- und Bugfixes, aber nur langsamer Funktionszuwachs). Das Apache-Modul funktioniert weiterhin und wird nach wie vor von jeder großen Distribution paketiert, aber genau deshalb stellen wir Ihnen daneben auch die moderne Coraza-Option vor. Beide setzen dieselben OWASP-CRS-Regeln ein.
Diese Anleitung behandelt zwei Ansätze:
- Option A: ModSecurity als natives Apache-Modul, der traditionelle Ansatz. Installieren Sie mod_security2 direkt in Apache. Ausgereift, gut dokumentiert, praxiserprobt. Am besten geeignet, wenn Sie ein bestehendes Apache-Setup haben und WAF-Schutz hinzufügen möchten, ohne Ihre Architektur zu ändern.
- Option B: Apache durch Caddy+Coraza ersetzen, der moderne Ansatz. Verwenden Sie Caddy sowohl als Webserver als auch als WAF, angetrieben von Coraza (einer Go-Neuimplementierung von ModSecurity). Dieselben CRS-Regeln, einfachere Konfiguration, automatisches HTTPS, ein Container. Am besten für neue Bereitstellungen oder wenn Sie bereits eine Migration weg von Apache in Betracht ziehen.
Beide Ansätze verwenden das OWASP Core Rule Set (CRS) zur Angriffserkennung. Ihr Schutzumfang ist derselbe, unabhängig davon, welche Engine die Regeln ausführt.
Voraussetzungen
- Ein bestehendes Apache-Setup, das Sie schützen möchten, oder Docker für den Caddy+Coraza-Ansatz
- Root- oder sudo-Zugriff für den Apache-ModSecurity-Ansatz
- Grundkenntnisse der Apache-Konfiguration (.htaccess, VirtualHost-Blöcke)
Schritt-für-Schritt-Anleitung
Option A: ModSecurity als natives Apache-Modul
Dies ist der traditionelle Ansatz. ModSecurity wurde ursprünglich für Apache entwickelt und integriert sich als natives Modul (mod_security2). Es läuft innerhalb des Apache-Prozesses und inspiziert jede Anfrage.
Installation unter Ubuntu/Debian:
sudo apt update
sudo apt install -y libapache2-mod-security2
sudo a2enmod security2
sudo systemctl restart apache2
Die Basis-Konfiguration von ModSecurity aktivieren:
Das Paket liefert die Grundeinstellungen der Engine nur als Beispieldatei aus. Sie müssen diese erst an die richtige Stelle kopieren. Ohne diesen Schritt läuft die Zeile IncludeOptional /etc/modsecurity/modsecurity.conf in der Konfiguration weiter unten ins Leere (IncludeOptional ignoriert einen fehlenden Pfad stillschweigend), und die Grundeinstellungen für den Zugriff auf Request-/Response-Body, die PCRE-Limits und das Audit-Logging werden nie geladen, was dazu führt, dass CRS-Regeln, die davon abhängen, sich falsch verhalten:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Diese Datei wird mit SecRuleEngine DetectionOnly ausgeliefert (Treffer werden protokolliert, aber nicht blockiert). Das SecRuleEngine On in der Apache-Konfiguration weiter unten überschreibt dies und blockiert aktiv. Lassen Sie die Engine für eine anfängliche Beobachtungsphase auf DetectionOnly, wenn Sie False Positives im Audit-Log prüfen möchten, bevor Sie aktiv blockieren.
Das OWASP CRS installieren:
cd /etc/modsecurity
sudo git clone https://github.com/coreruleset/coreruleset.git /etc/modsecurity/crs
sudo cp /etc/modsecurity/crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf
Apache für die Verwendung von CRS konfigurieren:
Bearbeiten Sie /etc/apache2/mods-enabled/security2.conf:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
SecRuleEngine On
IncludeOptional /etc/modsecurity/modsecurity.conf
IncludeOptional /etc/modsecurity/crs/crs-setup.conf
IncludeOptional /etc/modsecurity/crs/rules/*.conf
</IfModule>
Starten Sie Apache neu: sudo systemctl restart apache2
Eine vollständige Anleitung finden Sie auf unserer ModSecurity-Anbieterseite.
Option B: Apache durch Caddy+Coraza ersetzen
Wenn Sie Ihren Stack vereinfachen möchten, kann Caddy+Coraza Apache vollständig ersetzen. Sie erhalten Webserver, WAF und automatisches HTTPS in einer einzigen Binärdatei. Die WAF verwendet Coraza (eine Go-Neuimplementierung von ModSecurity) mit denselben CRS-Regeln.
Der entscheidende Vorteil: keine C-Abhängigkeiten und keine komplexe Apache-Konfiguration. Sie erstellen zwar eine eigene Caddy-Binärdatei (die WAF wird als Go-Plugin ausgeliefert, das xcaddy einkompiliert, siehe einen späteren Schritt), aber das Ergebnis ist eine einzelne statische Binärdatei ohne C-Toolchain und ohne Dateisystemprüfungen pro Anfrage. Ein Caddyfile, das einen typischen Apache-VirtualHost ersetzt, umfasst 10 bis 15 Zeilen.
Zuordnung von Apache- zu Caddy-Direktiven
So werden gängige Apache-Direktiven in Caddy übertragen:
Grundlagen
# Apache -> Caddy
DocumentRoot /var/www/html -> root * /srv
DirectoryIndex index.html -> (automatic with file_server)
Options -Indexes -> file_server { browse } (or omit for no listing)
ServerName example.com -> example.com { ... }
Reverse Proxy
# Apache -> Caddy
ProxyPass / http://app:3000/ -> reverse_proxy app:3000
ProxyPassReverse / http://app:3000/ -> (automatic in Caddy)
ProxyPreserveHost On -> (automatic in Caddy)
ProxyTimeout 60 -> reverse_proxy app:3000 { transport http { read_timeout 60s } }
Header
# Apache -> Caddy
Header set X-Frame-Options DENY -> header X-Frame-Options DENY
Header set X-Content-Type-Options ... -> header X-Content-Type-Options nosniff
ServerTokens Prod -> (off by default in Caddy)
Redirects und Rewrites
# Apache -> Caddy
Redirect 301 /old /new -> redir /old /new permanent
RewriteRule ^/blog(.*)$ /news$1 [R=301]-> redir /blog* /news{path} permanent
RewriteCond %{HTTPS} off -> (automatic with Caddy auto-HTTPS)
RewriteRule (.*) https://%{HTTP_HOST} -> (automatic)
TLS
# Apache -> Caddy
SSLEngine on -> (automatic with domain name)
SSLCertificateFile /path/cert.pem -> tls /path/cert.pem /path/key.pem
SSLCertificateKeyFile /path/key.pem -> (or just use a domain name for auto-HTTPS)
SSLProtocol all -SSLv3 -TLSv1 ... -> (TLS 1.2+ by default)
.htaccess
# Apache-.htaccess wird in Caddy nicht unterstützt.
# Verschieben Sie alle .htaccess-Regeln direkt in das Caddyfile.
# Das ist sogar ein Vorteil: keine Dateisystemprüfungen pro Anfrage.
Das Caddyfile mit WAF schreiben
Hier ist ein Caddyfile, das einen typischen Apache-VirtualHost mit WAF-Schutz ersetzt:
{
order coraza_waf first
}
yourdomain.com {
coraza_waf {
load_owasp_crs
directives `
Include @coraza.conf-recommended
Include @crs-setup.conf.example
Include @owasp_crs/*.conf
SecRuleEngine On
`
}
root * /srv
file_server
encode gzip
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
}
}
Vergleichen Sie dies mit dem Apache-Äquivalent:
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
<IfModule security2_module>
SecRuleEngine On
IncludeOptional /etc/modsecurity/modsecurity.conf
IncludeOptional /etc/modsecurity/crs/crs-setup.conf
IncludeOptional /etc/modsecurity/crs/rules/*.conf
</IfModule>
Header set X-Content-Type-Options nosniff
Header set X-Frame-Options DENY
<Directory /var/www/html>
Options -Indexes
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
Das Caddyfile ist etwa ein Drittel so groß. TLS erfolgt automatisch, und die WAF-Konfiguration ist einfacher, weil Coraza das CRS direkt bündelt.
Eine Caddy-Binärdatei mit dem Coraza-Plugin bauen
Caddy im Originalzustand kennt die Direktive coraza_waf oder order coraza_waf first nicht. Diese stammen aus dem coraza-caddy-Plugin, das Sie mit xcaddy in eine eigene Caddy-Binärdatei einkompilieren. Das offizielle caddy:builder-Image bringt xcaddy bereits mit, sodass ein mehrstufiges Dockerfile den kompletten Build übernimmt und die neue Binärdatei auf das Standard-caddy-Image legt:
# Dockerfile
FROM caddy:builder AS builder
RUN xcaddy build --with github.com/corazawaf/coraza-caddy/v2
FROM caddy
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
Der Modulpfad muss das Suffix /v2 enthalten; das ist die aktuelle Hauptversion von coraza-caddy. Wenn Sie Go und xcaddy bereits auf dem Host installiert haben, können Sie die Binärdatei auch direkt bauen, statt Docker zu verwenden:
xcaddy build --with github.com/corazawaf/coraza-caddy/v2
Das OWASP CRS ist im Plugin eingebettet, weshalb die Subdirektive load_owasp_crs im Caddyfile dafür sorgt, dass sich die Includes @crs-setup.conf.example und @owasp_crs/*.conf auflösen lassen. Für diese Option ist kein separater CRS-Download nötig.
Bauen, Ausführen und Testen
Bauen Sie das Caddy+Coraza-Image aus dem oben stehenden Dockerfile und führen Sie es aus:
# Bauen
docker build -t caddy-coraza -f Dockerfile .
# Ausführen (statische Dateien)
docker run -d -p 80:80 -p 443:443 \
-v ./Caddyfile:/etc/caddy/Caddyfile:ro \
-v ./site:/srv:ro \
-v caddy_data:/data \
caddy-coraza
Testen Sie den normalen Zugriff und die WAF-Blockierung:
# Normale Anfrage - sollte 200 zurückgeben
curl -o /dev/null -w "%{http_code}\n" http://localhost/
# SQL-Injection - sollte 403 zurückgeben
curl -o /dev/null -w "%{http_code}\n" "http://localhost/?id=1%20OR%201=1"
# XSS - sollte 403 zurückgeben
curl -o /dev/null -w "%{http_code}\n" "http://localhost/?q=%3Cscript%3Ealert(1)%3C/script%3E"
Was sich von Apache nicht 1:1 übertragen lässt
Einige Apache-Funktionen arbeiten anders oder sind in Caddy nicht verfügbar:
Funktioniert anders
.htaccess: nicht unterstützt. Verschieben Sie alle Regeln in das Caddyfile. Das ist sogar schneller, weil Caddy das Dateisystem nicht bei jeder Anfrage nach .htaccess-Dateien durchsucht.mod_rewritemit komplexen Bedingungen: Caddy verwendet Matcher anstelle von RewriteCond/RewriteRule. Die meisten Muster lassen sich übertragen, komplexe Ketten müssen jedoch überdacht werden.<Directory>-/<Location>-Blöcke: Verwenden Sie stattdessen diehandle- und Matcher-Direktiven von Caddy.- Authentifizierung (
mod_auth_basic): Verwenden Sie diebasic_auth-Direktive von Caddy.
In Caddy nicht verfügbar
mod_php: Caddy bettet PHP nicht ein. Verwenden Sie PHP-FPM als Backend mitphp_fastcgi.mod_perl/mod_python: kein Äquivalent. Führen Sie Ihre Anwendung als separaten Prozess aus und leiten Sie den Datenverkehr per Reverse Proxy dorthin.mod_cache: Caddy hat ein cache-handler-Plugin, es ist jedoch weniger ausgereift als die Caching-Module von Apache.
KI zur Konvertierung Ihrer Apache-Konfiguration nutzen
Für komplexe Apache-Konfigurationen mit vielen VirtualHosts verwenden Sie diesen Prompt mit einem beliebigen KI-Assistenten:
Konvertiere die folgende Apache-VirtualHost-Konfiguration in eine Caddy-Konfiguration (Caddyfile). Füge außerdem Coraza-WAF-Schutz über das coraza-caddy-Plugin mit OWASP CRS hinzu.
Anforderungen: - Verwende die Direktive coraza_waf mit load_owasp_crs - Binde @coraza.conf-recommended, @crs-setup.conf.example und @owasp_crs/*.conf ein - Setze SecRuleEngine On - Verwende "order coraza_waf first" im globalen Optionsblock - Konvertiere alle .htaccess-Regeln direkt in das Caddyfile - Erhalte alle Redirects, Header und Proxy-Ziele - Ersetze mod_rewrite-Regeln durch Caddy-Matcher - Füge Kommentare hinzu, die jeden Abschnitt erklären - Kennzeichne alles, was kein direktes Caddy-Äquivalent hat
Hier ist meine Apache-Konfiguration:
[Apache-VirtualHost-Konfiguration hier einfügen]
Überprüfen Sie die Ausgabe sorgfältig, insbesondere die mod_rewrite-Konvertierungen und alle .htaccess-Regeln, die eingebettet wurden.
Fazit & Nächste Schritte
Apache bietet über sein natives ModSecurity-Modul soliden WAF-Support. Wenn Sie mit Apache zufrieden sind und lediglich WAF-Schutz hinzufügen möchten, ist Option A (ModSecurity) der unkomplizierte Weg. Bedenken Sie, dass ModSecurity inzwischen ein OWASP-Projekt im Maintenance-Modus ist (der kommerzielle Support von Trustwave endete am 1. Juli 2024); es erhält also Sicherheits- und Bugfixes statt aktiver Weiterentwicklung neuer Funktionen.
Wenn Sie Ihren Stack modernisieren möchten, bietet Caddy+Coraza denselben CRS-basierten Schutz mit einer einfacheren Konfiguration, automatischem HTTPS und ohne C-Abhängigkeitskette. Dieselben Regeln, die auf ModSecurity laufen, laufen auch auf Coraza, sodass Ihr Schutzniveau identisch ist.
Zusammenfassung:
- Bestehendes Apache-Setup, nur WAF gewünscht -> mod_security2 + CRS installieren
- Neue Bereitstellung oder bereit zum Vereinfachen -> Caddy+Coraza in Docker
- Komplexe Apache-Konfiguration mit mod_rewrite, .htaccess, mod_php -> Apache + ModSecurity beibehalten oder schrittweise migrieren
Fehlerbehebung
ModSecurity blockiert legitime Anfragen unter Apache
Prüfen Sie das Apache-Error-Log oder das ModSecurity-Audit-Log (/var/log/apache2/modsec_audit.log), um herauszufinden, welche Regel auslöst. Deaktivieren Sie bestimmte Regeln mit SecRuleRemoveById in Ihrer Apache-Konfiguration.
Apache ist nach dem Aktivieren von ModSecurity langsam
ModSecurity verursacht für jede Anfrage einen gewissen Mehraufwand. Reduzieren Sie ihn, indem Sie das CRS-Paranoia-Level in crs-setup.conf senken (Standard ist 1, das leichteste). Prüfen Sie außerdem, dass Sie nicht jede Anfrage im vollständigen Audit-Modus protokollieren (SecAuditEngine RelevantOnly statt On).
.htaccess-Regeln funktionieren in Caddy nicht
Caddy unterstützt keine .htaccess-Dateien. Alle Regeln müssen in das Caddyfile. Durchsuchen Sie Ihre .htaccess-Dateien nach RewriteRule-, Redirect-, Header- und Auth-Direktiven und übertragen Sie sie mithilfe der Zuordnungstabelle in dieser Anleitung.
Häufig gestellte Fragen
Sollte ich bei Apache + ModSecurity bleiben oder zu Caddy + Coraza wechseln?
Wenn Apache für Sie gut funktioniert und Sie lediglich WAF-Schutz benötigen, bleiben Sie bei Apache + ModSecurity. Es ist eine ausgereifte quelloffene WAF-Kombination, auch wenn sich die Engine inzwischen im OWASP-Maintenance-Modus befindet, nachdem Trustwave den kommerziellen Support am 1. Juli 2024 eingestellt hat. Wechseln Sie zu Caddy + Coraza, wenn Sie eine einfachere Konfiguration, automatisches HTTPS, eine Docker-native Bereitstellung, eine aktiv weiterentwickelte Engine wünschen oder ohnehin planen, von Apache wegzugehen.
Sind die CRS-Regeln bei ModSecurity und Coraza identisch?
Ja. Beide Engines führen das OWASP Core Rule Set aus. CRS v4 wird bei jedem Release gegen ModSecurity v2, ModSecurity v3 und Coraza getestet. Der Schutzumfang ist identisch. Der Unterschied liegt in der Engine, die die Regeln auswertet (C bei ModSecurity, Go bei Coraza), nicht in den Regeln selbst.
Kann ich meine benutzerdefinierten ModSecurity-Regeln zu Coraza migrieren?
In den meisten Fällen ja. Coraza unterstützt die SecLang-Regelsprache, die ModSecurity verwendet. Ihre benutzerdefinierten SecRule-Direktiven, Regelausschlüsse und CRS-Anpassungen funktionieren ohne Änderung auf Coraza. Einige erweiterte ModSecurity-Funktionen sind in Coraza nur teilweise kompatibel; testen Sie daher Ihre benutzerdefinierten Regeln, bevor Sie den Produktiv-Datenverkehr umstellen.
Was ist mit Apache-Modulen wie mod_php?
Caddy bettet PHP nicht wie das mod_php von Apache ein. Verwenden Sie stattdessen PHP-FPM (FastCGI Process Manager) als separaten Prozess und konfigurieren Sie Caddy mit der php_fastcgi-Direktive. Das ist aus Leistungsgründen sogar in Apache der empfohlene Ansatz. Die Konvertierung ist für Standard-PHP-Anwendungen wie WordPress, Laravel oder Drupal unkompliziert.
Ähnliche Anleitungen
So schützen Sie Nginx mit der Coraza WAF mithilfe von Docker
Schritt-für-Schritt-Anleitung zur Bereitstellung der Coraza WAF als Reverse Proxy vor Nginx mithilfe von Docker und docker-compose, mit sofort einsatzbereitem OWASP-CRS-Schutz.
ModSecurity mit NGINX installieren und konfigurieren
Vollständige Anleitung zur Bereitstellung von ModSecurity 3.x mit NGINX für kostenlosen, quelloffenen WAF-Schutz mit dem OWASP Core Rule Set.