avenga
Goto Top

Fail2ban Nginx Konfiguration

Hallo,
ich wollte gern fail2ban nutzen für meinen Nginx Webserver um die ganzen Bots zu bannen.

Nachdem ich fail2ban installiert habe, habe ich die jail.local erstellt mit folgendem Inhalt:

[DEFAULT]
ignoreself = true
bantime  = 2h
maxretry = 3

[nginx-bad-request]
enabled = true

[nginx-botsearch]
enabled = true

[nginx-http-auth]
enabled = true

[nginx-limit-req]
enabled = true

Wenn ich dann schaue was z.B. der Filter nginx-bad-request macht:
fail2ban-client status nginx-bad-request
Status for the jail: nginx-bad-request
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=nginx.service + _COMM=nginx
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:
sehe ich, dass fail2ban das system journal durchsucht.

Das bringt natürlich nichts, da Nginx hier loggt: /var/log/nginx/access.log

Da ich bestimmt nicht der erste Mensch bin, der Nginx auf Ubuntu LTS 24.04 mit fail2ban betreiben will, stellt sich mir die Frage: Was soll ich hier ändern ?

Nginx ins Journal loggen lassen will ich ungern, wüsste auch nicht wie/wo ich das einstellen sollte.

Oder muss ich die ganzen Regeln unter /etc/fail2ban/filter.d/ händlisch ändern?
z.B.: nginx-http-auth.conf

# fail2ban filter configuration for nginx

[Definition]
mode = normal
mdre-auth = ^\s*\[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$ 
mdre-fallback = ^\s*\[crit\] \d+#\d+: \*\d+ SSL_do_handshake\(\) failed \(SSL: error:\S+(?: \S+){1,3} too (?:long|short)\)[^,]*, client: <HOST>

mdre-normal = %(mdre-auth)s
mdre-aggressive = %(mdre-auth)s
                  %(mdre-fallback)s

failregex = <mdre-<mode>>

ignoreregex = 

datepattern = {^LN-BEG}

journalmatch = _SYSTEMD_UNIT=nginx.service + _COMM=nginx

ich könnte bei den 4 Filtern für Nginx dort eintragen:
journalmatch =/var/log/nginx/access.log
ich bin mir aber nicht sicher ob das im Sinne des Erfinders ist.

MfG

Content-ID: 670659

Url: https://administrator.de/forum/fail2ban-nginx-konfiguration-670659.html

Ausgedruckt am: 12.01.2025 um 22:01 Uhr

Avenga
Avenga 12.01.2025 aktualisiert um 22:04:18 Uhr
Goto Top
Nach langer Suche habe ich eine Lösung für mich gefunden.

Note: if systemd backend is chosen as the default but you enable a jail
for which logs are present only in its own log files, specify some other
backend for that jail (e.g. polling) and provide empty value for
journalmatch. See https://github.com/fail2ban/fail2ban/issues/959#issuecomment-74901200

Meine jail.local sieht nun so aus:
[DEFAULT]
ignoreself = true
bantime  = 2h
maxretry = 3

[nginx]
enabled = true
port = http,https
backend = polling
logpath = /var/log/nginx/access.log

Den Filter "nginx" habe ich aus einem YT Video:
[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$  
ignoreregex =

Damit funktioniert das Bannen (sowohl Nginx als auch SSH).

Ich hatte auch die access.log und error.log von Nginx auf Syslog umgestellt, aber die vorhandenen Filter (siehe oben, erster Codeblock) haben nichts gemacht. Ich bin ehrlich gesagt auch kein Regex Experte.

Für weitere Tipps & Hinweise bin ich trotzdem dankbar.


P.S. der Vollständigkeithalber: in der /etc/fail2ban/jail.d/defaults-debian.conf steht:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd

[sshd]
enabled = true
Damit wird "systmd" als Standard definiert, ebenso nftables als Firewall und der SSH wird aktiviert. Diese Datei wird wohl als erstes geladen.
SSH hat auch sofort funktioniert.