Fail2ban – Sicherheit für Linux-Server
Türsteher für Server
Kategorisch unsicher?
Fail2ban – Sicherheit für Linux-Server
Obgleich Dienste wie beispielsweise Secure Shell (SSH) oder Secure FTP (SFTP) auf modernsten Verschlüsselungsalgorithmen wie dem Advanced Encryption Standard (AES) beruhen, sind diese immer nur so stark wie das schwächste Glied in der Kette. Und das ist im Regelfall ein vom Administrator festgelegtes Kennwort.
Was nützt der stärkste Krypto-Algorithmus, wenn das Kennwort kategorisch unsicher ist und “abc123” lautet? Angriffe gegen sichere Protokolle auf Kennwort-Niveau gibt es genug – wie etwa das Sicherheitswerkzeug “Hydra“, mit dessen Hilfe sich im Clusterverbund die Stärke des Kennworts eines Dienstes prüfen lässt. Dass Hydra nicht nur aus Gründen der Sicherheit eingesetzt wird, zeigt der Blick auf die aktuelle Log-Datei eines Internet Servers:
—Listing—
Jan 15 15:28:46 homebrou sshd[29778]: Invalid user recruit from 81.74.87.66
Jan 15 15:28:46 homebrou sshd[29778]: error: Could not get shadow information for NOUSER
Jan 15 15:28:46 homebrou sshd[29778]: Failed password for invalid user recruit from 81.74.87.66 port 47672 ssh2
Jan 15 18:33:27 homebrou sshd[2156]: Did not receive identification string from 88.191.23.27
Jan 15 19:23:37 homebrou sshd[3418]: Invalid user test from 88.191.23.27
Jan 15 19:23:37 homebrou sshd[3418]: error: Could not get shadow information for NOUSER
Jan 15 19:23:37 homebrou sshd[3418]: Failed password for invalid user test from 88.191.23.27 port 41017 ssh2
Jan 15 19:23:38 homebrou sshd[3420]: Invalid user test from 88.191.23.27
Jan 15 19:23:38 homebrou sshd[3420]: error: Could not get shadow information for NOUSER
Jan 15 19:23:38 homebrou sshd[3420]: Failed password for invalid user test from 88.191.23.27 port 41096 ssh2
Jan 15 19:23:38 homebrou sshd[3422]: Invalid user test from 88.191.23.27
—Ende Listing—
Die Methode der Angreifer trägt eine Reihe von Namen: Unter dem Schlüsselbegriff “Brute Force Attack” formieren sich Verfahren wie beispielsweise die “Dictionary Attack”, die mit Hilfe (gewaltiger) Wörterbücher versucht, hinter das Kennwort eines Dienstes zu kommen. Ein bisschen weniger Aussicht auf Erfolg haben die genauso ausdauernden Angriffe, bei denen der Angreifer Sequenzen von Buchstaben, Zahlen und Sonderzeiten aneinanderreiht – in der Hoffung das korrekte Kennwort zu entdecken. Je mehr Systeme sich an dem Einbruchsversuch beteiligen, desto wahrscheinlicher wird die Chance auf einen Erfolg.
Aktuelle Bot-Netzwerke erreichen mit Größenordnungen von über 100.000 aktiven Systemen langsam ein bedrohliches Niveau – zumindest wenn es um Dictionary Attacks geht.
Auf den ersten Blick scheint die Abwehr solcher Attacken einfach: Über die klassische Linux-Firewall, basierend auf IP-Tables, ließen sich der oder die Angreifer sperren. Aber wie wird der Angreifer erkannt? Wie unterscheidet man zwischen Freund (der sich beim Kennwort nur vertippt hat) und Feind? Eine Lösung auf diese Fragen bietet das Utility “Fail2Ban“. Mit Hilfe dieses Tools lassen sich die Log-Dateien des Systems nach bestimmten Kriterien durchforsten, um gegebenenfalls einen Angreifer per IP-Sperre in seine Schranken zu verweisen.
Funktionsweise von Fail2Ban
Fail2ban – Sicherheit für Linux-Server
Bei Fail2Ban handelt es sich um eine freie Software, die unter der GNU Public License (Version 2) entwickelt wurde. Als Programmiersprache kommt Python (Version 2.4 oder höher) zum Einsatz, was zur Plattformunabhängigkeit beiträgt: Fail2Ban lässt sich auf alle aktuellen Linux-/BSD- und Unix-Derivaten einsetzen. Fail2Ban besteht aus zwei Komponenten: Einem Server namens “fail2ban-server” und einem Client “fail2ban-client”, über den der Administrator das System verwaltet.
Der Server analysiert die in der Konfiguration von Fail2Ban vorgegebenen Log-Dateien nach Auftreten bestimmter Einträge, wie beispielsweise nicht autorisierte Anmeldeversuche. Anhand von so genannten Aktionen führt Fail2Ban eine Reaktion aus, wenn bestimmte Konditionen eintreten. Beispielsweise bei fünf in Reihe fehlgeschlagenen Login-Versuchen, die von einer bestimmten IP-Adresse ausgehen.
Eine solche Aktion kann vielseitig definiert sein: Sie kann eine E-Mail-Benachrichtigung an einen Administrator verfassen oder einen Sperreintrag für diese IP-Adresse per IPTables oder ShoreWall (freie Firewall Lösung) ausführen. Nach einer vorgegebenen Zeit wird die Sperre (“Ban”) wieder aufgehoben (“Unban”). Über den aktuellen Status der Sperrungen informiert eine Log-Datei.
Voraussetzungen für Fail2Ban
Fail2ban – Sicherheit für Linux-Server
Grundsätzlich funktioniert Fail2Ban auf jeder aktuellen Linux Distribution. Systemvoraussetzungen für die aktuelle (stable) Version 0.8.1 sind
-Python (Version 2.4 oder höher)
-IPTables (bei Sperrung durch IPTables)
-ShoreWall (nur notwendig, wenn Sie ShoreWall als Firewall einsetzen)
-TCP Wrappers (nur notwendig, wenn Sie TCP Wrapper zur Reglementierung von TCP-Verbindungen einsetzen)
Im Folgenden erfahren Sie, wie Sie dieses Sicherheitssystem Fail2Ban unter CentOS Version 5 mit IPTables installieren und konfigurieren.
Fail2Ban Installation
Fail2ban – Sicherheit für Linux-Server
Für die Installation von Fail2Ban benötigen Sie die aktuelle Version 0.8.1, die Sie im Internet unter folgenden Link zum Download finden:
http://sourceforge.net/project/showfiles.php?group_id=121032
Entpacken Sie den Quellkode mit dem Befehl
bzip2 -dc fail2ban-0.8.1.tar.bz | tar xvf –
Anschließend wechseln Sie ins neu erzeugte Verzeichnis
fail2ban-0.8.1
Die Installation starten Sie mit dem Befehl
./setup.py install
Fail2Ban legt dabei folgende Verzeichnisse an:
/usr/share/fail2ban
(hier wird der Python Code für Client, Server und sonstige Routinen abgelegt) und
/etc/fail2ban
(hier liegen die Konfigurationdateien von Fail2Ban – mehr dazu später)
Zudem werden im Verzeichnis
/usr/bin
die ausführbaren Dateien
fail2ban-client
fail2ban-server
fail2ban-regex
abgelegt. Damit ist die grundlegende Installation von Fail2Ban bereits abgeschlossen.
Die Linux Distributionen Debian GNU/Linux und Gentoo enthalten Fail2Ban in ihren regulären Repository-Servern. Für die Installation gehen Sie wie folgt vor:
apt-get install fail2ban (Debian GNU/Linux)
emerge fail2ban (Gentoo)
Fail2Ban Konfiguration
Fail2ban – Sicherheit für Linux-Server
Für die Konfiguration von Fail2Ban existieren zwei Dateien:
/etc/fail2ban/fail2ban.conf
enthält generelle Einstellungen wie beispielsweise den Log-Level von Fail2Ban sowie Angaben zur Log-Datei, in die das Programm schreibt. Dieser ist in der Grundkonfiguration mit
/var/log/fail2ban.log
angegeben. Hinweis: Nachdem Sie die Konfiguration von Fail2Ban abgeschlossen haben, empfiehlt es sich, den Log-Level von 3 auf 2 zu setzen. In diesem Fall schreibt Fail2Ban Ihnen nur noch bei Warnungen und Fehlern eine E-Mail.
Die eigentliche Konfiguration findet in der Datei
/etc/fail2ban/jail.conf
statt. Hier finden Sie eine große Zahl von Beispielseinträgen, die allerdings alle deaktiviert sind. Aus gutem Grund: Im Regelfall sind Anpassungen an Ihr Betriebssystem notwendig. Ein Beispiel: Sie wollen den Dienst SSH durch eine IPTable-basierte Sperre schütze
n. Dazu erstellen Sie folgenden Eintrag in jail.conf:
—Listing—
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=admin@meinefirma.de, sender=fail2ban@meinefirma.de]
logpath = /var/log/secure
maxretry = 3
—Ende Listing—
Die Bezeichnung [ssh-iptables] können Sie grundsätzlich frei wählen, allerdings empfiehlt sich die Kombination des Namens aus geschütztem Protokoll und Schutzaktion. Bei einem Webserver würde diese beispielsweise lauten: [http-iptables]. Um den Schutz zu aktivieren, muss die Option “enabled = true” sein. Im nächsten Schritt geben Sie den Filter, der auf die in der Option “logpath” beschriebene Datei angewandt wird. In unserem Beispiel (CentOS 5) handelt es sich um die Datei
/var/log/secure
in die Sicherheitsmeldungen wie beispielsweise fehlgeschlagene SSH-Login-Versuche eingetragen werden. Die Option “maxretry” gibt an, wie viele fehlgeschlagene Versuche Fail2Ban als Verstoß sieht, um die in der Aktion “action” vorgeschriebene Sperrung zu verhängen. In unserem Beispiel wird eine Sperrung per IPTables durchgeführt und parallel eine E-Mail-Nachricht an den zuständigen Administrator verschickt.
Hinweis: In stark frequentieren Systemen empfiehlt es sich, die E-Mail-Benachrichtigung abzustellen, um massenhaften Spam zu vermeiden.
Fail2Ban starten
Fail2ban – Sicherheit für Linux-Server
Nachdem Sie die Änderungen an der Konfigurationsdatei “jail.conf” durchgeführt haben, können Sie Fail2Ban starten. Dies geschieht über den Befehl
fail2ban-client start
Korrekt eingerichtet schickt das System eine E-Mail-Nachricht an den Administrator, die anzeigt, dass das gewünschte Jail – in unserem Falle SSH – gestartet wurde. Zudem hat Fail2Ban eine Reihe von IPTable Instruktionen durchgeführt, wie der Blick mit dem Befehl
iptables -L
beweist. Interessant ist hier die Sektion
—Listing—
Chain fail2ban-SSH (1 references)
target prot opt source destination
RETURN all — anywhere anywhere
—Ende Listing—
die anzeigt, dass keine Sperreinträge vorliegen. Unternehmen Sie die Probe aufs Exempel und simulieren Sie drei fehlerhafte Login-Versuche gegen die durch Fail2Ban geschützte Secure Shell. Ein Blick auf die Fail2Ban Log-Datei zeigt den Erfolg der Abwehr:
2007-08-22 21:50:57,073 fail2ban.actions: WARNING [ssh-iptables] Ban 172.16.13.86
Werfen Sie erneut einen Blick auf IPTables. In der Chain fail2ban-SSH findet sich jetzt ein entsprechender Eintrag:
—Listing—
Chain fail2ban-SSH (1 references)
target prot opt source destination
DROP all — 172.16.13.86 anywhere
RETURN all — anywhere anywhere
—Ende Listing—
Damit ist die IP-Adresse 172.16.13.86 für einen Zeitraum von 10 Minuten gesperrt. Die Länge der Sperrdauer können Sie in der Konfigurationsdatei
/etc/fail2ban/jail.conf
bearbeiten. Passen Sie einfach die Option “bantime” entsprechend an. Die Angabe erfolgt in Sekunden. Parallel zur Sperrung hat Fail2Ban Ihrem Administrator eine E-Mail-Nachricht über den Sperrerfolg und die Anzahl der Angriffsversuche der betroffenen IP-Adresse zugesandt. Nach 10 Minuten kontrollieren Sie den Eintrag in IPTables erneut; es findet sich keine aktive Sperrung mehr:
—Listing—
Chain fail2ban-SSH (1 references)
target prot opt source destination
RETURN all — anywhere anywhere
—Ende Listing—
Fail2Ban-Filter anpassen
Fail2ban – Sicherheit für Linux-Server
Für die Anpassung von Fail2Ban Filtern benötigen Sie grundlegendes Wissen über “reguläre Ausdrücke” (regular expressions). In der Datei
/etc/fail2ban/filter.d/sshd.conf
finden Sie den Filter
—Listing—
failregex = (?:error: PAM: )?Authentication failure for .* from
Failed [-/\w]+ for .* from
ROOT LOGIN REFUSED.* FROM
[iI](?:llegal|nvalid) user .* from
User .+ from
User .+ from
Vergleichen Sie diesen Filter mit den in
/var/log/secure
gemeldeten Nachrichten, die einen Angriff auf die Secure Shell symbolisieren
—Listing—
Aug 22 21:50:34 localhost sshd[2822]: Failed password for root from 172.16.13.86
port 1177 ssh2
Aug 22 21:50:49 localhost last message repeated 2 times
Aug 22 21:50:50 localhost sshd[2823]: Received disconnect from 172.16.13.86: 13:
Authentication cancelled by user.
—Ende Listing—
In diesem Fall trifft die zweite Zeile des Filters
—Listing—
Failed [-/\w]+ for .* from
zu. Über den Parameter
Fazit
Fail2ban – Sicherheit für Linux-Server
Fail2Ban ist ein solides Abwehrsystem gegen unerwünschte Verbindungen. Grundsätzlich lassen sich alle Log-Dateien als Grundlage für die Sperrung durch Fail2Ban nutzen.
In klassischen Server Umgebungen, in denen der Secure-Shell-Dienst durch BruteForce-Angriffe unter Beschuss liegt, ist Fail2Ban eine hervorragende Lösung. Bei extrem hoher Angriffsdichte, wie diese beispielsweise bei “E-Mail Dictionary Harvesting Attacks” auftritt, ist eine externe Lösung aber in jeden Fall vorzuziehen, da Fail2Beinem ohnehin überlasteten System nur noch weitere Ressourcen abverlangt.
Alternativen sind hier auf Hardware beruhende Produkte wie die Produktfamilie “Deflector Mark I” die transparent den Datenverkehr im Netzwerk nach Angriffsmustern untersucht und diesen bei Bedarf unterbindet.