Written on 14. Januar 2023

Apache2 als Reverse Proxy mit ModSecurity und OWASP Ruleset auf Debian

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.

Installation

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

Certbot Wildcard-Zertifikatsanfrage

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/

Apache2 konfigurieren

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

Installieren von ModSecurity und dem OWASP ruleset

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

Konfigurieren von ModSecurity und OWASP

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

Aktivieren von ModSecurity und ausschließen von Regeln für bestimmte Websites

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert