[[Vorlage(Getestet, bionic, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Paketquellen_freischalten: Eine Fremdquelle aktivieren] [:sudo: Root-Rechte erlangen] [:Terminal: Ein Terminal bedienen] [:Editor: Einen Editor verwenden] [:SSH: Secure Shell verwenden] [:Logdateien: Logdateien lesen] [:grep/#Regular-Expressions:Regular-Expressions] }}} [[Inhaltsverzeichnis(1)]] [http://www.fail2ban.org fail2ban] {en} ist ein Set aus Client, Server und Konfigurationsdateien, welches Logdateien überwacht, dort nach vordefinierten Mustern sucht und nach diesen temporär IP-Adressen sperrt. Es ist unter der [https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html GNU General Public License Version 2] {en} veröffentlicht und basiert auf [:Python:]. Ziel des Programms ist, alle [:Serverdienste:] gegen Angriffe des Typs [wikipedia:Denial_of_Service:Denial of Service] (DoS) abzusichern. Allerdings darf man nicht vergessen, dass die Grundfunktion (Sperren einzelner IP-Adressen) insbesondere bei "Distributed Denial of Service"-Angriffen (DDoS) durch Bot-Netze an ihre Grenzen stoßen kann. = Installation = Folgendes Paket kann aus den offiziellen Paketquellen installiert werden [1]: {{{#!vorlage Paketinstallation fail2ban, universe }}} Nach der Installation stehen folgende Programme zur Verfügung: * `fail2ban-server` - der Server * `fail2ban-client` - Clientprogramm zur Konfiguration und Auswertung des Servers * `fail2ban-regex` - Programm zum Testen von Regular-Expressions[7] == Fremdquelle == Über [http://neuro.debian.net/pkgs/fail2ban.html NeuroDebian] {en} kann eine Fremdquelle [2] eingerichtet werden, die aktuellere Versionen bereitstellt. [[Vorlage(Fremd, Quelle, "")]] == Ohne Installation == Als Python-Skript kann fail2ban ohne Installation oder Kompilierung ausgeführt werden. Dafür sind Root-Rechte[3] oder [#fail2ban-ohne-Root-Rechte ein speziell eingerichteter Benutzer] erforderlich, um Zugriff auf [:iptables2:iptables] oder die Routingtabelle via [:ip:] zu haben. = Konfiguration = {{{#!vorlage Hinweis fail2ban liest Konfigurationsdateitypen mit den Endungen '''.conf''' und '''.local'''. Dateien mit der Endung '''.conf''' werden bei der Installation erstellt und können bei einem Paketupgrade überschrieben werden, daher sind alle Änderungen in entsprechenden '''.local'''-Dateien vorzunehmen. In diesen müssen lediglich geänderte Werte gespeichert werden, die von den Voreinstellungen abweichen. }}} fail2ban hat drei Konfigurationsdateitypen: 1. '''/etc/fail2ban/action.d/*.conf/*.local''' 1. '''/etc/fail2ban/filter.d/*.conf/*.local''' 1. '''/etc/fail2ban/jail.d/*.conf/*.local''' Alle Konfigurationsdateien folgen dem [wikipedia:Initialisierungsdatei:Ini-Format]: * ''"Actions"'' - Kommandos zum Bannen und Entbannen von IP-Adressen * ''"Filter"'' - Suchmuster Die Datei '''jail.conf''' kombiniert `Actions` und `Filter` zu einem Jail. Auch hier gilt, dass Benutzerdateien mit der Endung '''.local''' gespeichert werden sollen. == fail2ban.local == In der Datei '''/etc/fail2ban/fail2ban.local''' werden grundlegende Dinge eingestellt. Im Normalfall reichen die Voreinstellungen aus. {{{#!vorlage tabelle <-3 rowclass="titel"> Optionen der fail2ban.local +++ Eintrag Beschreibung Standardwert +++ <-3>`[Definition]` +++ `loglevel` Mitteilungsfreude einstellen: `DEBUG`, `INFO`, `NOTICE`, `WARNING`, `ERROR`, `CRITICAL`. `loglevel = INFO` +++ `logtarget` `logtarget` kann eine selbst angegebene Datei sein oder eine der folgenden Werte: `STDOUT`, `STDERR`, `SYSLOG` `logtarget=STDERR` +++ `socket` Hier lässt sich die Socket-Datei aus '''/var/run/''' umbenennen. `socket = /var/run/fail2ban/fail2ban.sock` +++ `pidfile` Hier lässt sich die Prozess-ID-Datei aus '''/var/run/''' umbenennen. `pidfile = /var/run/fail2ban/fail2ban.pid` }}} == jail.local == In der Datei '''jail.local''' werden alle von der '''jail.conf''' abweichenden Einträge eingestellt. Man kann diese auch kopieren und als Grundlage für eine eigene '''jail.local''' nutzen. Jedoch müssen auch hier nur geänderte Werte eingetragen werden. Ein Minimalbeispiel: {{{#!code ini [sshd] enabled = true }}} Es wird lediglich der SSH-Filter aktiviert. Eine Übersicht der möglichen Werte bietet die '''jail.conf''' und die nachfolgende Tabelle. {{{#!vorlage tabelle <-3 rowclass="titel"> Übersicht der Optionen +++ Eintrag Beschreibung Beispiel +++ <-3>`[DEFAULT]` +++ `ignoreip` Durch Leerzeichen separierte Liste von zu ignorierenden (im Sinne von: __nicht__ zu bannenden) IPs oder Netzwerken. `ignoreip = 127.0.0.1/8 192.168.1.33` +++ `bantime` Bannzeit in Sekunden. Ein negativer Wert ist ein permanenter Bann. `bantime = 86400` +++ `findtime` Die Anzahl der Sekunden nach dem der Zähler für ''maxretry'' zurückgesetzt wird. `findtime = 660` +++ `maxretry` Die maximale Anzahl an Fehlversuchen, bevor fail2ban die IP bannt. `maxretry = 2` +++ `backend` Hier kann das backend, wie z.B. [:systemd:] eingestellt werden. Voreinstellung ist `auto` (empfohlen). `backend = systemd` +++ `usedns` Einstellung für das reverse-Lookup-Verhalten von fail2ban. Mögliche Werte sind `yes`, `no` und `warn`.[[BR]]Letzteres bewirkt, dass Einträge mit Hostnamen eine Warnung ins Logfile geben, was u.U. zu sehr vielen Einträgen führt. `usedns = warn` +++ `[myJail]` Hier kann der Name des jail vergeben werden. `[ssh]` +++ `enabled` (De-)Aktiviert das jail `enabled = true` +++ `port` Portdefinition, kann numerisch sein. Mehrere Werte werden durch Kommata getrennt. `port = ssh` +++ `filter = sshd` Name der Filterdatei `/etc/fail2ban/filter.d/sshd.conf` +++ `logpath` Die zu überwachende Logdatei, die auf den Filter geprüft wird. `logpath = /var/log/auth.log` +++ `maxretry, bantime,...` Abweichende Werte für die Default-Optionen können ebenfalls definiert werden. `maxretry = 3` }}} == Action.local == Die Dateien im Verzeichnis '''/etc/fail2ban/action.d/''' enthalten die Befehle zum (Ent-)Sperren von IP-Adressen. Action-Dateien enthalten zwei Sektionen: `[Definition]` und `[Init]`. Die Einträge in der `[Init]`-Sektion dienen zum Überschreiben der im Jail definierten Regeln. Die Beispiele der folgenden Tabelle sind der Aktion '''iptables-multiport-conf''' entnommen. Alle Befehle werden mit den Benutzerrechten von fail2ban ausgeführt. {{{#!vorlage tabelle <-3 rowclass="titel"> Übersicht der Optionen +++ Eintrag Beschreibung Beispiel +++ <-3>`[Definition]` +++ `actionstart` Befehle, die beim Starten von fail2ban ausgeführt werden. `actionstart = iptables -N fail2ban-`[[BR]]`iptables -A fail2ban- -j RETURN`[[BR]]`iptables -I -p -m multiport --dports -j fail2ban-` +++ `actionstop` Befehle, die beim Beenden von fail2ban ausgeführt werden. `actionstop = iptables -D -p -m multiport --dports -j fail2ban-`[[BR]]`iptables -F fail2ban-[[BR]]iptables -X fail2ban-` +++ `actioncheck` Befehle, die vor jedem actionban ausgeführt werden. Diese dienen dazu die aktuelle Umgebung auf Funktionalität zu überprüfen. `actioncheck = iptables -n -L | grep -q 'fail2ban-[ \t]'` +++ `actionban` Befehle, die beim Bannen einer IP ausgeführt werden. Die Bedingung lautet immer ''maxretry'' muss überschritten und ''findtime'' unterschritten sein. `actionban = iptables -I fail2ban- 1 -s -j ` +++ `actionunban` Befehle, die zum Entbannen benutzt werden sollen. `actionunban = iptables -D fail2ban- -s -j ` +++ <-3>`[Init]` +++ `name` Standardname der Kette `name = default` +++ `port` Port `port = ssh` +++ `protocol` Wird intern vom config reader genutzt. Mögliche Werte: `tcp`, `udp`, `icmp`, `all`. `protocol = tcp` +++ `chain` Die iptables-Kette zu der die fail2ban-Regeln hinzugefügt werden sollen. Standard ist `INPUT`. chain = INPUT +++ Action Tags <-2>Action Tags sind Platzhalter, welche in `actionban`, `actionunban` und `actioncheck` verwendet werden können. +++ `ip` <-2>Die zu bannende IPv4-Adresse. +++ `failures` <-2>Die Anzahl der gezählten Fehlversuche. +++ `time` <-2>Der Unix-Zeitstempel (Sekunden) des Banns. +++ `matches` <-2>Die verketteten Einträge aus den Zeilen des Logfiles, die zum Bann führen. Viele Shell-Zeichen werden escaped dargestellt. }}} == Filter.local == Die Dateien im Verzeichnis '''/etc/fail2ban/filter.d/''' enthalten die regulären Ausdrücke[6] zur Analyse der Logdateien und zum Extrahieren der IP-Adresse, bzw. bei Verwendung von '''usedns''' den Hostnamen. Es gibt in diesen Dateien nur zwei Sektionen: `[Definition]` und `[Includes]`. Letztere kann benutzt werden, um andere Konfigurationsdateien einzulesen. Die Beispiele der folgenden Tabelle sind der Aktion '''iptables-multiport-conf''' entnommen. Alle Befehle werden mit den Benutzerrechten von fail2ban ausgeführt. {{{#!vorlage tabelle <-3 rowclass="titel"> Übersicht der Optionen +++ Eintrag Beschreibung Beispiel +++ <-3>`[Definition]` +++ `failregex` Mit Hilfe dieses regulären Ausdrucks[6] werden die Logdateien nach Treffern durchsucht. Hier ist der Tag `HOST` verfügbar, welche als Teil der regex benutzt wird und den Hostnamen, bzw. die IP-Adresse enthält. Die Unterscheidung zwischen IP-Adresse und Hostname wird von fail2ban automatisch ermittelt. `failregex = ^%(__prefix_line)sFAIL: \S+ address from=$`[[BR]]`^%(__prefix_line)sFAIL: \S+ libwrap from=$` +++ `ignoreregex` Hier können Ausnahmen definiert werden, selbst wenn sie für die obige failregex gültig wäre. ignoreregex unterstützt [wikipedia_en:String_interpolation:], so dass man eigene Variablen mittels `%(variablenname)s` verwenden kann. `ignoreregex =` +++ <-3>`[INCLUDES]` +++ `before` Die Datei wird vor der Sektion `[Definition]` gelesen. Beispiel ist die '''common.conf''' `before = common.conf` +++ `after` Die Datei wird nach der Sektion `[Definition]` gelesen. `after = example_after.local` +++ Beispiel Nach Einbindung der '''common.conf''' steht `_daemon` zur Verfügung. Siehe '''/etc/fail2ban/filter.d/common.conf''' für mehr Details. `_daemon = xinetd` }}} == Bannen mit ip route == Grundlegend kann fail2ban auf zwei Arten bannen: Mittels Paketfilterung über [:iptables2:iptables] (Standard) oder per Eintrag in der Routingtabelle mit [:ip:]. Der Vorteil von ip ist, dass keine Konflikte mit eigenen iptables-Regeln auftreten. Die Umstellung erfolgt über die Datei '''/etc/fail2ban/action.d/route.conf''', welche man ggf. mit einem Editor[4] und Root-Rechten erstellen muss. Dort definiert man das Bannverhalten: {{{#!code ini [Definition] actionban = ip route add unreachable actionunban = ip route del unreachable }}} `IP` dient dabei ein Platzhalter. Dieser darf also nicht verändert werden. In der Datei '''/etc/fail2ban/jail.local''' muss die Aktion nun über den Eintrag: {{{banaction = route}}} bekannt gemacht werden. Zum Übernehmen der Änderungen ist ein [#fail2ban-neustarten Neustart von fail2ban] erforderlich. == Entbannen == Das Entbannen funktioniert über das Programm fail2ban-client: {{{#!vorlage Befehl fail2ban-client set unbanip #Beispiel fail2ban-client set sshd unbanip 192.168.16.33 }}} = Weitere Informationen = == Status der Jails == * Mittels {{{#!vorlage Befehl fail2ban-client status }}} wird unter anderem angezeigt, wie viele Adressen aktuell blockiert werden, zB: {{{ Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 2 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 192.168.0.2 }}} == Neustart == * Mittels [:systemd:]: {{{#!vorlage Befehl sudo systemctl restart fail2ban}}} == Status== * Mittels [:systemd:]: {{{#!vorlage Befehl sudo systemctl status fail2ban}}} == fail2ban ohne Root-Rechte == Die Nutzung von fail2ban ohne Root-Rechte[3] ist möglich, wenn man einen eigenen Benutzer für fail2ban anlegt und diesem mittels [:sudo/Konfiguration:visudo] die nötigen Rechte für die verwendeten Befehle - welche dann auf die Benutzung von `sudo` umgestellt werden müssen - und natürlich den Zugriff auf die Logdateien gewährt. = Eigene Definitionen = Als Beispiel dient hier ein Jail für den klassischen [wikipedia:HTTP-Statuscode:] `404`. * '''jail.local''': {{{#!code ini [apache_404] # Name des Jails enabled = true port = http,https # Standardports filter = apache_404 # Name der Filterdatei logpath = /var/log/apache*/*access.log # zu überwachende Logdateien maxretry = 3 # Wieviele Fehlaufrufe sind erlaubt? }}} * '''apache_404.local''': {{{#!code ini # Fail2Ban configuration file # Author: ChickenLipsRfun2eat # Website: wiki.ubuntuusers.de # License: https://ubuntuusers.de/lizenz/#CC-BY-NC-SA-2-0-DE # $Revision: 0.0.1 $ [Definition] failregex = - - \[.*\] "GET /.* HTTP/1\.[01]" 404 [0-9]+.*$ # Option: ignoreregex # Notes.: regex to ignore standard search for favicon.ico and robots.txt ignoreregex = .*(robots.txt|favicon.ico) }}} = Problembehebung = == Bekannte Probleme == Bekannte Probleme, Erklärungen und Lösungen findet man in der [http://www.fail2ban.org/wiki/index.php/FAQ_english FAQ] {en} == vsftpd absichern == [:vsftpd:] mit PAM-Authenifizierung übermittelt Hostnamen in die '''/var/log/secure''', welche auch standardmäßig von fail2ban überwacht wird. Durch Probleme bei der Namensauflösung kann es dazu kommen, dass der Filter fehlschlägt. Die Lösung ist, vsftpd mittels des Eintrages {{{dual_log_enable=YES}}} auf zwei Logdateien umzustellen und fail2ban anzuweisen, statt der vordefinierten '''/var/log/secure''' die '''/var/log/vsftpd.log''' zu überwachen. = Links = == Intern == * [:iptables2:iptables] * [:Apache/Sicherheit:] - Module zu Härtung des Webservers gegen Angriffe von außen * [:Serverdienste:] {Übersicht} Übersichtsartikel == Extern == * [http://www.fail2ban.org Projektseite] {en} * [http://www.fail2ban.org/wiki/index.php/Manual Dokumentation] {en} * [github:fail2ban/fail2ban:Quellcode] {en} * [wikipedia:Fail2ban:] #tag: Serverdienste, Netzwerk, Internet, System, Sicherheit