Pakete: * Debian (ab 12): ''fail2ban python3-pyinotify python3-systemd'' Per default überwacht fail2ban bei debian ssh: egrep -A7 '\[sshd?\]' /etc/fail2ban/jail.conf less /etc/fail2ban/filter.d/sshd.conf … [DEFAULT] … banaction = iptables-multiport … less /etc/fail2ban/action.d/iptables-multiport.conf fail2ban Zusammenfassung der Konfiguration anzeigen: fail2ban-client status fail2ban-client status sshd ====== Apache Basic Auth ====== Pakete: apache2 fail2ban (Debian 9) mkdir -p /srv/www/fail2ban htpasswd -c /srv/www/htpasswd_fail2ban heinz AllowOverride AuthConfig AuthType Basic AuthName "Bitte Username und Passwort" AuthBasicProvider file AuthUserFile /srv/www/htpasswd_fail2ban Require valid-user Hello fail2ban! Hello fail2ban Zugriff lokal testen: wget --user heinz --password xxx -nv -O - http://127.0.0.1/fail2ban-test/index.html [apache-auth] enabled = true fail2ban-client reload fail2ban-client status fail2ban-client status apache-auth Von einem anderen Rechner aus: ab -n 10 -A heinz:nono http://192.168.212.11/fail2ban-test/index.html less /var/log/fail2ban.log ====== Apache Log mit HTTP Status 400 (Bad Request) ====== Beispiel für Zeile aus ''access.log'' mit Status 400: server.example.org:80 139.162.173.209 - - [10/Jan/2026:21:10:46 +0000] "GET default.asp HTTP/1.1" 400 444 "-" "-" ===== Filter ===== [Definition] failregex = ^\S+ - - \[[^\]]*\] "[^"]+" 400 (( '''' siehe ^Tag^Description^Example regex in filter file^ ||Matches IPv4/IPv6 address or hostname|''^Failed login from $''| ||Matches IPv4 address only|''^Failed login from $''| ||Matches IPv6 address only|''^Failed login from $''| ||Matches IPv4/IPv6 address (no hostname)|''^Connection from $''| ||Matches IP with optional CIDR notation|''^Connection from $''| |...|Captures a username|''^Failed login for \S+$''| |...|Captures a failure ID|''^Error \d+ from $''| ||Used for multi-line matching|''^Start pattern$^End pattern$''| )) Filter testen: fail2ban-regex 'server.example.org:80 139.162.173.209 - - [10/Jan/2026:21:10:46 +0000] "GET default.asp HTTP/1.1" 400 444 "-" "-"' /etc/fail2ban/filter.d/apache-badrequest.local -> sollte ''1 matched'' ausgeben fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-badrequest.local -> sollte die korrekte Anzahl Zeilen mit Status 400 ausgeben. ===== Jail ===== [apache_bad_request] enabled = true port = http,https filter = apache-badrequest logpath = /var/log/apache*/*access.log maxretry = 3 Testen: fail2ban-client reload -> ''OK'' fail2ban-client status -> ''Jail list: … apache_bad_request…'' fail2ban-client status apache_bad_request