Fail2ban (sinngemäß auf dt.: "Fehlschlag führt zum Bann") ist ein in Python geschriebenes Intrusion Prevention System (Framework zur Vorbeugung gegen Einbrüche), das auf allen POSIX-Betriebssystemen läuft, die ein manipulierbares Paketfiltersystem oder eine Firewall besitzen (z. B. iptables unter Linux).

Der Hauptzweck von fail2ban ist das Bestimmen und Blockieren bestimmter IP-Adressen, die wahrscheinlich zu Angreifern gehören, die sich Zugang zum System verschaffen wollen. fail2ban ermittelt aus Log-Dateien (u. a. /var/log/pwdfail, /var/log/auth.log oder /var/log/apache2/error.log) IP-Adressen, die in einem vom Administrator angesetzten Zeitrahmen z. B. öfter versuchen, sich mit falschen Passwörtern anzumelden oder andere gefährliche oder sinnlose Aktionen ausführen.

Sollen Services wie SSH, Apache über das Internet erreichbar sein (zB über Portforwarding im Router) wird empfohlen, diese Dienste wie folgt abzusichern.

Installation

sudo apt-get install fail2ban
Konfiguration

Die Konfiguration erfolgt in der Datei /etc/fail2ban/jail.local, die erst angelegt werden muss.

sudo touch /etc/fail2ban/jail.local
sudo chown root:root /etc/fail2ban/jail.local

Wesentlich sind nachfolgende Zeilen. Hiermit wird bestimmt, dass beim 3. Angriffsversuch (zB fehlgeschlagene Logins) die IP-Adresse des Angreifers für 600 Sekunden durch dir Firewall gesperrt wird. Diesen Wert ändern wir auf 3600 Sekunden (1 Stunde) - bei Bedarf kann hier auch zB ein ganzer Tag (86400 Sekunden) eingetragen werden. Zum testen können wir den Wert auf 10 Sekunden stellen.

bantime = 600
maxretry = 3
destemail = root@localhost
findtime = 600

Darunter werden die zu überwachenden Dienste angegeben. Standardmäßig sind einige bereits aktiv, weitere können hier zugefügt werden.

In der Datei /etc/rsyslog.conf muss in der Zeile auth,authpriv.* das Kommentarzeichen (#) entfernt werden und der Logging-Dienst neu gestartet werden (sudo /etc/init.d/rsyslog restart).

Für jeden Dienst, der geschützt werden soll, muss die Datei /etc/fail2ban/jail.local mit dem entsprechenden Block ergänzt werden. Der Eintrag in den Zeilen filter entspricht den Filterregeln im Verzeichnis /etc/fail2ban/filter.d/

Beispiel einer jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/24
findtime = 222
bantime  = 10

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3

[ssh-ddos]
enabled  = true
port     = ssh
filter   = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 3

[apache-auth]
enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 3

[apache-badbots]
enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*access.log
maxretry = 3

[apache-nohome]
enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 3

[apache-noscript]
enabled  = true
port     = http,https
filter   = apache-noscript
logpath  = /var/log/apache*/*error.log
maxretry = 3

[apache-overflows]
enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 3

[nginx-auth]
enabled  = true
port     = http,https
filter   = _nginx-auth
logpath  = /var/log/nginx*/*error*.log
maxretry = 3

[owncloud]
# in der owncloud-Config in config/config.php muss die Zeile "'log_authfailip' => true," und "'logtimezone' => 'Europe/Vienna'," existieren
enabled  = true
port     = http,https
filter   = _owncloud
logpath  = /var/www/owncloud/data/owncloud.log
maxretry = 3

Der ownCloud Filter existiert noch nicht, deshalb erstellen wir die Datei /etc/fail2ban/filter.d/_owncloud.conf und fügen folgendes ein und starten fail2ban neu:

 
[Definition]
failregex = {"app":"core","message":"Login failed: user '.*' , wrong password, IP:<HOST>.*

Der Nextcloud Filter existiert noch nicht, deshalb erstellen wir die Datei /etc/fail2ban/filter.d/_nextcloud.conf und fügen folgendes ein und starten fail2ban neu:

[Definition]
failregex = {"app":"core","message":"Login failed: user '.*' , wrong password, IP: <HOST>.*

Der nginx-auth Filter existiert noch nicht, deshalb erstellen wir die Datei /etc/fail2ban/filter.d/_nginx-auth.conf und fügen folgendes ein und starten fail2ban neu:

[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
            user .* was not found in.*client: <HOST>
            user .* password mismatch.*client: <HOST>

Zum Testen kann man die bantime auf 10 (Sekunden) stellen und probieren, sich 3x mit einem falschen Passwort via SSH einzuloggen. Nach dem 3. Mal sollte man für 10 Sekunden gesperrt werden, erst danach ist ein erneuter Versuch wieder möglich. In der Logdatei /var/log/fail2ban.log sollten Einträge vorzufinden sein, wann welche IP geblockt wurde:

2014-04-10 11:33:25,728 fail2ban.actions: WARNING [ssh] Ban 192.168.0.142
2014-04-10 11:33:35,769 fail2ban.actions: WARNING [ssh] Unban 192.168.0.142

Nun kann der Wert von 10 Sekunden auf zB 3600 Sekunden (1 Stunde) oder 86400 Sekunden (1 Tag) gestellt werden.

[hr]

Von Haus aus genehmigen sich die Fail2ban-Prozesse ziemlich viel RAM. Mit folgenden Anpassungen in der Datei /etc/default/fail2ban kann der Verbrauch drastisch verringert werden (zu diesem Teil des Tutorials von 140 MB auf 16 MB):

# Zufügen dieser Zeile an das Ende der Datei
ulimit -s 256

Danach ist ein Neustart von Fail2ban erforderlich:

sudo /etc/init.d/fail2ban restart