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.

30-45 Minuten intermediate 8 steps
Zuletzt aktualisiert: Jul 18, 2026

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

1

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.

Tipp: Unter CentOS/RHEL heißt das Paket mod_security und wird über /etc/httpd/conf.d/mod_security.conf konfiguriert.
2

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.

3

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.
4

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.

5

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.

6

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"
7

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_rewrite mit 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 die handle- und Matcher-Direktiven von Caddy.
  • Authentifizierung (mod_auth_basic): Verwenden Sie die basic_auth-Direktive von Caddy.

In Caddy nicht verfügbar

  • mod_php: Caddy bettet PHP nicht ein. Verwenden Sie PHP-FPM als Backend mit php_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.
8

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