In diesem Tutorial möchten wir Ihnen aufzeigen, wie man mittels Fail2Ban und UFW einen Ubuntu 18.04 Server gegen Portscanning absichern kann.

Hinweis: Wir gehen in diesem Tutorial davon aus, dass Sie UFW bereits auf Ihrem Server installiert und konfiguriert haben. Ein anderes Tutorial erläutert, wie Sie UFW auf Ubuntu-Servern installieren und konfigurieren.

Was ist Fail2Ban?

Fail2ban ist ein Security-Tool, dass in der Lage ist, anhand von Logdateien und Filtern bestimmte Actions auszuführen, z.B. IP-Adressen den Zugriff auf Ihren Server zu sperren. Dabei können Logdatein nach Mustern durchsucht werden (Filter) und Informationen an eine Action weitergeben werden. Diese Action wiederum kann dann, wie in diesem Tutorial erläutert wird, z.B. IPs aussperren.

Fail2Ban installieren und einrichten

Fail2Ban installieren wir auf unserem Ubuntu-Server mit folgendem Befehl:

sudo apt-get install fail2ban

Die Installation sollte nur wenige Sekunden dauern. Nach der Installation kopieren wir die Fail2Ban Konfigurations-Datei jail.conf als jail.local. Damit verhindern wir die Löschung unserer Einstellungen nach einem Update und haben für den Fall einer Fehlkonfiguration immer ein Backup:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Nun können wir die Datei jail.local mit dem Konsoleneditor nano bearbeiten:
nano /etc/fail2ban/jail.local
Interessant sind hier 3 Felder:

  • ignoreip : Hier können wir alle IPs definieren, die nicht gebannt werden sollen
  • bantime : Hier können wir einstellen, wie lange die IPs gesperrt sein sollen
  • findtime : Hier wir definiert, wie lange in unseren Logs gesucht werden soll.

Als Beispiel können wir folgendes definieren:

....
ignoreip = XXX.XXX.XXX.XXX
# 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 
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 "findti$
# seconds.
findtime  = 24h
.....

Wir setzen also die IP XXX.XXX.XXX.XXX via ignoreip auf die Whitelist,  die bantime beträgt 48 Stunden und die findtime beträgt 24 Stunden.

Hinweis: Diese Einstellungen gelten nun für alle Jails. Wir können für einzelne Jails auch innerhalb der Jail-Konfiguration bantime und findtime definieren.

Nun erstellen wir das Jail. Dazu definieren wir ganz am Ende unserer jail.local das Jail ufw-port-scan:

....
[ufw-port-scan]
enabled = true
port = all
filter = ufw-port-scan
banaction = ufw-action
logpath = /var/log/ufw.log
maxretry = 5

Hier eine Erläuterung unseres UFW-Jails:

  • enabled = true aktiviert unser Jail. Bei enabled = false bleibt unser Jail untätig.
  • port = all definiert, dass alle Ports überwacht werden. Optional können wir einzelne Ports stehen.
  • filter = ufw-port-scan verweist auf einen Log-Filter der mittels regex die Logdatei durchsucht. Bei Treffern kann eine Action ausgeführt werden.
  • banaction = ufw-action Die banaction definiert was bei einem Treffer passieren soll.
  • logpath = /var/log/ufw.log ist der Pfad zu unserer UFW-Logdatei
  • maxretry = 5 definiert die maximalen Zugriffe bevor eine Action ausgeführt wird.

Fail2Ban Filter erstellen

Erstellen wir nun den Filter ufw-port-scan. Als ersts erstellen wir eine neue Datei names ufw-port-scan.conf im Order /etc/fail2ban/action.d/:

nano /etc/fail2ban/filter.d/ufw-port-scan.conf
Hier könnnen wir nun die Definition unseres Filter ein:

[Definition]
failregex = .*\[UFW BLOCK\] IN=.* SRC=
ignoreregex =

Wie bereits erwähnt beinhaltet der Filter einen Regex, der in der Logdatei Treffer finden soll. Sobald innerhalb unserer definierten findtime die  eine IP mehr als 5 mal gefunden wird (wir haben 24 Stunden als findtime definiert) wird diese IP für 48 Stunden gesperrt (siehe bantime).

Actions erstellen

Die eigentliche Sperrung der IP wird aber nicht in unserem Filter sondern in einer Action definiert, die wir folgendermaßen erstellen können. Alle Actions werden im Verzeichnis /etc/fail2ban/action.d/ gespeichert. Mit nano erstellen wir deshalb die Datei ufw-action.conf:
nano /etc/fail2ban/action.d/ufw-action.conf
In unsere neue Datei tragen wir nun die Action-Definition ein:

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ufw insert 1 deny from  to any
actionunban = ufw delete deny from  to any

Sobald eine IP innerhalb von 24 Stunden mindestens 5 mal in unserer ufw.log Logdatei auftaucht wird diese für 48 Stunden gesperrt. actionban definiert dabei den auszuführenden Befehl bei einem Treffer. Nach 48 Stunden wird die IP durch den actionunban Befehl wieder aus der UFW-Blockliste entfernt.

Wir haben nun das Jail definiert sowie den Filter und die Action erstellt und müssen nur noch fail2ban neu starten, damit die Einstellungen wirksam werden:

sudo service fail2ban restart

Nach einiger Zeit sollte sich die Wirksamkeit zeigen. Auf unserem Server sind 14 IP-Adressen vollständig ausgesperrt worden. Diese haben, wie in unserem Filter definiert, mindestens 5 mal versucht auf durch UFW blockierte Ports zuzugreifen.

Status: active

To                         Action      From
--                         ------      ----
Anywhere                   DENY        XXX.XXX.XXX.XXX
....
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
....

Die durch unser Jail gefundenen IP-Adressen sollten nun für 48 Stunden vollständig gesperrt bleiben und einen Portscan, zumindest mit der gesperrten IP, unmöglich machen.

Hinweis: Da wir in diesem Tutorial fail2ban und ufw neu installiert haben, jedoch ufw noch nicht konfiguriert. Ein Tuturial zum Thema UFW installieren und konfigurieren haben wir bereits auf unserem Blog veröffentlicht.