Hier werde ich beschreiben, wie man einen Reverse Proxy mit einer Web Application Firewall (WAF) basierend auf Apache2 installiert, wie im Artikel auf https://stangneth.com/2022/12/27/nginx-as-reverse-proxy-with-waf-modsecurity-on-debian/ erwähnt.
Inhaltsverzeichnis
Um Apache2 auf Debian zu installieren, verwendet man den folgenden Befehl:
apt install apache2 -y
Als nächster Schritt sollen die erforderlichen Module aktiviert werden. Dabei wird das Modul proxy
und proxy_http
für die Konfiguration des Reverse Proxys verwendet und das Modul headers
für das Hinzufügen benutzerdefinierter Header zum weitergeleiteten Datenverkehr.
a2enmod proxy proxy_http headers
Um ein Wildcard-Zertifikat für eine Domain mithilfe einer DNS-Herausforderung und Certbot anzufordern, müssen die folgenden Schritte durchgeführt werden:
certbot certonly --manual --preferred-challenges=dns --server https://acme-v02.api.letsencrypt.org/directory -d *.stangneth.com
Folgen der Anweisungen von Certbot zur Erstellung eines TXT-Eintrags in den DNS-Einstellungen. Dies erfordert üblicherweise das Einloggen in das Kontrollpanel des Domain-Anbieters und das Hinzufügen eines neuen TXT-Eintrags mit dem von Certbot bereitgestellten Wert.
Nachdem der TXT-Eintrag hinzugefügt wurde, kehrt man zum Terminal zurück und drückt Enter, um den Zertifikatsanfrageprozess fortzusetzen.
Certbot überprüft die korrekte Hinzufügung des TXT-Eintrags und stellt bei erfolgreicher Validierung ein Wildcard-Zertifikat für die Domain aus.
Bitte beachten, dass der genaue Ablauf dieses Prozesses vom spezifischen Domain-Anbieter und den von ihm bereitgestellten DNS-Verwaltungstools abhängen kann.
Es wird gespeichert unter:
/etc/letsencrypt/live/stangneth.com/
Erstellen einer neuen Konfigurationsdatei für den virtuellen Host im Verzeichnis /etc/apache2/sites-available. Zum Beispiel könnte, wenn man den Datenverkehr für example.stangneth.com umleiten möchten, eine Datei namens 001-example.stangneth.com.conf erstellt werden.
vi /etc/apache2/sites-available/001-example.stangneth.com.conf
Einfügen der folgenden Konfiguration zur Datei. Ersetzen der IP-Adresse und die Portnummer durch die entsprechenden Werte für den realen Backend-Server:
<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 ProxyPass / https://172.16.0.18:444/ ProxyPassReverse / https://172.16.0.18:444/ Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/stangneth.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/stangneth.com/privkey.pem </VirtualHost>
Aktivieren der neuen Seite:
ln -s /etc/apache2/sites-avaialable/001-example.stangneth.com.conf /etc/apache2/sites-enabled/001-example.stangneth.com.conf
Neustarten des Apache2 und überprüfen, ob die Seite erreichbar ist (sicherstellen, dass DNS ordnungsgemäß konfiguriert ist):
systemctl restart apache2 systemctl status apache2
Um ModSecurity und das OWASP-Regelwerk zu installieren, verwendet man den folgenden Befehl:
apt install libapache2-mod-security2 -y apt install git -y
Das Modul aktivieren:
a2enmod security2
Herunterladen des OWASP ruleset aus GitHub:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /etc/modsecurity
Verschieben der empfohlenen modsecurity.conf und crs-setup.conf in das Produktivumfeld:
mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf mv /etc/modsecurity/crs-setup.conf-recommended /etc/modsecurity/crs-setup.conf
Hinzufügen von folgender Konfiguration zur Datei /etc/apache2/mods-enabled/security2.conf:
Include /etc/modsecurity/crs-setup.conf Include /etc/modsecurity/rules/*.conf
Apache2 neustarten:
systemctl restart apache2 systemctl status apache2
Standardmäßig ist der Modus für ModSecurity DetectionOnly. Das bedeutet, dass nichts blockiert wird, sondern nur protokolliert wird. Um ModSecurity zu aktivieren, geht man zu /etc/modsecurity und bearbeitet die Datei modsecurity.conf:
cd /etc/modsecurity vi modsecurity.conf
Editieren des Eintrags SecRuleEngine
:
SecRuleEngine On
Um die Änderungen zu übernehmen den Apache2 neustarten:
systemctl restart apache2 systemctl status apache2
Um zu überprüfen, ob eine Regel als falsch-positiv ausgelöst wird, muss die Funktionalität der Website überprüft werden und das Log unter /var/log/apache2/error.log geprüft werden:
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:
vi /etc/apache2/sites-available/001-example.stangneth.com.conf
Und nun fügt man die folgende Zeile zur Konfiguration für *:443 hinzu:
SecRuleRemoveById 949110
Keine Kommentare zu Apache2 als Reverse Proxy mit ModSecurity und OWASP Ruleset auf Debian