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.
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
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, kein Kompilieren von Modulen, keine komplexe Apache-Konfiguration. 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 { 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.
Bauen, Ausführen und Testen
Bauen Sie das Caddy+Coraza-Image 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 diebasicauth-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 hervorragenden WAF-Support. Wenn Sie mit Apache zufrieden sind und lediglich WAF-Schutz hinzufügen möchten, ist Option A (ModSecurity) der unkomplizierte Weg.
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 die ausgereifteste verfügbare quelloffene WAF-Kombination. Wechseln Sie zu Caddy + Coraza, wenn Sie eine einfachere Konfiguration, automatisches HTTPS, eine Docker-native Bereitstellung 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.