Schilde hoch: fail2ban und ufw

Mein Server ist täglich unter Beschuss: Ständig versuchen irgendwelche Verbindungen, Passwörter zu knacken und Konten zu nutzen. Eine fehlgeschlagene SSH-Verbindung erzeugt zum Beispiel Logfile-Einträge in /var/log/auth.log so wie diesen:

Jan  5 00:00:51 www sshd[24083]: Failed password for root from 222.186.15.31 port 46567 ssh2

Mit dem Tool fail2ban kann man diese und andere Logfiles überwachen. Treten innerhalb einer gewissen Zeit eine Anzahl solcher Fehler auf, darf man annehmen, dass es sich nicht um Zufall oder Versehen handelt: Hier probiert jemand. fail2ban sperrt daraufhin die IP des Angreifers für eine Zeit in der Firewall, sodass überhaupt keine weiteren Versuche mehr möglich sind.

Darüber schreibt fail2ban selbst auch ein Logfile in /var/log/fail2ban.log, das dann so ausschaut:

2020-01-08 20:03:03,408 fail2ban.filter         [533]: INFO    [sshd] Found 222.186.15.31 - 2020-01-08 20:03:03
2020-01-08 20:03:03,550 fail2ban.actions        [533]: NOTICE  [sshd] Ban 222.186.15.31
...
2020-01-08 20:13:04,697 fail2ban.actions        [533]: NOTICE  [sshd] Unban 222.186.15.31

Hier wurde also die IP-Adresse 222.186.15.31 aufgrund von mehrfachen Anmeldefehlern gesperrt und nach etwa 10 Minuten wieder freigegeben. Aber wie häufig passiert das? Das kann man sehr schön auf diese Weise herausfinden:

$ sudo awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n
...
     12 49.88.112.62
     13 218.92.0.212
     13 222.186.175.151
     13 222.186.175.202
     13 222.186.175.215
     13 222.186.180.41
     13 222.186.180.9
     14 222.186.169.194
     14 222.186.173.238
     14 222.186.175.148
     14 222.186.175.217
     14 49.88.112.61
     14 91.209.54.54
     15 222.186.173.183
     15 222.186.175.181
     15 222.186.180.223
     16 104.131.14.14
     16 222.186.175.155
     16 222.186.180.6
     16 96.53.65.154
     17 222.186.175.163
     17 222.186.180.17
     17 222.186.190.2
     18 222.186.173.226
     18 222.186.42.4
     20 222.186.175.161
     20 222.186.175.167
     22 49.88.112.117
     32 222.186.190.17
    399 222.186.3.249

Die erste Zahl gibt dabei an, wie häufig die betreffende IP gesperrt wurde. Die letzte Zeile 399 222.186.3.249 bedeutet somit: 399 Mal wurde die IP 222.186.3.249 aufgrund von zuvielen Fehlversuchen für eine Weile gesperrt, und wieder entsperrt. Hier ist eine dauerhaftere Lösung gefragt. Ich versuche also zunächst herauszufinden, woher die Verbindungen kommen.

Im Report oben sind Adressen aus dem Bereich 222.186.x.x häufig. Mit dem Kommando whois findest du heraus, wem diese IP-Adressen gehören:

$ whois 222.186.3.249
% IANA WHOIS server
% for more information on IANA, visit http://www.iana.org
% This query returned 1 object

refer:        whois.apnic.net

inetnum:      222.0.0.0 - 222.255.255.255
organisation: APNIC
status:       ALLOCATED

whois:        whois.apnic.net

changed:      2003-02
source:       IANA

% [whois.apnic.net]
% Whois data copyright terms    http://www.apnic.net/db/dbcopyright.html

% Information related to '222.184.0.0 - 222.191.255.255'

% Abuse contact for '222.184.0.0 - 222.191.255.255' is 'anti-spam@ns.chinanet.cn.net'

inetnum:        222.184.0.0 - 222.191.255.255
netname:        CHINANET-JS
descr:          CHINANET jiangsu province network
descr:          China Telecom
descr:          A12,Xin-Jie-Kou-Wai Street
descr:          Beijing 100088
country:        CN
...

Antwort: Diese IP-Adresse gehört zu einem immerhin 8 /16er-Netze großen Adressbereich, der China Telecom zugeordnet ist. Und viele weitere Adressen aus diesem Bereich spielen in meinem fail2ban-Report oben eine Rolle. Die Adresse 49.88.112.117 gehört zu einem sogar 32 16/er-Netze großen Bereich, der ebenfalls China Telecom gehört. Ein Gefühl sagt mir, dass eine Email an die abuse-Stelle wenig Hilfe bringen wird, also helfe ich mir selbst. Da ich hier auf niemanden Rücksicht nehmen muss, kommen einfach ganze Netzbereiche der China Telecom per Shell-Einzeiler in die Sperrliste der Debian ufw-Firewall.

# Block IPs 222.184.0.0/16 to 222.191.0.0/16
for i in $(seq 184 191); do sudo ufw deny from 222.$i.0.0/16; done

# Block IPs 49.64.0.0/16 to 49.95.0.0/16
for i in $(seq 64 95); do sudo ufw deny from 49.$i.0.0/16; done

Um zu kontrollieren, ob das richtig angenommen wurde, verwende ich den Befehl ufw status.

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
Anywhere                   DENY IN     49.64.0.0/16              
Anywhere                   DENY IN     49.65.0.0/16              
Anywhere                   DENY IN     49.66.0.0/16              
Anywhere                   DENY IN     49.67.0.0/16              
...

Ein Tipp: Die Reihenfolge der Regeln in ufw ist wichtig. Wer dort also zuerst eine Regel ALLOW IN Anywhere stehen hat und danach Sperrregeln wie die oben, wird keinen Erfolg haben. Die Reihenfolge der Regeln ist über das ufw-Tool leider nicht direkt zu ändern, am einfachsten bearbeitest du die Datei /etc/ufw/user.rules mit dem Editor deiner Wahl und lädst ufw danach mit dem Kommando sudo ufw reload neu.