Die Angriffe auf öffentlich erreichbare Server sind eine nervige Angelegenheit. Einige Milderung bringt da Fail2ban. Fail2ban überprüft, ob es von einer IP-Adresse aus mehrere erfolglose Anmeldeversuche gab, z.B. über SSH. Ist eine eingestellte Anzahl an solch erfolglosen Versuchen erfolgt, wird der Zugriff von dieser IP gesperrt.
Was gegen Angriffe von außen sehr hilfreich ist (es ist wirklich interessant zu sehen, wie viele Adressbuch-Attacken es täglich gibt), kann bei dem eigenen Anschluss extrem nerven. Vor allem, wenn mehrere Leute Server-Dienste, wie ownCloud oder Mail nutzen und sich so die Wahrscheinlichkeit für fehlerhafte Passworteingaben erhöht. Leider bekommt man als Nicht-Geschäftskunde vom Provider meist nur dynamische IP-Adressen vergeben, so dass man auch nicht eine statische IP whitelisten kann (was bewirken würde, dass diese IP von Fail2ban ignoriert wird).
Aus diesem Grund habe ich mich daran gemacht und ein kleines Skript geschrieben, womit die IP vom eigenen Anschluss immer wieder automatisch gewhitelisted wird.
Zunächst muss auf einem Rechner, der an dem Anschluss hängt die externe IP abgefragt werden und in eine Textdatei geschrieben werden:
dig +short myip.opendns.com @resolver1.opendns.com > /path/to/file/wanip.txt
Diese Datei schiebe ich dann mit rsync über SSH auf den Server (hierfür muss zunächst der Login über einen Key eingerichtet werden – ohne Passwortabfrage). Für beides lege ich einen Cronjob an. Hierzu zunächst root werden:
sudo su
und dann einen cronjob anlegen, indem man
crontab -e
aufruft und hier folgendes einträgt:
#Alle 5 Minuten die IP abfragen und per rsync auf den Server schieben
*/5 * * * * rsync -azbe 'ssh -i /path/to/key/key_rsa' /path/to/file/wanip.txt user@example.com:/path/to/file/
Auf dem Server muss ebenfalls ein Skript angelegt werden. Dazu z.B. mit Nano eine neue Datei anlegen:
nano /usr/local/bin/fail2ban-ip-whitelisting.sh
und hier folgendes einfügen und den eigenen Gegebenheiten anpassen:
#!/bin/bash
IPn=`cat /path/to/file/wanip.txt`
IPo=`cat /path/to/file/wanip_old.txt`
IPfix="127.0.0.1\ 127.0.0.0\/8\ 10.0.0.0\/8\ 172.16.0.0\/12\ 192.168.0.0\/16\ 176.28.21.39\/24\ "
CONFIG_FILE=/path/to/file/jail.local
if [ "$IPn" != "$IPo" ]
then
sed -i "s/\(ignoreip *= *\).*/\1$IPfix$IPn/" $CONFIG_FILE
echo $IPn > /path/to/file/wanip_old.txt
service fail2ban restart
echo "Neue IP gewhitelisted: $IPn Fai2ban neu gestartet" | mail -s "[Fail2ban] IP Whitelisting" postmaster@example.com
fi
Das Skript vergleicht die IP in der synchronisierten Textdatei mit einer vorher angelegten, in welcher sich die alte IP befindet. Wenn die IP sich unterscheiden fügt das Skript einige fest angelegte IP und die übermittelte IP in die Ignore-Liste von Fail2ban ein und startet anschließend Fail2ban neu. Damit dies funktioniert müssen noch einige Dinge erledigt werden.
Zunächst muss das Skript ausführbar gemacht werden. Dazu folgendes ausführen:
chmod +x fail2ban-ip-whitelisting.sh
Nun muss unter Umständen noch die Textdatei wanip_old.txt angelegt werden, das es sein kann, dass das Skript ansonsten abbricht. Nun sollte man noch ausprobieren, ob das Skript aus fehlerfrei läuft.
Hier im Ordner, in dem das Skript liegt einfach den Skript Namen aufrufen:
fail2ban-ip-whitelisting.sh
Wenn das Skript fehlerfrei durchläuft, kann es anschließend per Cron noch automatisiert werden. D.h. wieder
crontab -e
aufrufen
und hier folgendes eintragen:
#Alle 5 Minuten überprüfen, ob es eine neue IP gibt und uU bei Fail2ban eintragen
*/5 * * * * /usr/local/bin/fail2ban-ip-whitelisting.sh
Fertig das wars schon! Viel Spaß mit dem Skript!