Hier werde ich beschreiben, wie man einen Reverse Proxy mit einer Web Application Firewall (WAF) basierend auf Apache2 installiert.
Dies geschieht mit ModSecurity und dem OWASP Core Rule Set (CRS), das sicherheitskritische Angriffe erkennt und blockiert. Der Artikel führt durch die Installation und Konfiguration von Apache2, SSL, ModSecurity und dem OWASP-Regelwerk

Installation

Starte zunächst mit der Installation der notwendigen Pakete. Aktualisiere die Paketquellen und installiere Apache2, ModSecurity, Git und Certbot.

apt update
apt install apache2 libapache2-mod-security2 git certbot python3-certbot-apache -y

SSL-Zertifikat mit Certbot einrichten

Um SSL zu aktivieren, führen wir die Certbot-Konfiguration aus, die automatisch ein Zertifikat für den Webserver erstellt und einrichtet. Wenn du ein Wildcard-Zertifikat verwenden möchtest, kannst du dies mit der manuellen DNS-Validierung einrichten.

certbot --apache

Für Wildcard-Zertifikate (z. B. *.stangneth.com) kannst du den folgenden Befehl nutzen. Certbot fordert eine DNS-Challenge an, bei der ein TXT-Eintrag zum DNS hinzugefügt werden muss.

certbot certonly --manual --preferred-challenges=dns --server https://acme-v02.api.letsencrypt.org/directory -d *.stangneth.com

Befolge die Anweisungen von Certbot, um den TXT-Eintrag in den DNS-Einstellungen deines Domain-Anbieters hinzuzufügen. Sobald das Zertifikat eingerichtet ist, speichert Certbot es unter /etc/letsencrypt/live/.

Apache2-Module aktivieren und Default-Sites deaktivieren

a2enmod security2 proxy proxy_http rewrite ssl

Deaktiviere dann die Standard-Websites, um den Server für deine spezifische Konfiguration vorzubereiten:

a2dissite 000-default.conf
a2dissite default-ssl.conf

OWASP Core Rule Set (CRS) herunterladen und einrichten

Lade das OWASP Core Rule Set (CRS) herunter und platziere es im empfohlenen Verzeichnis /etc/crs4:

git clone https://github.com/coreruleset/coreruleset /etc/crs4
cd /etc/crs4
cp crs-setup.conf.example crs-setup.conf

ModSecurity konfigurieren

Passe die ModSecurity-Konfigurationsdatei an, indem du die empfohlene Konfigurationsdatei kopierst und SecRuleEngine aktivierst:

cp /usr/share/modsecurity-crs/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Öffne die Datei und setze SecRuleEngine auf On:

nano /etc/modsecurity/modsecurity.conf

ModSecurity-Regeln in Apache einbinden

Bearbeite die Datei /etc/apache2/mods-enabled/security2.conf, um die CRS-Regeln einzubinden:

nano /etc/apache2/mods-enabled/security2.conf

Füge folgende Zeilen hinzu, um das CRS-Regelwerk zu laden:

IncludeOptional /etc/crs4/crs-setup.conf
IncludeOptional /etc/crs4/rules/*.conf

Apache-Konfiguration als Reverse Proxy

Erstelle eine neue Konfigurationsdatei für den VirtualHost in /etc/apache2/sites-available. Verwende diese Konfiguration für example.stangneth.com und ersetze die IP-Adresse 172.16.254.3 und den Port 5151 mit den Werten deines Web-Servers.

Erstelle die Datei und füge die Konfiguration hinzu:

nano /etc/apache2/sites-available/001-example.stangneth.com.conf
<VirtualHost *:80>
    ServerName example.stangneth.com

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
    ServerName example.stangneth.com

    SSLProxyEngine On
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    ProxyPreserveHost off

    # Globale ModSecurity-Ausnahmen
    SecRuleRemoveById 949110

    # Proxy-Konfiguration
    ProxyPass / http://172.16.254.3:5151/
    ProxyPassReverse / http://172.16.254.3:5151/

    # SSL-Zertifikate
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/stangneth.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/stangneth.com/privkey.pem
</VirtualHost>

Aktiviere die neue Seite und starte Apache2 neu, um die Änderungen zu übernehmen:

a2ensite 001-example.stangneth.com.conf
systemctl restart apache2

Überprüfung der Logs

Um sicherzustellen, dass alles wie gewünscht funktioniert und ModSecurity keine Probleme verursacht, prüfe das Apache-Fehlerprotokoll:

tail -f /var/log/apache2/error.log

Ein Ausgabe könnte wie folgt aussehen:

2023/01/12 14:38:39 [error] 1155#1155: *18 [client 172.16.0.123] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/src/owasp-modsecurity-crs-3.0.2/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "44"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "172.16.0.18"] [uri "/api/v1/tickets/14"] [unique_id "167188911882.664343"] [ref ""], client: 172.16.0.123, server: example.stangneth.com, request: "PUT /api/v1/tickets/14?all=true HTTP/1.1", host: "example.stangneth.com", referrer: "https://example.stangneth.com/"

In diesem Fall war es erforderlich, die Regel [id „949110“] aus der Konfiguration für DIESE Website zu entfernen (alle anderen Seiten können diese Regel verwenden, aber möglicherweise andere nicht. Überprüfen muss man dies für jede einzelne Webseite!). Spezifischen Seitenkonfiguration aufrufen:

nano /etc/apache2/sites-available/001-example.stangneth.com.conf

Und nun fügt man die folgende Zeile zur Konfiguration für *:443 hinzu (In obiger Beispielconfig schon geschehen):

SecRuleRemoveById 949110

Disclaimer

Diese Anleitung dient als Orientierung und sollte an die jeweilige Umgebung angepasst werden. Die Artikel sind ausschließlich zu Testzwecken gedacht, und ich übernehme keine Haftung für eventuelle Schäden oder Fehlfunktionen. Ich empfehle, jede Konfiguration gründlich zu prüfen und in einer sicheren Testumgebung auszuprobieren. Gerne stehe ich Ihnen für eine individuelle Beratung und Umsetzung zur Verfügung.