Fail2Ban
Inhalt
Inhaltsverzeichnis
- Fail2Ban
- Warnung neue Version Juli 2017
- Vorwort
- Installationshinweise
- Grundinstallation
- Tests
- Reaktionszeit
- Filters und Jail.conf
- Tipps & Tricks
Warnung neue Version Juli 2017
jail.conf fast man eigentlich nicht mehr an.
Sondern: jail.d/jail.local oder was jail.d/jail-debian was
und da ist per default nur sshd enabled!!
Vorwort
Fail2Ban ist ein kleines Programm, das Logfiles verschiedenster Programme überwacht und basierend auf Einträgen in den Logfiles Ereignisse auslöst. Es kann sowohl im Hintergrund (als Dämon) als auch im Vordergrund laufen. Nützlich ist das Programm beispielsweise zusammen mit einem ssh-Server, um die Anzahl der Einloggversuche zu begrenzen. Genau darum geht es primär in diesen Artikel. Damit sind die Möglichkeiten des Programms jedoch bei weitem nicht erschöpft.
Homepage: http://fail2ban.sourceforge.net/ - siehe auch Debian-Paketbeschreibung
Lizenz: GPL
Gerade auf Mehrbenutzersystemen ist es oft nicht möglich den ssh-Port zu verändern. Viele Benutzer müssen einfach auf den Rechner zugreifen können. Leider können dann auch Angreifer relativ leicht in das System einbrechen, indem sie einfach solange Kombinationen aus Benutzername/Passwort ausprobieren, bis sie ein passendes Paar gefunden haben.
Das Programm fail2ban verhindert genau dieses "ausprobieren". Es untersucht die Logfiles des Systems nach fehlgeschlagenen Loginversuchen und sperrt dann die Internetadresse (IP) des Angreifers für eine gewisse Zeit.
Es gibt jedoch meiner Meinung nach einen Schwachpunkt: Ein guter Angreifer könnte die IP des Systemadministrators herausfinden und mit irgend einem Benutzernamen diese IP blockieren. Und schon kann sich root nicht mehr einloggen. Also wenn Ihr eine feste IP habt, dann setzt sie auch auf die Ausnahmeliste! (whitelist in /etc/fail2ban.conf)
Bei korrekter Installation und Konfiguration verhält sich fail2ban ressourcenschonend.
Installationshinweise
Ist neu natrülich enthalten in den Repos.
Alt: Getestet wurde das Programm von mir unter Suse 10/10.1, Debian Sarge/Etch und Gentoo. Es läuft sehr sauber und ist leicht zu konfigurieren.
Für Debian3.1 (Sarge) gilt: Das Paket ist nicht in Sarge enthalten, kann aber sauber aus Etch installiert werden, da es keine großen Abhängigkeiten besitzt. Bitte die Pakete python-central und fail2ban installieren, der Rest der Abhängigkeiten wird aufgelöst. das Programm debhelper darf jedoch nicht installiert sein, sonst kommt es zu Fehlern. Wem diese Vorgehensweise zu unsauber ist dem empfehle ich die Installation aus den Sourcen.
Grundinstallation
apt-get install fail2ban
Edit /etc/fail2ban/jail.conf
ignoreip = 127.0.0.1/8 #Wenn man einem Client Zugang lassen will immer. #Nie ein Ban setzen. z.b 11er Client. #ignoreip = 127.0.0.1/8 192.168.0.11 ignoreip = 127.0.0.1/8 #bantime one week #bantime = 604800 #bantime one day #bantime = 86400 #bantime 10min bantime = 600 #30sek for test bantime #bantime = 30
Folgende sollte man immer aktivieren:
Diese auf true stellen: ssh dropbear pam-generic ssh-dos apache alle
Dazu ermitteln wir die Login Versuche aus der log /var/log/apache2/error.log oder entsprechende Log's.
tail -f /var/log/apache2/error.log (realtime zuschauen)
Aktivieren: service fail2ban restart
Schauen wer gesperrt ist mit: iptables -L (zu unterst kommen die Einträge)
Unbedingt apache-noscript anlesen, Files does not exist!!
Tests
Man trägt sich ja selber mal in die ignore-ip liste vom jail.conf, damit man sich nicht selber aussperrt. Aber für Tests ist zu empfehlen einen externen Proxy zu verwenden im Browser, oder andern Anwendungen.
Reaktionszeit
Zitat aus dem Manual: First of all, remember that Fail2ban is a log parser. It cannot do anything before something is written in the log files. Lots of syslog daemons buffer their outputs. This can impact performance of Fail2ban. Thus, it could be good to disable buffering of your syslog daemon.
Das Beschreibt, dass die Log von syslog nicht gleich beschrieben wird. So kann es sein, dass man 8 Password Fehler begehen kann bei einem SSH Login, obwohl 3 als maxretry definiert sind. Ich würde aber den Buffer von syslog nicht unbedingt ausschalten. Hauptsache es greift dann doch ein. Bei Postfix habe ich in 3sek auch schon 52 Connect, die kann ich auch schlecht auswerten. Die 52 Disconnetct from unknow lass ich mir dann dafür aber auf der Zunge zergehen. Wie gesagt, Hauptsache es greift dann mal. Und dann kann man auch mal eine Woche oder gar Monat als bantime in Sekunden setzen für so Typen!
Filters und Jail.conf
PHPmyAdmin
Standard mit .htaccess (zu empfehlen)
Dafür muss man nur das vorgegebene apache auf true stellen im jail.conf, weil wir .htaccess benützen. einfügen /usr/share/phpmyadmin/.htaccess
Inhalt:
AuthType Basic AuthName "Zugangsdaten bitte" AuthUserFile /var/www/htpasswdfile #Ein spezieller Benutzer nur aus htpasswdfile #Require user testuser #Ein dem System bekannten Benutzer aus htpasswdfile Require valid-user #Option -INDEXES
Anpassen von apache phpmyadmin, damit .htaccess aktiv wird.
/etc/phpmyadmin/apache.conf
Alias /phpmyadmin /usr/share/phpmyadmin <Directory /usr/share/phpmyadmin> Options FollowSymLinks DirectoryIndex index.php AllowOverride All #neu eingefügt !!!!!!!! <IfModule mod_php5.c> <IfModule mod_mime.c> AuthName "Passwortgeschuetzter Bereich" AuthUserFile /var/www/htpasswdfile
htpasswdfile erstellen
Erster User, File erstellen mit -c htpasswd -c /var/www/htpasswdfile testuser
Weitere user mit htpasswd /var/www/htpasswdfile testuser
oder: htpasswd -b /var/www/htpasswdfile testuser 3te_user 1234
Alles aktivieren: service apache2 restart
über das LOG System phpmyadmin
Einlog Versuche auf phpmyadmin ist auch übel. Man kann es über die log machen, dann müsste es aber als VirtualHost resp. Subdomain, und kein mod_fcgi Modul in Apache sein. Dazu das hier: using-fail2ban-to-protect-phpmyadmin
über Verstecken ( apache-nohome )
(Diese Anleitung wurde in Debian Wheezy erstellt)
apache-noscript ersetzt diese Filterregel weiter unten. Aber mal selber ein Filter zu bauen ist eine gute Übung.
Wir können es aber auch mit einem andern Weg in den Griff kriegen, wie in debian-webmail beschrieben passen wir /etc/apache2/conf.d/phpmyadmin.conf so an, dass es mit einem Phantasiename, den nicht gleich jeder herausfinden kann, abgelegt ist.
Dann erstellen wir uns einen eigenen Filter für Seiten die nicht vorhanden sind auf dem www Server (apache). Wir erstellen /etc/fail2ban/filter.d/apache-nohome.conf
# Fail2Ban configuration file # # Author: # # $Revision: # [Definition] # Option: failregex # Notes.: regex to match failures to find a home directory on a server, which # became popular last days. Most often attacker just uses IP instead of # domain name -- so expect to see them in generic error.log if you have # per-domain log files. # Values: TEXT # # Das tat nicht, darum die zweite Linie # failregex = [[]client <HOST>[]] File does not exist: .*/~.* failregex = [[]client (?P<host>\S*)[]] File does not exist: # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
Speichern des Filters, dann können wir unser failregex testen.
root@linux:#fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-nohome.conf Running tests ============= Use regex file : /etc/fail2ban/filter.d/apache-nohome.conf Use log file : /var/log/apache2/error.log Results ======= Failregex |- Regular expressions: | [1] [[]client (?P<host>\S*)[]] File does not exist: | `- Number of matches: [1] 96 match(es) Ignoreregex |- Regular expressions: | `- Number of matches: Summary ======= Addresses found: [1] 66.249.78.92 (Sun Mar 16 07:04:31 2014) 93.120.192.89 (Sun Mar 16 07:43:38 2014) 93.120.192.89 (Sun Mar 16 07:43:38 2014) . .
Jetzt können wir es in /etc/fail2ban/jail.conf einfügen als Filter.
[apache-nohome] enabled = true port = http filter = apache-nohome logpath = /var/log/apache*/*error.log #Ein Woche bantime bantime = 604800 maxretry = 3
Aktivieren: /etc/init.d/fail2ban restart
Squirrelmail
(Diese Anleitung wurde in Debian Wheezy erstellt)
Das squirrel_logger plugin muss installiert sein, wie beschrieben in debian-webmail
Die Log muss angepasst werden, damit später der filterregex greift. Also editieren wir /usr/share/squirrelmail/plugins/squirrel_logger/config.php und ändern diese Zeile damit sie so ausehen wie hier (Ausschnitt):
// The location of your log file when logging to file. // Make sure the user your webserver runs as can write // to this file. Use the $data_dir variable if you // want to place the log file in the SquirrelMail data // directory. // // Only applicable when $sl_logs includes "file". // //$sl_logfile = $data_dir . 'squirrelmail_access_log'; $sl_logfile = '/var/log/squirrelmail.log'; // Specify what date format you want // // See the PHP manual for the date function for help // at http://www.php.net/manual/function.date.php // // examples: // // 'm/d/y H:i:s' == 03/10/2001 05:16:08 // 'F j, Y, g:i a' == March 10, 2001, 5:16 am // 'D M j Y H:i:s T' == Sat Mar 10 2001 15:16:08 CDT // //$sl_dateformat = 'm/d/Y H:i:s'; $sl_dateformat = 'M j H:i:s'; // Log dates in GMT? If you do not do this, dates will // be logged in whatever timezone each user is in (or // has set in their personal preferences) // // 1 = yes // 0 = no // $sl_use_GMT = 0;
falls keine logdatei vorhanden ist, erstellen wir schnell eine:
root@linux:# touch /var/log/squirrelmail.log chown www-data.www-data /var/log/squirrelmail.log chmod 640 /var/log/squirrelmail.log
So wenn ich mich richtig erinnere geht es ohne restarten von apache, einfach mal mit falschen passwörter loginfehler produzieren. Wichtiges Augenmerk ist, dass sich /var/log/squirrelmail.log beginnt zu füllen. Zweites Augenmerk ist auf die Zeitstempel zu achten. Passen sie zur System zeit mit (date Enter) übereinander? Sonst muss GMT = 1 oder anderst angepasst werden. Weil findtime = 600 ist standard eingestellt; nur 10minuten nicht stunden werden die Logfiles überschaut und ausgewertet.
Wenn das alles stimmt, dann geht es an das Filer: /etc/fail2ban/filter.d/squirrelmail.conf
# Fail2Ban configuration file # # Author: Bill Landry ((email_protected)) # # $Revision: 510 $ [Definition] # Option: failregex # Notes.: regex to match the password failures messages in the logfile. The # host must be matched by a group named "host". The tag "" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P\S+) # Values: TEXT # #Das erste ging nicht, darum die zweite Zeile, kommt auf die Sprache der Log an #failregex = \[LOGIN_ERROR\].*from <HOST>: Unknown user or password incorrect failregex = \[INVALID\].*from <HOST>: Ung.*ltiger Benutzername oder Passwort nicht korrekt #failregex = \[INVALID\].*from <HOST>: Ung # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT ignoreregex =
Speichern des Filters, dann können wir unser failregex testen.
root@linux:#fail2ban-regex /var/log/squirrelmail.log /etc/fail2ban/filter.d/squirrelmail.conf Running tests ============= Use regex file : /etc/fail2ban/filter.d/squirrelmail.conf Use log file : /var/log/squirrelmail.log Results ======= Failregex |- Regular expressions: | [1] \[INVALID\].*from <HOST>: Ung.*ltiger Benutzername oder Passwort nicht korrekt | `- Number of matches: [1] 28 match(es) Ignoreregex |- Regular expressions: | `- Number of matches: Summary ======= Addresses found: [1] 212.90.215.53 (Thu Mar 06 20:35:44 2014) 212.90.215.53 (Thu Mar 06 20:37:00 2014) 212.90.215.53 (Thu Mar 06 20:37:20 2014) . .
Jetzt können wir es in /etc/fail2ban/jail.conf einfügen als Filter.
[squirrelmail] enabled = true port = http,https filter = squirrelmail logpath = /var/log/squirrelmail.log #bantime 4 Stunden bantime = 14400 maxretry = 6
Aktivieren: /etc/init.d/fail2ban restart
Postfix warning: non-SMTP command from*
In Debian Wheezy, nur noch der Filter und jail Einbindung: postfix_nonsmtp.conf
# Fail2Ban configuration file # # Author: justme :) # # $Revision$ # [Definition] # Option: failregex # Notes.: regex to match the password failures messages in the logfile. The # host must be matched by a group named "host". The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) # Values: TEXT # failregex = warning: non-SMTP command from (.*)\[<HOST>\]: GET # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
jail.conf
[postfix_nonsmtp] enabled = true port = smtp,ssmtp filter = postfix_nonsmtp logpath = /var/log/mail.log bantime = 604800 maxretry = 1
Aktivieren: /etc/init.d/fail2ban restart
Postfix disconnect from unknown*
In Debian Wheezy, nur noch der Filter und jail Einbindung: postfix_unknow.conf
# Fail2Ban configuration file # # Author: justme :) # # $Revision$ # [Definition] # Option: failregex # Notes.: regex to match the password failures messages in the logfile. The # host must be matched by a group named "host". The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) # Values: TEXT # failregex = disconnect from unknown\[<HOST>\] # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
jail.conf
[postfix_unknow] enabled = true port = smtp,ssmtp filter = postfix_unknow logpath = /var/log/mail.log bantime = 604800 maxretry = 6
Aktivieren: /etc/init.d/fail2ban restart
apache-auth.conf
In Debian Wheezy, nur noch der Filter und jail Einbindung: apache-auth.conf
# Fail2Ban configuration file # # Author: Cyril Jaquier # # $Revision$ justme :) # [INCLUDES] # Read common prefixes. If any customizations available -- read them from # common.local before = apache-common.conf [Definition] # Option: failregex # Notes.: regex to match the password failure messages in the logfile. The # host must be matched by a group named "host". The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) # Values: TEXT # #failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$ failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch) # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
Die Apache einträge auf true stellen in jail.conf.
Aktivieren: /etc/init.d/fail2ban restart
apache-noscript.conf - Was ist zu beachten (Ersetzt apache-nohome, Files does not exist)
apache-noscript.conf (kann man apache-nohome auf false stellen, wird ersetzt hier)
Files does not exist , eben apache-nohome
Das ist ja entstanden um phpmyadmin zu verstecken, aber nicht nötig, mit .htaccess ist phpmyadmin sehr gut geschützt. Hier muss ich erwähnen, das mir selber was doofes passiert ist, (gäll Tilt, mrjack , aber sah halt aus wie no route to host für ein paar Leute, und selber bin ich in ignore-ip list :P
Ich mein, man löscht mal das /var/www des Apache servers. Also die Homepage, (oder in nem vhost), und dann kommt es schonmal vor, das error404.html oder ähnliches fehlt, obwohl in der sites-avaiable definiert ist. Also gibt es einen "Files does not exist" in /var/log/apache2/error.log Eintrag. Auch so robots und favicon sind da Protagonisten. Gewisse Anwendungen verursachen das auch selber auf dem Server (php,cgi etc..) , und man meint es sei der Besucher der Seite, also nicht wenn man die log studiert , aber fail2ban meint es.
Und selber merkt man es nicht. Da man in der ignore-ip liste ist.
Darum mache ich eine Beispiel Zeile im neunen apache-noscript.conf, die man verwenden kann, damit Dir nicht der gleiche Fehler passiert.
apache-noscript.conf
# Fail2Ban configuration file # # Author: Cyril Jaquier # # $Revision$ justme :) # [INCLUDES] # Read common prefixes. If any customizations available -- read them from # common.local before = apache-common.conf [Definition] # Option: failregex # Notes.: regex to match the password failure messages in the logfile. The # host must be matched by a group named "host". The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) # Values: TEXT # #failregex = ^%(_apache_error_client)s (File does not exist|script not found or unable to stat) /\S*(\.php|\.asp|\.exe|\.pl)\s*$ # ^%(_apache_error_client)s script '/\S*(\.php|\.asp|\.exe|\.pl)\S*' not found or unable to stat\s*$ #Das Orginal geht nicht, ersetzt jetzt auch apache-nohome Filter failregex = ^%(_apache_error_client)s (File does not exist|malformed header from script|script not found or unable to stat) # ---->> Beispiel, eigentlich Besser !!!! Nicht aus versehen Leute aussperren. #failregex = ^%(_apache_error_client)s (malformed header from script|script not found or unable to stat) # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
Die Apache einträge auf true stellen in jail.conf.
Aktivieren: /etc/init.d/fail2ban restart
sasl.conf
Aus irgendnem Grund muss ich mal gefummelt haben nach Filedatum (kopfkratz). sasl.conf
# Fail2Ban configuration file # # Author: Yaroslav Halchenko # # $Revision$ # [Definition] # Option: failregex # Notes.: regex to match the password failures messages in the logfile. The # host must be matched by a group named "host". The tag "<HOST>" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P<host>[\w\-.^_]+) # Values: TEXT # failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$ #failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [A-Za-z0-9+/]*={0,2})?$ # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
MySQL
/etc/mysql/my.cnf ergänzen im Abschnitt mysqld.
[mysqld] # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. # As of 5.1 you can enable the log at runtime! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # log-error=/var/log/mysqld.log log-warning = 2
/etc/fail2ban/filter.d/mysqld-auth.conf diese Datei neu erstellen mit Inhalt
# Fail2Ban filter for unsuccesfull MySQL authentication attempts # # # To log wrong MySQL access attempts add to /etc/my.cnf in [mysqld]: # log-error=/var/log/mysqld.log # log-warning = 2 # # If using mysql syslog [mysql_safe] has syslog in /etc/my.cnf [INCLUDES] # Read common prefixes. If any customizations available -- read them from # common.local before = common.conf [Definition] _daemon = mysqld failregex = ^%(__prefix_line)s(\d{6} \s?\d{1,2}:\d{2}:\d{2} )?\[Warning\] Access denied for user '\w+'@'<HOST>' (to database '[^']*'|\(using password: (YES|NO)\))*\s*$ ignoreregex = # DEV Notes: # # Technically __prefix_line can equate to an empty string hence it can support # syslog and non-syslog at once. # Example: # 130322 11:26:54 [Warning] Access denied for user 'root'@'127.0.0.1' (using password: YES) # # Authors: Artur Penttinen # Yaroslav O. Halchenko
Dann muss man noch die Datumserkennung anpassen in /usr/share/fail2ban/server/datedetector.py Ab MySQL angefügte Zeilen.
# <09/16/08@05:03:30> template = DateStrptime() template.setName("<Month/Day/Year@Hour:Minute:Second>") template.setRegex("^<\d{2}/\d{2}/\d{2}@\d{2}:\d{2}:\d{2}>") template.setPattern("<%m/%d/%y@%H:%M:%S>") self.__templates.append(template) # MySQL: 130322 11:46:11 template = DateStrptime() template.setName("YearMonthDay Hour:Minute:Second") template.setRegex("^\d{2}\d{2}\d{2} +\d{1,2}:\d{2}:\d{2}") template.setPattern("%y%m%d %H:%M:%S") self.__templates.append(template) finally: self.__lock.release() def getTemplates(self): return self.__templates
/etc/fail2ban/jail.conf Zu unterst den Filter einfügen
# # MySQL Server - fehlerhafte Authtenitifizierung # [mysql-iptables] enabled = true filter = mysqld-auth port = 3306 logpath = /var/log/mysqld.log maxretry = 3 findtime = 600 bantime = 900
Das ganze aktivieren: service fail2ban restart oder /etc/init.d/fail2ban restart
Aus: http://wiki.1awww.com/wiki/Erstellen_Fail2Ban_MySQL-Filter , hat aber kleine Fehler in logpath, zum nachlesen.
Tipps & Tricks
Mini-Howto ssh
Die verschiedenen Möglichkeiten der Benutzeranmeldung auf einem System (Authentifizierung) verursachen unterschiedliche logfiles. Das Programm fail2ban fragt diese Logfiles ab und wertet sie aus. Wenn ein Angriff entdeckt wird, so spert fail2ban die dazu gehörige IP. Deshalb ist es nötig den regulären Ausdruck in der /etc/fail2ban.conf so anzupassen, dass er auf das jeweilige Logfile- Format passend ist. Weiterhin sollte man danach das Programm auf die richtige Funktion überprüfen.
Ein Beispiel: (private Internetadressen wurden durch *zensiert* ersetzt)
Auszug einer versuchten Anmeldung eines nicht vorhandenen Benutzers "qwertz" aus dem logfile /var/log/auth.log:
- Jan 15 14:46:37 localhost sshd[12178]: Invalid user qwertz from *zensiert* Jan 15 14:46:37 localhost sshd[12178]: input_userauth_request: invalid user qwertz
- .. Jan 15 14:46:40 localhost sshd[12178]: Failed keyboard-interactive/pam for invalid user qwertz from *zensiert* port 33666 ssh2
- .. Jan 15 14:46:48 localhost sshd[12178]: Connection closed by *zensiert*
Auszug einer fehlgeschlagenen Anmeldung eines vorhandenen Benutzers "ztrewq" aus der /var/log/auth.log:
- Jan 15 16:03:10 localhost sshd[12548]: error: PAM: Authentication failure for ztrewq from *zensiert* Jan 15 16:03:10 localhost sshd[12548]: Failed keyboard-interactive/pam for ztrewq from *zensiert* port 44091 ssh2 Jan 15 16:03:10 localhost sshd[12548]: Connection closed by *zensiert*
Wir müssen also einen Ausdruck finden, der auf diese Zeilen passt:
- Jan 15 14:46:40 localhost sshd[12178]: Failed keyboard-interactive/pam for invalid user qwertz from *zensiert* port 33666 ssh2 Jan 15 16:03:10 localhost sshd[12548]: Failed keyboard-interactive/pam for ztrewq from *zensiert* port 44091 ssh2
Der passende reguläre Ausdruck in der /etc/fail2ban ist dann beispielsweise:
failregex = : (?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user) .* from (?:::f{4,6}:)?(?P<host>\S*)
Ein nicht vorhandener Benutzer wird dann bereits nach 3 fehlgeschlagenen Passworteingaben gesperrt, ein vorhandener Benutzer nach 3 fehlgeschlagenen Loginversuchen, also 9-maliger Fehleingabe des Passwortes. Dieses Beispiel ist auf Debian testing zugeschnitten und beherscht nebenher noch das Filtern über die /etc/passwd.
Nur wie teste ich ob das Programm funktioniert, ohne mich selbst auszusperren? Die Lösung heist debug-Modus, in dem keine wirklichen Aktionen gemacht werden, aber angezeigt wird was passieren würde, wenn das Programm richtig arbeitet. Puh, langer Schachtelsatz:-) Also öffnet eine Shell auf dem Rechner, auf dem fail2ban installiert ist. Linuxnutzer machen das über ssh, Windowsnutzer mit putty. Werdet root und startet fail2ban im debugmodus und betrachtet das Logfile:
- gandalf@belug:~$ ssh gandalf@elvectra
- Password:
- Last login: Sun Jan 15 13:18:38 2006 from *zensiert*
- gandalf@elvectra:~$ su
- Password:
- elvectra:/# fail2ban -d
- elvectra:/# tail -f /var/log/fail2ban.log
- 2006-01-15 16:27:37,568 DEBUG: Nothing to do
- 2006-01-15 16:27:37,568 DEBUG: SSH: Initialize firewall rules
- ..
Nun lasst diese Shell offen und meldet euch in einem neuen Fenster mit falschem Benutzernamen und einer neuen shell am System an:
gandalf@belug:~$ ssh qwertz@213.23.139.104
- Password:
- Password:
- Password:
- Permission denied (publickey,keyboard-interactive).
- gandalf@belug:~$
Im erstem Fenster könnt Ihr dann so was in der Art sehen:
- 2006-01-15 16:39:44,185 DEBUG: Found *zensiert*
- ...
- 2006-01-15 16:39:47,192 DEBUG: Found *zensiert*
- 2006-01-15 16:39:47,193 INFO: SSH: *zensiert* has 3 login failure(s). Banned.
Super, funktioniert! Jetzt muss nur noch der Debugmodus aufgehoben werden. Dazu gebt in der ersten shell ein:
<STRG>+ <C> (damit wird tail abgebrochen)
- elvectra:/# fail2ban -k
2006-01-15 16:47:23,961 WARNING: Killed Fail2Ban with PID 12597
- elvectra:/# /etc/init.d/fail2ban start
- Starting fail2ban: .done
- elvectra:/#
Wenn man hinter einer Content Firewall steckt und Port 22 dicht ist (Bsp. an Debian Wheezy)
Dann braucht man einen freien Rechner im Internet, wo Port 443 noch frei ist (netstat -l zeigt kein https an wo der Rechner horchen würde.) Mindestens ist bei Apache die default-ssl Site nicht aktiviert, und a2dismod ssl und ein service apache2 restart. Dann kann man sshd auch auf 443 horchen lassen. das wird als Beispiel hier eingesetzt VNC SSH Fernwartung
Wir machen das mal: editieren /etc/ssh/sshd_config
# What ports, IPs and protocols we listen for Port 22 Port 443
Aktivieren: /etc/init.d/ssh restart
Nu kann man mit "ssh user@domain -p 443" drauf zugreifen aus der verzwickten Situation hinter der Firewall.
Dazu die jail.conf
[ssh] enabled = true port = ssh,https filter = sshd logpath = /var/log/auth.log maxretry = 6 [ssh-ddos] enabled = true port = ssh,https filter = sshd-ddos logpath = /var/log/auth.log bantime = 604800 maxretry = 2
Das pam-generic Filter würde ich auch auf true stellen.
jail.conf tips
Generell auch courier und so zeug anwerfen wenn man es betreibt. Ein fail2ban-regex logdatei filterdatei schadet nie, ob die vorinstallierten regex der Dist taugen.
LOG's anschauen, reagieren
Wöchentlich sollte man schon mal zu beginn eines Servers die LOGS in /var/log auswerten und evt. reaktionen tätigen.