fail2ban blockiert nicht richtig
piet
- webserver
0 M.0 Sven Rautenberg0 Jörg Reinholz
Hallo,
ich habe fail2ban am laufen.
Wenn ich 5x (wie eingestellt) den richtigen Usernamen mit falschem Passwort wird die ip blockiert.
Wenn ich jedoch einen falschen Usernamen + Passwort eingeben, dann funktioniert das immer, ohne Blockierung der ip.
In meiner error_log steht
user "richtig": password mismatch
-> diese Meldung wird richtig ausgewertet und blockiert
MySQL user "falsch" not found
-> wird nicht blockiert.
Mein "apache-auth.conf" Filter sieht so aus.
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
Hier bin ich kein Spezialist, jedoch sehe ich das "user .* not found" ausgewertet werden sollte.
Gruss
piet
Mahlzeit,
Wenn ich jedoch einen falschen Usernamen + Passwort eingeben, dann funktioniert das immer, ohne Blockierung der ip.
Ähm ..... wenn ein falscher Username eingegeben wird, woher soll der Dienst denn wissen, dass das Passwort falsch ist?
Wenn der User nicht existiert, gibt es auch kein Passwort zum vergleichen.
Hallo,
Ähm ..... wenn ein falscher Username eingegeben wird, woher soll der Dienst denn wissen, dass das Passwort falsch ist?
Wenn der User nicht existiert, gibt es auch kein Passwort zum vergleichen.
ganz Einfach ... in der error_log steht "MySQL user "falsch" not found
Dies habe ich aber schon beschrieben. d.h. er findet scho einmal den usernamen nicht.
Hier noch einmal der Filter für fail2ban (oben auch beschrieben)
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
... user ... not found...
....user ... password mismatch...
Dies sollte eigentlich reichen... tut aber nicht. (Ich bin hier kein fail2ban Experte)
Übrigens der Filter ist nicht von mir, sondern bei der Installation dabei gewesen.
Jörg Reinholz
Einen weiteren Filter bzw. am Filter etwas ändern möchte ich nur wenn ich genau weiß warum der bestehende Filter nicht funktioniert. Nach meinem Verständnis müsste es funktionieren und wurde doch schon zig mal von anderen benutzt. Ich bin doch nicht der erste mit diesem Problem.
Gruß
piet
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
ganz Einfach ... in der error_log steht "MySQL user "falsch" not found
Eben war es auch noch der Apache. Was denn nun? So kann das nichts werden, Du musst erstmal den Stoff sortieren.
Ich zeige mal Konfigurationsabschnitte aus den Dateien.
/var/log/mysql/error.log habe ich benutzt, weil es von logrotate "behandelt" wird.
(sehe in /etc/logrotate.d/mysql-server o.ä. nach)
1.)
/etc/mysql/my.cnf den Abschnitt unter [mysqld] anpassen um das Logging einzuschalten:
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
log-warning = 2
Aktivieren und dabei auf Fehlermeldungen achten:
sudo service mysql restart
2.)
den Abschnitt unter mysqld-auth in /etc/fail2ban/jail.conf anpassen, damit das logfile auch genommen wird:
[mysqld-auth]
enabled = false
filter = mysqld-auth
port = 3306
logpath = /var/log/mysql/error.log
3.)
/etc/fail2ban/filter.d/mysqld-auth.conf PRÜFEN:
failregex = Access denied for user '\w+'@'<HOST>' (to database '[^']*'|\(using password: (YES|NO)\))*\s*$
4). test:
~> sudo service mysql restart
~> mysql -u gibtsnicht -p mysql
~> tail -n10 /var/log/mysql/error.log
Steht da (auch) etwas wie:
140109 19:49:02 [Warning] Access denied for user 'gibtsnicht'@'localhost' (using password: YES)
?
5.) Dann Feuer:
sudo service fail2ban restart
Nach dem 6. gescheitertem Einlogversuch in MySQL von außen(!), also von einem anderen (ggf. virtuellem) Rechner egal ob mit Passwort, ohne Passwort oder mit falschem Benutzername macht fail2ban den Port zu:
2014-01-09 20:22:48,971 fail2ban.actions: WARNING [mysqld-auth] Ban 192.168.1.52
(in /var/log/fail2ban.log)
Auf dem Rechner sieht man in der Konsole als Meldung des MySQL-Clients dann nur das hier:
ERROR 2003 (HY00): Can't connect to MySQL Server on '192.168.1.2' (111)
Geht also.
Der unter 2. erwähnte Abschnitt muss wie folgt aussehen
[mysqld-auth]
enabled = true
### Hier war das Versäumnis, mit false wird
### fail2ban für mysql-auth abgeschaltet
filter = mysqld-auth
port = 3306
logpath = /var/log/mysql/error.log
Hallo,
sorry, vermutlich habe ich mich nicht richtig ausgedrückt, oder ich verstehe deine Antwort nicht. (mysqld-auth) - > leitungsitzend
Ich habe einen Apache 2 am laufen, bei dem ich meine Loggindaten (user:passwort) in einem MySQL-Server habe.
Um nun am Apache anzumelden habe ich zur "Sicherheit" den fail2ban am laufen.
Dazu habe ich den "apache-auth.conf" Filter benutzt. (wie beschrieben)
Zu filternde logdatei /var/log/apache2/error_log
In der Logdatei steht
[error] [client w.x.y.z] MySQL user not found: /, referer: http://x.y
bzw.
[error] [client w.x.y.z] user mustermann: passwort mismatch: /, referer: http://x.y
Eigentlich müsste der Filter funktionieren.
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
Wenn nicht anders nötig, will ich nur über die /var/log/apache2/error_log auslesen.
Ich bin mir sicher ich habe den Filter "apache-auth.conf" schon mal erfolgreich benutzt.
Damals hatte ich aber keinen MYSQL sondern nur die htaccess mit htusers. Kann es am Wort "MySQL" in der Logdatei liegen... das ist das erste Wort in der Logdatei-Zeile.
Bitte seid nicht so streng zu mir :-)
Danke
piet
Ich habe einen Apache 2 am laufen, bei dem ich meine Loggindaten (user:passwort) in einem MySQL-Server habe.
Oha. Die Parteien sind gehalten vollständig und wahrheitsgemäß vorzutragen.
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
[error] [client w.x.y.z] MySQL user not found: /, referer: http://x.y
[error] [client w.x.y.z] user mustermann: passwort mismatch: /, referer: http://x.y
Die erste der Fehlermeldungen matcht nicht.
Schreib also in /etc/fail2ban/filter.d/apache-auth.conf einen zweiten "Regex" dazu:
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
^%(_apache_error_client)s MySQL user not found\s*$
Womöglich geht auch mit:
failregex = ^%(_apache_error_client)s (MySQL |)user.*(authentication failure|not found|password mismatch)\s*$
Testen konnte ich das aber nicht.
Abend,
ich habe den ganzen Tag verplempert um diesen Sch... fail2ban zur Zusammenarbeit mit http zu bekommen.
1. OS Suse 12.3
2. apache2
3. aktuelle fail2ban aus dem repo von Suse installiert
4. die beiden Überwachungen aktiviert und bei ssh-iptables das logfile umbenannt (Suse)
5. 2 Überwachungen aktiviert
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com]
logpath = /var/log/messages
maxretry = 2
[apache-tcpwrapper]
enabled = true
filter = apache-auth
action = hostsdeny
logpath = /var/log/apache2/error.log
maxretry = 2
1. ssh-iptables funktioniert auf Anhieb (brauche ich eigentlich nicht... nur zum testen)
2. apache-tcpwrapper reagiert gar nicht. Standardmäßig war es auf hostdeny, ich weiß früher lief das auch mit iptables als Standardvorgabe, warum jetzt anders... keine Ahnung.
Ich habe ein altes (1 Jahr) jail.conf probiert... da startete fail2ban gar nicht. (eventuell andere Filter und Action)
Ich möchte auf Port 80 den apache2 überwachen ob mehrmals das falsche(kein) user/passwort
eingegeben wurde.
Sollte eigentlich keine Aktion sein...aber ich sehe den Fehler nicht.
Den Filter von Jörg habe ich eingesetzt keine Änderung.
Standardeinstellungen sollten, wenn auch nicht gut, wenigstens funktionieren.
gruß
"der generfte piet"
[apache-tcpwrapper]
Under CentOS / RedHat Enterprise Linux, httpd (Apache) is not compiled with tcpwrappers support. As a result the example in jail.conf called "apache-tcpwrapper" does not work since /etc/hosts.deny does not affect apache.
Verstanden? Das kann auch für Deinen Apache gelten.
OS Suse 12.3
Schön, dass diese WICHTIGE Information jetzt schon kommt. Bitte gib auch immer an, woher Deine Konfigurationen kommen, dass es eben /etc/fail2ban/jail.conf war musste ich auch erst erraten.
mit apache2ctl -l bzw. apache2ctl -m siehst Du, welche Module als build-in bzw. nachladbar kompiliert wurden.
Vermutlich ist es also der falsche Abschnitt. Nimm den normalen Apache-Abschnitt, blocke ganz normal mit der Firewall.
Jörg Reinholz
Hallo,
Vermutlich ist es also der falsche Abschnitt. Nimm den normalen Apache-Abschnitt, blocke ganz normal mit der Firewall.
Was ist der normale Abschnitt ? und Firewall bedeutet iptables ?
Es gibt nur:
1. apache-tcpwrapper
2. apache-badhost
3. apache-shoerwall
das war's. Es gibt keinen anderen Apache Abschnitts
Jetzt habe ich einen neuen Abschnitt aus einer alten jail.log (ca. 1 Jahr) genommen.
fail2ban startet, jedoch blockt auch nicht.
[apache]
enabled = true
port = http, https
filter = apache-auth
action = iptables[name=ApacheAuth, port=http, protocol=tcp]
maxretry = 3
Mein Hauptproblem, ich sehe nicht ob es am Filter oder aber Action liegt.
Wie kann ich z.B. erkennen ob der Filter funktioniert ?
Auch die debugmeldungen (4) bringen gar nicht's.
Hier die gewünschten Ausgaben.
apache2ctl -l
core.c
prefork.c
http_core.c
mod_so.c
apache2ctl -M
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
actions_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_file_module (shared)
authz_host_module (shared)
authz_groupfile_module (shared)
authz_default_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgi_module (shared)
dir_module (shared)
env_module (shared)
expires_module (shared)
include_module (shared)
log_config_module (shared)
mime_module (shared)
negotiation_module (shared)
setenvif_module (shared)
ssl_module (shared)
userdir_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
proxy_module (shared)
proxy_http_module (shared)
proxy_connect_module (shared)
mysql_auth_module (shared)
Wie gesagt, "ssh" Blockierung funktioniert ohne Probleme. Das kann sicher nicht wild sein,
aber wo liegt der Haken. ;)
Danke für die Mühe
piet
Mein Hauptproblem, ich sehe nicht ob es am Filter oder aber Action liegt.
Wie kann ich z.B. erkennen ob der Filter funktioniert ?
Normalerweise in /var/log/fail2ban wenn das Loglevel in /etc/fail2ban/fail2ban.conf auf 4 steht.
Auch die debugmeldungen (4) bringen gar nicht's.
Ok...
Nimm die /etc/fail2ban/jail.conf
schalte
[apache-tcpwrapper]
enabled = false
füge einen Abschnitt ein:
[apache]
enabled = true
port = http, https
filter = apache-auth
action = iptables[name=ApacheAuth, port=http, protocol=tcp]
maxretry = 3
Wenn nicht existent, lege den genannten Filter an - /etc/fail2ban/filter.d/apache-auth.conf
# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
#
[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
#
# Jörg Reinholz: Original war
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
#
# Jörg Reinholz: Zum blockieren wenn Auth via MySQL angepasster Regex
failregex = ^%(_apache_error_client)s (MySQL |)user.*(authentication failure|not found|password mismatch)\s*$
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Du brauchst noch die /etc/fail2ban/filter.d/apache-common.conf: (steht hinter before =)
[INCLUDES]
after = apache-common.local
[DEFAULT]
_apache_error_client = [[^]]+] [error] [client <HOST>]
wenn in der jail.conf unter [default] etwas steht wie
banaction = iptables-multiport
dann muss es auch /ect/fail2ban/action.d/iptables-multiport.conf geben:
# Fail2Ban configuration file
#
# Author: Cyril Jaquier
# Modified by Yaroslav Halchenko for multiport banning
#
[INCLUDES]
before = iptables-blocktype.conf
[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
iptables -F fail2ban-<name>
iptables -X fail2ban-<name>
# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]'
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>
[Init]
# Default name of the chain
#
name = default
# Option: port
# Notes.: specifies port to monitor
# Values: [ NUM | STRING ] Default:
#
port = ssh
# Option: protocol
# Notes.: internally used by config reader for interpolations.
# Values: [ tcp | udp | icmp | all ] Default: tcp
#
protocol = tcp
# Option: chain
# Notes specifies the iptables chain to which the fail2ban rules should be
# added
# Values: STRING Default: INPUT
chain = INPUT
Die Kommentare habe ich zum Lernen drin gelassen.
Jörg Reinholz
eventuell fehlt noch: iptables-blocktype.conf
# Fail2Ban configuration file
#
# Author: Daniel Black
#
# This is a included configuration file and includes the defination for the blocktype
# used in all iptables based actions by default.
#
# The user can override the default in iptables-blocktype.local
[INCLUDES]
after = iptables-blocktype.local
[Init]
# Option: blocktype
# Note: This is what the action does with rules. This can be any jump target
# as per the iptables man page (section 8). Common values are DROP
# REJECT, REJECT --reject-with icmp-port-unreachable
# Values: STRING
blocktype = REJECT --reject-with icmp-port-unreachable
GANZ WICHTIG:
Dazu muss natürlich iptables als Programmaufruf existieren. Prüfe das. Womöglich musst Du nachschauen und alle Befehle, die mit iptables zu schaffen haben auf SuSEfirewall umschreiben.
Wenn es gar nicht geht packe Deine gesamte Konfiguration ein (tar -czf fail2ban.config.tar.gz /etc/fail2ban/) und schick sie mir per Mail.
Mahlzeit,
sorry du warst schneller.
iptables funktionieren, sonst würde ja
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/messages
maxretry = 2
nicht funktionieren.
eventuell fehlt noch: iptables-blocktype.conf
kann ich testen, aber ich denke nicht... siehe oben.
grüsse aus bayern
piet
Hallo,
gerne nehme ich dein Angebot an.
Ich werde dir die Dateien per email senden.
gruss
der etwas entspanntere piet
Das Problem wurde gelöst. Die Lösung ist allerdings sehr individuell.
Wer Probleme mit der Einrichtung von fail2ban hat kann sich im Ernstfall auch direkt an mich wenden.
Morgen,
Nimm die /etc/fail2ban/jail.conf
schalte
[apache-tcpwrapper]
enabled = false
>
OK
> füge einen Abschnitt ein:
>
> ~~~apache
[apache]
> enabled = true
> port = http, https
> filter = apache-auth
> action = iptables[name=ApacheAuth, port=http, protocol=tcp]
> maxretry = 3
hat default nicht existiert, genau so wie du geschrieben hast, habe ich es schon von einem anderen (funktionierenden) Projekt übernommen und in die jail.conf kopiert.
Zusätzlich habe ich noch logpath = /var/log/apache2/error_log
einegtragen.
Wenn nicht existent, lege den genannten Filter an - /etc/fail2ban/filter.d/apache-auth.conf
Filter war vorhanden und ich habe deine Zeile schon eingetragen.
Trotzdem habe ich nochmals alles neu ersetzt.
Du brauchst noch die /etc/fail2ban/filter.d/apache-common.conf: (steht hinter before =)
vorhanden ... trotzdem alles ersetzt.
Alles was hier war habe ich probiert.. ssh funktioniert, apache nicht.
Ich kann mir das absolut nicht erklären. Ich habe auch schon "port=80" anstatt port=http probiert. Ich habe schon 3 mal fail2ban (ohne mysql) eingesetzt, sofort ohne Probleme gelaufen.
Ich müsste feststellen ob überhaupt der Filter angesprochen wird, bzw. die /var/log/apache2/error_log überprüft wird.
Ich bin wirklich ratlos.
gruß
der deprimierte piet
Hallo,
sorry, vermutlich habe ich mich nicht richtig ausgedrückt, oder ich verstehe deine Antwort nicht. (mysqld-auth) - > leitungsitzend
Ich habe einen Apache 2 am laufen, bei dem ich meine Loggindaten (user:passwort) in einem MySQL-Server habe.
Um nun am Apache anzumelden habe ich zur "Sicherheit" den fail2ban am laufen.
Dazu habe ich den "apache-auth.conf" Filter benutzt. (wie beschrieben)
Zu filternde logdatei /var/log/apache2/error_log
In der Logdatei steht
[error] [client w.x.y.z] MySQL user not found: /, referer: http://x.y
bzw.
[error] [client w.x.y.z] user mustermann: passwort mismatch: /, referer: http://x.y
Eigentlich müsste der Filter funktionieren.
failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$
Wenn nicht anders nötig, will ich nur über die /var/log/apache2/error_log auslesen.
Ich bin mir sicher ich habe den Filter "apache-auth.conf" schon mal erfolgreich benutzt.
Damals hatte ich aber keinen MYSQL sondern nur die htaccess mit htusers. Kann es am Wort "MySQL" in der Logdatei liegen... das ist das erste Wort in der Logdatei-Zeile.
Bitte seid nicht so streng zu mir :-)
Danke
piet
Moin!
ich habe fail2ban am laufen.
Mit einer recht uneleganten Konfiguration, denn...
Wenn ich 5x (wie eingestellt) den richtigen Usernamen mit falschem Passwort wird die ip blockiert.
Wenn ich jedoch einen falschen Usernamen + Passwort eingeben, dann funktioniert das immer, ohne Blockierung der ip.
...man kann jetzt herausfinden, welche Usernamen auf deinem System existieren, indem man sie durchprobiert. Wird man geblockt, war es ein gültiger Name, den man mit seinem Bot-Netz mal hinsichtlich der Passworte durchprobieren sollte - das gibt pro IP und Zeitraum des Blocks 5 Versuche, also durchaus 50.000 oder deutlich mehr Tests auf ein Passwort.
Ohne Fail2ban würde man diese Info nicht kriegen - wenn der Login nicht funktioniert, kriegt man keinen Hinweis, dass manche Login-Versuche "besser" waren als andere.
- Sven Rautenberg
Ein Beispiel sagt ja mehr als tausend Worte...
Wenn Du eine eine weitere Regel brauchst um auch bei falschen Benutzernamen zu blocken, dann schaue mal in der /etc/fail2ban/filter.d/sshd.conf nach. Da steht ein prima Beispiel, wie Du weitere Regeln einfügst:
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via \S+)?\s*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
Nämlich einfach eine weitere Zeile anhängen. Natürlich in der mysqld-auth.conf.
Jörg Reinholz