Das Internet ist laut, voll und vor allem: ständig unter Beobachtung.
Nein, nicht von Menschen – sondern von Bots. Automatisierte Programme, die 24/7 durch das Web kriechen. Manche helfen dabei, Seiten zu durchsuchen (z. B. Googlebots), andere aber sind deutlich aggressiver unterwegs: Sie scannen Webseiten auf Schwachstellen, suchen Login-Formulare, testen Passwörter oder sammeln E-Mail-Adressen für Spam.
Wenn du eine Website oder einen Server betreibst, bekommst du das vielleicht gar nicht direkt mit. Aber deine Logs sagen etwas anderes: Unbekannte IPs, seltsame Anfragen, auffällige URLs.
In diesem Beitrag zeige ich dir:
- Was Scanner-Bots im Internet machen
- Warum du dich davor schützen solltest
- Und wie du das mit Fail2Ban praktisch umsetzt, um diese Bots zu blockieren
Was machen diese Bots überhaupt?
Hier ein paar typische Beispiele für „bösartige“ Bots:
- Directory Scanner – durchsuchen deine Seite nach /admin, /login, /phpmyadmin usw.
- Login-Brute-Forcer – versuchen Passwörter bei WordPress, Mail oder FTP durch.
- Scraper – kopieren Inhalte, Produktdaten oder Kundenlisten.
- Mailsammler – sammeln E-Mail-Adressen aus Impressen oder Kontaktformularen.
Diese Bots sind oft nicht nur lästig, sondern ein echtes Sicherheitsrisiko. Denn sie können:
- Serverlast erzeugen
- echte Angriffsversuche vorbereiten
- Schwachstellen entdecken
- deine E-Mails auf Spamlisten bringen
Schutzmaßnahmen: Was kann ich tun?
Neben Firewalls und regelmäßigen Softwareupdates gibt es eine sehr effektive Maßnahme, um diese Angriffe aktiv zu bekämpfen: => Erkennen – Reagieren – Blockieren
Das kannst du z. B. mit dem Tool Fail2Ban tun.
Anleitung: Scanner-Bots mit Fail2Ban blockieren
Fail2Ban ist ein hervorragendes Tool, das Logdateien auf deinem Server überwacht und automatisch IP-Adressen blockiert, wenn verdächtige Muster erkannt werden. Hier gehen wir speziell auf das Erkennen von Scanner-Bots ein, die nach nicht existierenden .php-Dateien suchen.
Beispiel: Schutz vor verdächtigen HTTP-Anfragen (bei dynamischen Websites)
Die nachfolgende Anleitung überprüft den Logfile deines Webservers und blockiert automatisch IP-Adressen, die wiederholt nach nicht existierenden .php-Dateien suchen (z. B. Angriffe durch Scanner oder Brute-Force-Versuche).
1. NGINX Config Anpassen
Füge deiner NGINX Config folgendes Log Format hinzu
log_format fail2banlog <span class="hljs-string">'{"ip": "$remote_addr",'</span>
<span class="hljs-string">'"host": "$host",'</span>
<span class="hljs-string">'"path": "$request_uri",'</span>
<span class="hljs-string">'"status": "$status",'</span>
<span class="hljs-string">'"referrer": "$http_referer",'</span>
<span class="hljs-string">'"user_agent": "$http_user_agent",'</span>
<span class="hljs-string">'"length": $bytes_sent,'</span>
<span class="hljs-string">'"generation_time_milli": $request_time,'</span>
<span class="hljs-string">'"date": "$time_iso8601"}'</span>;
Im location block:
access_log /<span class="hljs-keyword">var</span>/log/nginx/<span class="xml"><span class="hljs-tag"><<span class="hljs-name">log-file-namen-hier-einfügen</span>></span> fail2banlog;</span>
2. Fail2Ban installieren (unter Debian/Ubuntu)
Zuerst musst du Fail2Ban auf deinem Server installieren. Verwende dazu den folgenden Befehl:
sudo apt install fail2ban
Nach der Installation kannst du sicherstellen, dass das Fail2Ban-Daemon läuft:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
3. Filterdatei erstellen für NGINX Bad Bot Detection
Erstelle eine Filterdatei, um spezifische Angriffe zu erkennen, z. B. wenn nach nicht existierenden .php-Dateien gefragt wird.
sudo nano /etc/fail2ban/filter.d/nginx-bot-detection.conf<span class="hljs-comment"># Fail2Ban filter to match web requests for non-existing .php files</span>
<span class="hljs-comment">#</span>
[Definition]
failregex = ^{\<span class="hljs-string">"ip\": \"<HOST>\",.*\"path\": \".*(\.php).*\",.*\"status\": \"(404|403)\",.*$
ignoreregex =
# Nur sicherstellen, dass nur Fehler von nginx erfasst werden
journalmatch = _SYSTEMD_UNIT=nginx.service + _COMM=nginx</span>
- failregex: Dies ist das wichtigste Element. Es sucht nach Anfragen, bei denen eine .php-Datei angefordert wird, die mit einem HTTP-Status 404 (nicht gefunden) oder 403 (verboten) endet. Das bedeutet, dass ein Bot nach einer nicht existierenden Datei fragt und eine Fehlermeldung erhält.
- ignoreregex: Hier kannst du zusätzliche Anfragen definieren, die nicht gefiltert werden sollen, aber in diesem Fall bleibt es leer.
- journalmatch: Damit wird sichergestellt, dass nur Logs von Nginx berücksichtigt werden.
4. Jaildatei erstellen (nginx-bot-detection)
Erstelle nun eine Jaildatei, die Fail2Ban anweist, die Filterdatei zu verwenden und automatisch IP-Adressen zu blockieren.
sudo nano /etc/fail2ban/jail.d/nginx-bot-detection.local[nginx-bot-detection]
enabled = <span class="hljs-keyword">true</span>
port = http,https
logpath = /<span class="hljs-keyword">var</span>/log/nginx/access.log <span class="hljs-comment"># Stelle sicher, dass du den Pfad zur richtigen Logdatei verwendest</span>
maxretry = <span class="hljs-number">30</span>
bantime = <span class="hljs-number">3600</span> <span class="hljs-comment"># IP wird für eine Stunde blockiert, du kannst den Wert nach Bedarf anpassen</span>
findtime = <span class="hljs-number">600</span> <span class="hljs-comment"># Zeitraum, in dem maxretry erreicht werden muss (z.B. 10 Minuten)</span>
action = %(action_mwl)s <span class="hljs-comment"># Mail With WHOIS Lookup - Sendet an den root@ nutzer eine Email, kann entfernt werden</span>
%(action_abuseipdb)s[abuseipdb_category=<span class="hljs-string">"21"</span>] <span class="hljs-comment"># Entferne diese Zeile, wenn du AbuseIPDB nicht verwendest</span>
- enabled: Aktiviert die Regel.
- port: Der Standard-Webport für HTTP und HTTPS.
- logpath: Der Pfad zur Logdatei von Nginx. Achte darauf, dass du den richtigen Pfad angibst.
- maxretry: Die Anzahl der Versuche, die innerhalb von findtime (10 Minuten) erlaubt sind, bevor die IP-Adresse blockiert wird.
- bantime: Die Zeitdauer, für die eine IP-Adresse blockiert wird (hier 1 Stunde).
- action: Definiert die Aktionen, die bei einem Verstoß ausgeführt werden, z. B. Benachrichtigungen, IP-Blockierungen und das Melden an AbuseIPDB.
5. AbuseIPDB Konfiguration (optional)
Wenn du AbuseIPDB verwenden möchtest, um bösartige IP-Adressen zu melden, musst du deinen API-Schlüssel in der Fail2Ban-Konfiguration hinterlegen.
- Registriere dich auf AbuseIPDB und erhalte deinen API-Schlüssel.
- Bearbeite die action.d/abuseipdb.conf-Datei:
sudo nano /etc/fail2ban/action.d/abuseipdb.conf<span class="hljs-comment"># AbuseIPDB config</span>
abuseipdb_api_key = Dein_API_Schlüssel
6. Fail2Ban neu starten
Nachdem alle Konfigurationen abgeschlossen sind, starte Fail2Ban neu, damit die Änderungen übernommen werden:
sudo systemctl restart fail2ban
Du kannst den Status von Fail2Ban überprüfen, um sicherzustellen, dass alles ordnungsgemäß funktioniert:
sudo fail2ban-client status
Anleitung: Scanner-Bots über SSH bannen mit Fail2Ban
Fail2Ban bietet eine hervorragende Möglichkeit, sich vor Brute-Force-Angriffen und Scanner-Bots zu schützen, die versuchen, über SSH in deinen Server einzudringen. Diese Anleitung zeigt dir, wie du Fail2Ban so einrichtest, dass SSH-Login-Versuche überwacht und IP-Adressen blockiert werden, die zu oft falsche Passwörter eingeben.
- Fail2Ban installieren (unter Debian/Ubuntu)
Falls du Fail2Ban noch nicht installiert hast, kannst du dies mit folgenden Befehlen tun:
sudo apt update
sudo apt install fail2ban
Nachdem die Installation abgeschlossen ist, stelle sicher, dass Fail2Ban automatisch startet:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
- Standard-SSH-Fail2Ban-Konfiguration prüfen
Fail2Ban enthält bereits eine Standardkonfiguration für SSH-Schutz, die du anpassen kannst.
Öffne die Datei, die für die SSH-Überwachung zuständig ist:
sudo nano /etc/fail2ban/jail.local
Falls diese Datei nicht existiert, erstelle sie und füge folgende Zeilen hinzu:
[sshd]
enabled = <span class="hljs-literal">true</span>
port = ssh
logpath = <span class="hljs-regexp">/var/</span>log/auth.log
maxretry = <span class="hljs-number">5</span>
bantime = <span class="hljs-number">3600</span>
findtime = <span class="hljs-number">600</span>
Erläuterungen zu den Einstellungen:
- enabled: Aktiviert den SSH-Schutz.
- port: Definiert den Port, der überwacht wird (standardmäßig 22 für SSH).
- logpath: Der Pfad zur Logdatei, in der fehlgeschlagene Login-Versuche protokolliert werden. Auf den meisten Linux-Servern ist dies /var/log/auth.log.
- maxretry: Die maximale Anzahl der fehlgeschlagenen Versuche, bevor eine IP-Adresse blockiert wird (hier 5 Versuche).
- bantime: Die Zeit, für die eine IP-Adresse gesperrt wird (hier 1 Stunde).
- findtime: Der Zeitraum, innerhalb dessen die maxretry-Fehlversuche gezählt werden (hier 10 Minuten).
- Fail2Ban neu starten
Nachdem du die Konfiguration angepasst hast, starte Fail2Ban neu, damit die Änderungen wirksam werden:
sudo systemctl restart fail2ban
Du kannst den Status von Fail2Ban überprüfen, um sicherzustellen, dass die SSH-Überwachung korrekt läuft:
sudo fail2ban-client status sshd
Dieser Befehl zeigt dir die Anzahl der aktuell blockierten IPs und gibt dir eine Übersicht der aktiven Regeln.
- Weitere Schutzmaßnahmen für SSH (optional)
Neben der Fail2Ban-Überwachung gibt es noch weitere Empfehlungen, die du umsetzen kannst, um SSH noch sicherer zu machen:
a) Ändere den Standard-SSH-Port
Der Standard-SSH-Port ist 22 und wird oft von Bots abgezielt. Um dies zu ändern, bearbeite die Datei /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Ändere die Zeile:
<span class="hljs-selector-id">#Port</span> 22
in eine andere Zahl, z. B.:
Port 2222
Nachdem du die Datei gespeichert hast, starte den SSH-Dienst neu:
sudo systemctl restart ssh
b) Verwendung von SSH-Schlüsseln statt Passwörtern
Verwende SSH-Schlüssel anstelle von Passwörtern für die Anmeldung. Dies ist eine viel sicherere Methode und verhindert Brute-Force-Angriffe auf dein Passwort.
Generiere einen SSH-Schlüssel:
ssh-keygen -t rsa -b 4096
Füge den öffentlichen Schlüssel zu ~/.ssh/authorized_keys auf deinem Server hinzu, um die Anmeldung mit einem Passwort zu deaktivieren.
Bearbeite die Datei /etc/ssh/sshd_config und setze:
PasswordAuthentication no
Starte den SSH-Dienst nach der Änderung neu:
sudo systemctl restart ssh
- AbuseIPDB Integration (optional)
Wenn du zusätzlich AbuseIPDB nutzen möchtest, um bösartige IPs zu melden, kannst du die Integration in Fail2Ban vornehmen.
- API-Key bei AbuseIPDB registrieren
- Fail2Ban-Konfiguration anpassen, indem du den API-Schlüssel hinterlegst. Bearbeite dazu die Datei /etc/fail2ban/action.d/abuseipdb.conf und füge deinen API-Schlüssel hinzu.
<span class="hljs-comment"># AbuseIPDB config</span>
abuseipdb_api_key = Dein_API_Schlüssel
Füge in der Datei /etc/fail2ban/jail.local den AbuseIPDB-Befehl hinzu:
action = %(action_mwl)s
%(action_abuseipdb)s[abuseipdb_category=<span class="hljs-string">"22"</span>]
- Fail2Ban Logs überwachen
Um sicherzustellen, dass Fail2Ban funktioniert, kannst du die Logdateien überwachen. Fail2Ban speichert alle Aktionen in den Logs:
sudo tail -f /<span class="hljs-keyword">var</span>/log/fail2ban.log
So kannst du in Echtzeit sehen, welche IPs blockiert werden.
