[Tutorial] Server mit fail2ban absichern

Hallo zu einem weiteren Tutorial auf Kopfkino!

Dies ist der Beginn einer kleinen Security Artikel Serie, in der ich Tipps gebe, wie man seinen Server besser gegen unberechtigte Zugriffe absichern kann.

Heute möchte ich euch zeigen, wie man seinen Debian oder Linux Webserver mit wenigen Schritten gegen diversere Angriffsszenarien absichern kann, egal ob kleiner Raspberry Pi oder großer Rechenbolide. Angegriffen wird jeder wenn er vom Internet aus erreichabr ist 😉

Das Zaubertool das uns etwas mehr Sicherheit bescheren soll heißt fail2ban und liest einmal pro Sekunde vordefinierte Systemlogs aus und bannt die Angreifer daraufhin mit Hilfe von iptables, die jede Linux Distro von Haus aus mitbringt. Fail2ban benötigt nur Pyhton ab Version 2.6 und läuft alternativ auch mit PyPy. Auch lässt es sich leicht mit eigenen Scripten erweitern, dazu aber mehr in einem der Folge Artikel.

Was ist mit fail2ban überhaupt möglich? Beispielsweise kann eine IP nach 5 fehlgeschlagegen SSH Loginversuchen innerhalb von 10 Minuten für einen Tag geblockt werden.

Aber nicht nur gegen SSH Angriffe lässt sich der Server absichern. Von Haus aus kommen Skripte für Webserver wie Apache, Lighttpd oder Nginx, aber auch für Mailserver, FTP-Server und viele andere Dienste mit.

Los gehts!

Die Installation und Konfiguration ist recht simpel und kann innerhalb von wenigen Minuten erledigt werden. In meinem Fall führe ich die Installation unter Debian Wheezy durch, sollte sich aber problemlos auf andere Linuxdistributionen wie z.B. Ubuntu übertragen lassen.

Da die Debian Paketquellen relativ alt sind (momentan Version 0.8.6-3wheezy2), bevorzuge ich die Quellen direkt von Github zu laden und mir das Paket selbst zu kompilieren. Die aktuelle Version momenten ist 0.9.0 vom 15.03.2014.

Zuerst wechseln wir in das Homeverzeichnis und erstellen uns ein Arbeitsverzeichnis in dem wir fail2ban bauen werden

# cd ~
# mkdir src
# cd src

Falls git-core noch nicht installiert ist

# sudo aptitude update
# sudo aptitude install git-core

Nun fail2ban auschecken, kompilieren und als root installieren

# git clone https://github.com/fail2ban/fail2ban.git
# cd fail2ban
# sudo su
# python setup.py install

Nun ist alles am richtigen Platz und wir können anfangen die Konfig Files zu editieren. Diese findet man unter /etc/fail2ban. Da man die origianl Files nicht bearbeiten sollten, legen wir zuerst Kopien der Files an, allerdings mit der Endung *.local.
Wenn fail2ban startet, dann überschreiben diese .local Files die Werte in den original Konfig Files. Wenn man nun eine neue Version von fail2ban kompiliert und installiert, werden keine eigenen Einstellungen in den *.local Files überschrieben.

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

Zuerst die /etc/fail2ban/fail2ban.local bearbeiten, hier kann man u.a. folgende Einstellungen setzen: loglevel, logtarget und am wichtigsten dbpurgeage.

dbpurgeage ist die Zeit, für die Angreifer in der lokalen Datenbank gespeichert werden. Standard ist 86400 (24 Stunden), ich empfehle den Wert aber mindestens zu verdoppeln, wenn nicht noch höher zu setzen. Außerdem sollte er mit dem Wert der bantime in der jail.local übereinstimmen.

Mir sind z.B. diverse chinesische IP-Ranges aufgefallen, die relativ penetrant versuchen sich als root per SSH anzumelden. Kaum sind diese wieder entsperrt, probieren sie es innerhalb weniger Stunden erneut.

Der größere Teil der Konfig ist in der /etc/fail2ban/jail.local zu erledigen. In dieser Datei werden weitere Parameter gesetzt und die verschiedenen Jails (die die Dienste bzw. Logs überwachen) aktiviert.
Die wichtigsten sind die folgenden:

ignoreip = 127.0.0.1/8           #Die Netzwerke derren Versuch generell ignoriert werden. Praktisch wenn man selbst eine statische IP besitzt, dann kann man diese hier hinzufügen, z.B. 1.2.3.4/32
bantime  = 172800            #Der Standard ist nur 1200, also 20 Minuten. Da man sich evtl. auch selbst aussperren kann sollte man den Wert nicht zu hoch setzen
findtime  = 1200            #Standard ist 600 Sekunden
maxretry = 5            #Anzahl der fehlgeschlagenen Loginversuche nach denen gesperrt wird
enabled = false            #Unbedingt auf false lassen, sonst werden alle Jails aktiviert, egal ob der Dienst überhaupt installiert ist
destemail = empfänger@deinedomain.de
sender = absender@deinedomain.de

Ungefähr ab Zeile 200 findet man dann die Jails für die verschiedenen Dienste. Um ein Jail für einen Dienst zu aktivieren muss folgende Zeile hinzugefügt werden

enabled = true

Folgender Block überwacht beispielsweise SSH Zugriffe

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s

Nun kann man die gewünschten Jails aktivieren. Zusätzlich kann man auch noch weitere Aktionen definieren, die ausgeführt werden sobald eine IP gebannt wird. Ein Beispiel wäre eine automatisierte Benachrichtigung per Email. Die verschiedenen Möglichkeiten findet man, wenn man nach „Action shortcuts“ sucht.

Folgender Code bannt nicht nur Angreifer bei fehlgeschlagenen Loginversuchen, sondern sendet auch eine Email mit WHOIS Daten und die Logeinträge an die vorher definierte Emailadresse

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
action = %(action_mwl)s

Man sollte aber vorsichtig sein bei welchen Diensten man einen Emailversand aktiviert, nicht dass man in einer Emailflut versinkt 😀
Zur Sicherheit empfielt es sich auch noch einmal die Pfade der Logdateien zu überprüfen, diese findet man unter „/etc/fail2ban/paths-common.conf“ und unter „/etc/fail2ban/paths-debian.conf„. Hat man keine Debian Distro, düfte die zweite Datei natürlich anders heißen 😉

Als letztes Empfehle ich noch die iptables Action zu ändern. Wird eine IP von fail2ban geblockt, dann wird standardmäßig mit einem REJECT geantwortet. Dadurch lässt man sich aber für (D)DOS Angriffe missbrauchen. Sinnvoller ist das Paket einfach zu verwerfen und keine Antwort zu senden. Dies erledigt man mit einem DROP und erfordert lediglich eine Zeile in „/etc/fail2ban/action.d/iptables-blocktype.conf“ zu ändern.

Dazu erstellen wir zuerst wieder eine .local Datei und editieren diese im Anschluss.

# sudo cp /etc/fail2ban/action.d/iptables-blocktype.conf /etc/fail2ban/action.d/iptables-blocktype.local

Aus

1
blocktype = REJECT --reject-with icmp-port-unreachable

wird

1
blocktype = DROP

Anschließend fail2ban neustarten

# sudo fail2ban-client restart

Folgender Befehl prüft ob der fail2ban Dienst läuft

# fail2ban-client ping
Server replied: pong

Kommt ein pong zurück ist alles gut, lautet die Antwort ERROR  Unable to contact server. Is it running? Dann läuft entweder der Dienst nicht oder die Abfrage wurde ohne Root Rechte ausgeführt.

Unter /var/log/fail2ban.log kann man überprüfen ob der Dienst ohne Probleme gestartet ist. Außerdem wird hier jeder fehlgeschlagene Loginversuch und jeder Ban einer IP protokolliert.

Wenn auch das Log keine Fehler anzeigt könnt ihr euch nun entspannt zurücklehnen – ihr habt es Angreifern ein gutes Stück schwerer gemacht euren Server zu kapern!

 

Im zweiten Teil zeige ich euch wie ihr Zarafa, die Open Source Exchange Alternative, gegen Eindringlinge absichern könnt und im dritten wird ein WordPress Blog abgesichert:

  1. [Tutorial] Server mit fail2ban absichern
  2. [Tutorial] Zarafa mit fail2ban absichern
  3. [Tutorial] WordPress Blog mit fail2ban absichern

 

Falls das Tutorial gefallen hat, dann freuen wir uns über einen Klick auf eines der Werbebanner oder eine kleine Spende um die laufenden Kosten für unseren Server zu decken oder neue Projekte zu finanzieren – Danke! 😀

Gruß iro

 

[Last Edit: 17.05.2014]

4 Kommentare zu „[Tutorial] Server mit fail2ban absichern

  1. Hallo,
    gute Anleitung, aber iptables-blocktype.conf gibt es in der aktuellen Version wohl nicht mehr, es wird wohl auf iptables-new.conf hingewiesen.

    blocktype = REJECT –reject-with icmp-port-unreachable
    existiert in der neuen Datei nicht und da ich mich noch nicht auskenne, wäre es nett, wenn es eine Abhilfe gibt 🙂

    Fail2Ban kann (zumindest unter Debian) mit stabilen Python 3.2 welches als .deb-Paket gibt, installiert werden, allerdings muss es anstatt python setup.py install dann python3.2 setup.py install (getestet mit ARMEL-Kernel).

    Wer zum Beispiel bei ignoreip = 127.0.0.1/8 auch noch weitere lokale IP’s zulassen möchte (wegen NAS o.ä) und zum Beispiel die IP-Bereich 192.168.10.0/24 hat, trägt diese zusätzlich noch ein, so sieht es komplett aus: ignoreip = 127.0.0.1/8 192.168.10.0/24

    Ich hoffe, dass dies richtig ist.

    • Hallo Axel,
      danke für den Hinweis. Habs mir gerade angesehen, kannst du bitte checken welche Version du nutzt? Geschrieben habe ich das Tutorial mit Fail2ban v0.9.0. Die neuste Version ist v0.9.1 und enthält laut Homepage nur Bugfixes.
      Kann es sein, dass du die Version 0.8.6 aus den Debian Paketquellen installiert hast? Falls ja, dann check dir die neuste Version von Github aus und nimm die. Dann dürfte wieder alles passen 🙂
      Gruß iro

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.