Nachdem ich vor kurzem von der SpamAttacke auf den MailServer eines Kumpels berichtet habe und davon wie ich letztendlich die IPs der versendenden Rechner per iptables geblockt habe, hat unser Hoster reagiert und das Tool Fail2ban installiert, dass ich hier mal kurz vorstelle.
Fail2ban ist, um es mit den Worten auf der Fail2ban Seite zu formulieren, ein Scanner, der die Logfiles, zB. des Apache oder auch eines Mailserver, wie postfix oder die auth.log für ssh Zugriffe, usw. durchsucht und mittels konfigurierbarer RegEx-Regeln entscheidet, ob eine IP geblockt werden soll, oder nicht. Damit kann zB. verhindert werden, dass von einer IP übermässig oft versucht wird, per ssh auf den Server zuzugreifen. Die Anzahl der möglichen Versuche ist einstellbar, default ist hier 3. Fail2ban nutzt zum Blocken der IPs die schon auf einem System vorhandenen Möglichkeiten, wie iptables oder shorewall und richtet, wenn eine Regel in den Logfiles anschlägt, einen entsprechenden neuen Eintrag mit der IP in der firewall (zB. iptables) ein.
Fail2ban ist in Python geschrieben und bringt einen eigenen Server daemon mit, der multithreaded ist und auf einem Unix socket auf Kommandos des zugehörigen fail2ban-clients lauscht.
Um die Arbeitsweise und die Konfiguration von Fail2ban zu zeigen, hier ein Beispiel:
Fail2ban für SSH Zugriffe:
Jeder der sich mal seine Logfiles anschaut auf dem eigenen Server wird sehen, dass automatische Scripte immer und immer wieder versuchen Server zu finden auf denen Standardpasswörter eingerichtet sind, die leicht zu knacken sind. Dabei findet man dann immer wieder Einträge wie diese:
root@myserver:~# more /var/log/auth.log | grep invalid
Mar 6 06:55:57 myserver sshd[9464]: Failed password for invalid user <!-- from 217.91.32.113 port 43337 ssh2
Mar 6 07:33:26 myserver sshd[19861]: Failed password for invalid user admin from 219.153.43.163 port 51098 ssh2
Mar 6 12:00:19 myserver sshd[29710]: Failed password for invalid user globus from 59.160.134.126 port 44416 ssh2
Nun könnte man einfach manuell diese IPs per iptables blocken, dies würde jedoch einen ziemlichen Aufwand bedeuten und wer will das schon.
Und genau hier kommt Fail2ban ins Spiel.
Konfiguration von Fail2ban
Die globale Konfiguration (Loglevel, Ort der Fail2ban-Logfiles) werden in der
/etc/fail2ban/fail2ban.conf
eingestellt.
Welche Serverdienste unter Fail2ban-Kontrolle gestellt werden, d.h. welche Logfiles gescannt werden, das stellt man dann in der
/etc/fail2ban/jail.conf
ein.
Um bei unserem SSH Beispiel zu bleiben, sieht der Eintrag in der jail.conf dafür so aus:
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Wie man sieht, muss hier der Pfad zu dem zu durchsuchenden Logfile angegeben werden, sowie die Anzahl an gleichen gefunden Einträgen, nach denen die entsprechende IP geblockt wird.
Die eigentlichen RegEX-Regeln wiederum finden sich dann im Verzeichnis
/etc/fail2ban/filter.d
in einzelnen Dateien, je Dienst. Hier ein Auszug aus der Liste auf unserem Server, um einen Eindruck davon zu bekommen, welche Dienste überwacht werden können.
root@myserver:/etc/fail2ban/filter.d# l
insgesamt 52K
drwxr-xr-x 2 root root 4,0K 3. Mär 18:50 .
drwxr-xr-x 4 root root 4,0K 3. Mär 19:08 ..
-rw-r--r-- 1 root root 548 19. Nov 2006 apache-auth.conf
-rw-r--r-- 1 root root 539 19. Nov 2006 apache-noscript.conf
-rw-r--r-- 1 root root 521 19. Nov 2006 postfix.conf
-rw-r--r-- 1 root root 546 19. Nov 2006 proftpd.conf
-rw-r--r-- 1 root root 580 19. Nov 2006 sasl.conf
-rw-r--r-- 1 root root 666 7. Jan 2008 sshd.conf
Zurück zum SSH Beispiel.
Ein Blick in die sshd.conf zeigt uns neben einigen Kommentaren vor allem die Regel, die festlegt, welche Einträge innerhalb der auth.log nicht auftreten sollten, und falls doch, bei welchen die IP geblockt wird.
root@myserver:/etc/fail2ban/filter.d# more sshd.conf
# Fail2Ban configuration file
...
[Definition]
# Option: failregex
...
failregex = (?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FR
OM) <HOST>(?: port \d*)?(?: ssh\d*)?\s*$
Hier sieht man, dass ein Eintrag im auth.log, wie der den ich oben gezeigt habe:
Mar 6 12:00:19 myserver sshd[29710]: Failed password for invalid user globus from 59.160.134.126 port 44416 ssh2
natürlich unter diesen RegEx fällt und somit diese IP geblockt werden sollte, wenn dieser Eintrag mehr als 3mal gefunden wird.
Doch bevor ich hier noch mehr aushole, sei an dieser Stelle auf die Anleitung auf der Fail2ban-Seite verwiesen, die ausführlich die Einstellungsmöglichkeiten erklärt und eine gute Hilfe darstellt!
http://www.fail2ban.org/wiki/index.php/MANUAL_0_8
Um das SSH Beispiel abzuschliessen kommt hier noch ein Auszug aus der iptables Tabelle mit der Fail2ban-ssh Chain, um zu zeigen, dass unsere Beispiel Evil IP 59.160.134.126 :) auch geblockt wurde.
root@myserver:/etc/fail2ban/filter.d# iptables -L --line-numbers
Chain fail2ban-ssh (1 references)
num target prot opt source destination
1 DROP all -- 59.160.134.126.ill-bgl.static.vsnl.net.in anywhere
2 DROP all -- 82.197.131.249 anywhere
3 DROP all -- 163.43.153.219.broad.cq.cq.dynamic.163data.com.cn anywhere
4 DROP all -- pd95b2071.dip0.t-ipconnect.de anywhere
5 DROP all -- host220-38-static.37-85-b.business.telecomitalia.it anywhere
6 DROP all -- 202.103.180.45 anywhere
7 DROP all -- 222.48.111.230 anywhere
8 DROP all -- d0022.colocat.ru anywhere
9 DROP all -- mn09mel.mironet.com.au anywhere
Fazit zu Fail2ban
Mit diesem kleinen Python Tool lassen sich effizient und einfach Regex Regeln erstellen, um systemlogfiles zu durchsuchen und das automatische Blocken von IPs zu erlauben. Man muss zwar schauen, dass man die Regeln nicht zu allgemein formuliert, zB. bei apache regeln, um nicht auf einmal jeden WebsiteBesucher auszuschliessen, wenn man aber erstmal verstanden hat wie fail2ban funktioniert ist es ein wirklich nützlicher Helfer im täglichen Kampf gegen automatisierte Angriffe auf die eigenen Server.


Kommentar hinzufügen