Fail2Ban

Inhalt

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:

Auszug einer fehlgeschlagenen Anmeldung eines vorhandenen Benutzers "ztrewq" aus der /var/log/auth.log:

Wir müssen also einen Ausdruck finden, der auf diese Zeilen passt:

Der passende reguläre Ausdruck in der /etc/fail2ban ist dann beispielsweise:

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:

Nun lasst diese Shell offen und meldet euch in einem neuen Fenster mit falschem Benutzernamen und einer neuen shell am System an:

Im erstem Fenster könnt Ihr dann so was in der Art sehen:

Super, funktioniert! Jetzt muss nur noch der Debugmodus aufgehoben werden. Dazu gebt in der ersten shell ein:

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.

Fail2Ban (zuletzt geändert am 2017-07-29 22:26:06 durch 46-127-165-199)