Web Application Firewall (WAF)

A customer has a public website that is often visited by automated bots.
12.12.2023

Das Projekt

Die öffentliche Website eines Kunden wird häufig von automatisierten Bots besucht.

Ein automatisierter Bot, oder einfach Bot, ist eine Softwareanwendung oder ein Skript, das automatisiert und wiederholt Aufgaben im Internet ausführt. Bots sind darauf ausgelegt, verschiedene Funktionen zu erfüllen, und werden in der Regel so programmiert, dass sie mit Websites, Anwendungen oder anderen Online-Diensten interagieren. Sie können sowohl für legitime als auch für illegale Zwecke erstellt werden.

Der Kunde hat folgendes Problem: Einige Bots oder andere nicht identifizierte Webclients brauchen die Server-Ressourcen auf und verlangsamen die Reaktionsgeschwindigkeit der Server.

Der Kunde bat um eine Lösung dieses Problems, bei der möglichst keine Änderungen an der vom Webserver bereitgestellten Infrastruktur vorgenommen werden sollten.

Die Lösung

Wir haben uns für AWS WAF entschieden, weil sie sich leicht in das Setup des Kunden integrieren läßt und eine vordefinierte AWS-verwaltete Regelgruppe bietet (AWS WAF Bot Control rule group), die verschiedene Arten von Bots erkennen kann. Außerdem lassen sich sowohl ratenbasierte Regeln als auch Regeln auf Grundlage bestimmter angefragter Attribute anwenden – wie zum Beispiel HTTP-Methoden, URL-Pfade, HTTP-Header-Felder oder IP-Adressbereiche.

Bot-Kategorien

Liste aller Bot-Kategorien, die AWS WAF Bot Control bekannt sind:

KategorieBeschreibung
WerbungBots für Werbezwecke
ArchivierungBots für Archivierungszwecke
Content FetcherBots, die im Auftrag eines Nutzers Inhalte abrufen
E-Mail-ClientE-Mail-Clients
Http-BibliothekHTTP-Bibliotheken, die von Bots verwendet werden
Link CheckerBots, die nach defekten Links suchen
VerschiedenesVerschiedene Bots
MonitoringBots für Überwachungszwecke
Scraping FrameworkWeb-Scraping-Frameworks
SuchmaschineSuchmaschinen-Bots
SecuritySecurity bots
SEOBots zur Suchmaschinenoptimierung
Soziale MedienBots, die auf Social-Media-Plattformen zur Bereitstellung von Inhaltszusammenfassungen eingesetzt werden
KIBots mit KI-Funktionen
Automatisierter BrowserÜberprüft das Token der Anfrage auf Hinweise, dass es sich um einen automatisierten Client-Browser handeln könnte
Bekanntes Bot-DatacenterSucht nach Rechenzentren, die typischerweise von Bots verwendet werden
Non Browser User AgentSucht nach User-Agent-Zeichenfolgen, die augenscheinlich nicht von einem Webbrowser stammen

Vorbereitende Schritte

Die nächsten Schritte werden in einer speziellen Testumgebung durchgeführt, bevor das Setup in der Produktion eingesetzt wird.

Wir schreiben zunächst einen Terraform-Code, der einen Application Load Balancer (ALB) zur Bereitstellung der WAF erstellt. Dabei ordnen wir die bestehenden Webserver einer Zielgruppe zu, an die der ALB den Datenverkehr weiterleiten wird. Der ALB fungiert dann als zusätzliche Reverse-Proxy-Schicht vor den Webservern.

Wir erstellen außerdem einen Route 53-Alias-A-Datensatz, der auf den ALB verweist, und ein TLS-Zertifikat im AWS Certificate Manager (ACM) für diesen DNS-Eintrag, da wir für ALB nur HTTPS-Datenverkehr zulassen. HTTP-Verkehr wird mit dem HTTP-Statuscode 302 fortlaufend auf HTTPS umgeleitet (der HTTP Strict-Transport-Security-Antwort-Header wird von der Caddy-Reverse-Proxy-Schicht hinter dem ALB verarbeitet).

Darüber hinaus werden die ALB- und WAF-Protokolle so konfiguriert, dass sie an Datadog gesendet werden.

AWF-Regeln hinzufügen

Bestimmte URLs filtern

Zunächst fügen wir der WAF eine Filterregel hinzu (block_webfonts_path). Sie blockiert den URI-Pfad /webfonts/2775253ec3a5.css zu einer Ressource, die auf den Webservern nicht mehr existiert, aber von einigen fehlkonfigurierten Ressourcen noch immer referenziert wird.

Bot-Kontrolle

Anschließend fügen wir die von AWS WAF Bot Control verwaltete Regelgruppe AWSManagedRulesBotControlRuleSet zur WAF hinzu und wählen die Inspektionsstufe „common“. Mit dieser Inspektionsstufe werden Bots von der WAF mittels statischer Analyse der Anfragedaten erkannt.

Stimmt die erste bot-Regel nicht überein, wird die zweite bot-Regel „bot-control-default“ angewendet.

Mit dieser Regel wird Folgendes erreicht:

Wenn eine Anfrage mit der Signatur eines verifizierten Bots übereinstimmt, zum Beispiel der Microsofts Bing-Suchmaschine, wird die Anfrage von der WAF gekennzeichnet, und anschließend wird die nächste Regel aufgerufen (Regeln, die nur Kennzeichnungen vornehmen, sind keine abschließenden Regeln – das bedeutet: Die nächste Regel wird auch dann aufgerufen, wenn es eine Übereinstimmung gibt.)

Wenn die Regel zutrifft, werden die folgenden Bezeichnungen hinzugefügt:

awswaf:managed:aws:bot-control:bot:name:bingbot
awswaf:managed:aws:bot-control:bot:organization:microsoft
awswaf:managed:aws:bot-control:bot:verified
awswaf:managed:aws:bot-control:bot:category:search_engine

Wenn die WAF bei einer Anfrage keine Übereinstimmung mit den ihr bekannten Signaturen verifizierter Bots feststellen kann, stuft sie diese Anfrage als nicht verifiziert ein und blockiert sie. Es wird keine weitere WAF-Regel aufgerufen.

In diesem Szenario, bei dem wir vor allem verhindern wollen, dass den Webservern die Ressourcen ausgehen, beginnen wir mit der restriktivsten von Bot Control verwalteten Regelgruppe.

Wir wollen nicht nur nicht verifizierte Bots blockieren, sondern auch verifizierte Bots. Dafür gibt es die Regel bot-control-block-verified.

Diese Regel sucht nach Anfragen, die mit awswaf:managed:aws:bot-control:bot:verified gekennzeichnet sind und blockiert sie.

Ratenbasierte Regeln

Als letzte Regel fügen wir eine ratenbasierte Regel (rate-based-captcha) hinzu, die folgende Bedingung erfüllt:

Wenn eine bestimmte Quell-IP innerhalb von 5 Minuten mehr als 500 Anfragen sendet, wird dem Kunden für 5 Minuten ein CAPTCHA angezeigt.

Finale Regelgruppe

Unsere finale Regelgruppe sieht so aus:

Bezeichnung der RegelRegelprioritätZweck
block_webfonts_path0Blockiert URI-Pfad
bot-control-default1Blockiert nicht verifizierte Bots, kennzeichnet verifizierte Bots
bot-control-block-verified2Blockiert verifizierte Bots durch übereinstimmende Kennzeichnung
rate-based-captcha3Blockiert IP-Quelladressen, die das Ratenlimit überschreiten

Nach der Installation der Regelgruppe in der Testumgebung haben wir einige Tage abgewartet, um genügend Protokolle sammeln zu können. Mit diesen Protokollen konnten wir einige Statistiken zum Datenverkehr erstellen und überprüfen, ob es sich um falsch-positive Befunde (Fehlalarme – WAF blockiert Anfragen, die nicht zu beanstanden sind) oder falsch-negative Befunde handelt (WAF erkennt Schadverkehr nicht).

Wir haben keine Probleme festgestellt, so dass wir den DNS-Eintrag in der Produktionsumgebung auf den Produktions-ALB verweisen konnten, an den auch die WAF angeschlossen ist. Die DNS-Änderung leitet dann den Datenverkehr der Produktionsumgebung an die WAF weiter.

Datadog WAF-Protokolle – Beispielansichten

Datadog showing requests blocked by the WAF using rule
(Datadog zeigt Anfragen, die in den letzten 24 Stunden von der WAF aufgrund der Regel block_webfonts_path blockiert wurden.)

Datadog statistics for blocked requests from unverified bots
(Datadog-Statistiken für Anfragen von nicht verifizierten Bots, die in den letzten 24 Stunden blockiert wurden.)

Datadog-Statistiken für Anfragen von verifizierten Bots, die in den letzten 24 Stunden blockiert wurden
(Datadog-Statistiken für Anfragen von verifizierten Bots, die in den letzten 24 Stunden blockiert wurden.)

Fazit

Mit dieser Regelgruppe können wir die Anzahl unerwünschter Anfragen, die die Webserver erreichen, reduzieren und damit weitere Ausfälle verhindern