Viele Server haben den SSH Dienst als zentralen Verbindungspunkt im Internet geöffnet. Dieser wird gebraucht damit du deinen Server administrieren kannst. Eben genau dieser wird gerne von Angreifern penetriert und mit Brute-Force-Attacken angegriffen. Fail2Ban ist genau dafür da, Brute-Force-Attacken zu verhindern. In der Datei “/var/log/auth.log” könnten z.B. diese Meldungen erscheinen, dann bist du bereits Opfer solcher Attacken.

Feb 25 17:28:44 servername srv[3796]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=87.94.45.X  user=root
Feb 25 17:28:46 servername srv[3796]: Failed password for root from 87.94.45.X port 22 ssh2

Fail2Ban einfach erklärt

Fail2Ban ist also dafür da, auffällige fehlgeschlagene Loginversuche zu erkennen und entsprechende Angreifer von dem System fern zu halten. Dadurch dass eine Verbindung aufgebaut wird, gibt der Angreifer seine IP-Adresse preis und genau diese wird für einen bestimmten Zeitraum gesperrt. Dabei spielt es ebenfalls keine Rolle, ob der Angreifer sich mit dem Root Benutzer oder einem anderen Account versucht einzuwählen.

Fail2Ban installieren und Debian / Ubuntu

sudo apt install fail2ban

Die Konfiguration anpassen

Nach der Installation ist wird die Standard-Konfiguration in dem Ordner /etc/fail2ban/jail.conf abgelegt. Dies ist aber nicht die Konfiguration welche vom System genutzt wird. Die jail.conf wird bei jedem Update mit der neusten Datei überschrieben.
Eure Änderungen müssen nämlich in die jail.local. Also Kopieren wir die jail.conf Datei in eine jail.local Datei.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

sudo nano /etc/fail2ban/jail.local

Im Sektor Default können unteranderem die Werte gesetzt werden für die Bannzeit, Fehlversuche und die Zeit in der die Fehlversuche gelten. Diese könnte Ihr gerne nach belieben anpassen. Die SSH Option findet ihr etwas weiter unten in dieser Datei.

In diesem Beispiel wird innerhalb der letzten 4 Stunden geschaut ob Fehlgeschlagene Zugriffe stattgefunden haben. Ist das der Fall, wird ein weiterer Zugriff für 48 Stunden ausgeschlossen.

[...]
[...]
[DEFAULT]

#
# MISCELLANEOUS OPTIONS
#

# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator.
ignoreip = 127.0.0.1/8 ::1

# External command that will take an tagged arguments to ignore, e.g. <ip>,
# and return true if the IP is to be ignored. False otherwise.
#
# ignorecommand = /path/to/command <ip>
ignorecommand =

# "bantime" is the number of seconds that a host is banned.
bantime  = 48h

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 4h

# "maxretry" is the number of failures before a host get banned.
maxretry = 3
[...]
[...]
# SSH servers

[sshd]

enabled	= true
port    = ssh
filter	= sshd
[...]

Zu guter Letzt muss man den Service noch Neustarten und alles ist Lauffähig. Euer Server wird nun auf fehlgeschlagene Logins überprüft und bei Zunahme werden entsprechende Source-IPs gesperrt.

sudo service fail2ban restart

Ein paar Befehle für Fail2Ban

fail2ban-client status – Zeigt Global den aktuellen Status an.

fail2ban-client status sshd – Zeigt die im Moment gesperrten IP-Adresse für den Dienst SSH an.

fail2ban-client unban 100.200.33.87 – Entsperrt die IP 100.200.33.87 von allen Banlisten.

fail2ban-client set sshd unban 100.200.33.87 – Entsperrt die IP nur im SSH Jail.

fail2ban-client set sshd banip 100.200.33.87 – Sperr die IP im SSH Jail.

fail2ban-client unban –all – Entsperrt alle IP-Adressen