Der Fail2ban-Regex-Filter funktioniert nicht mit Nginx-Protokolldateien

Der Fail2ban-Regex-Filter funktioniert nicht mit Nginx-Protokolldateien

Ich habe mir den ganzen Tag den Kopf zerbrochen und versucht, meinen Regex-Filter mit meinem access.log abzugleichen, aber ohne Erfolg. Ich habe fail2ban auf einem Gentoo-Server installiert und es läuft einwandfrei (ich habe meine eigene IP manuell gesperrt und es funktioniert), aber fail2ban regex schlägt fehl und gibt 0 Ergebnisse mit Filtern zurück, obwohl meine Site gerade und in den letzten Tagen unter einem Heavyload-Angriff steht.

übrigens verwende ich keine iptables-Software auf meinem Server (muss ich eine installieren, damit fail2ban funktioniert?). Ich schätze, fail2ban kann mein Logformat oder mein Zeitformat nicht lesen. Ich habe versucht, alles zu optimieren, aber ohne Erfolg. Jede Hilfe ist sehr, sehr willkommen.

Hier ist mein jail.local

[INCLUDES]
before = paths-common.conf
[DEFAULT]
action=%(action_mwl)s
ignoreip = 127.0.0.1/8 192.168.99.25
ignorecommand =
bantime  = 86400
findtime  = 300
backend = gamin

[wp-login]
enabled = true
filter = wp-login
banaction=iptables-allports
logpath = /var/log/nginx/localhost*access_log
bantime = 7200
maxretry = 1


[nginx-nohome]
enabled=true
port=http,https
filter=nginx-nohome
logpath=/var/log/nginx/localhost.error.log
bantime=86400
maxretry=2

[nginx-dos]
enabled = true
port    = http,8090,8080
filter  = nginx-dos
logpath = /var/log/nginx/localhost.access*log
findtime = 30
bantime  = 172800
maxretry = 140

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/messages
bantime = 7200
maxretry = 6

[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/localhost.access*log
findtime = 600
bantime = 7200
maxretry = 10

und hier sind meine Filter:

[Definition]i
failregex = limiting requests, excess:.* by zone.*client: <HOST>

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
~

[Definition]
failregex = ^<HOST> -.*GET */wp-login* HTTP/1\.."
ignoreregex =

#
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =


[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =
~

Auf der Nginx-Seite ist dies meine Syntax und Ausgabe im Protokollformat:

Protokollformat

 log_format main
 '[$time_local] - $remote_addr '
 '"$request" $status $bytes_sent '
 '"$http_referer" "$http_user_agent" ';

Accesslog-Ausgabe:

[01/Oct/2015:09:15:52 +0800] - 60.18.17.206, 113.21.15.23 "POST/httprl_async_function_callback?count=121 HTTP/1.1" 200 1351 "-" "Drupal (+http://drupal.org/)" "-"

Fehlerprotokollformat:

2015/09/22 00:04:06 [error] 7418#0: *287 FastCGI sent in stderr: "Primary    scriptunknown", client: 192.168.99.76, server: www.sams.com, request: "GET/city HTTP/1.0", host: "www.sams.com"

AKTUALISIEREN: Meine Website verwendet kein WordPress, aber ich bekomme Millionen von WordPress-bezogenen Links (Link wp-login.php), die ich blockieren möchte. Es gibt viele aggressive, bösartige Suchbots, Werbebots und Spider, die meinen Server beschädigen. Ich möchte sie blockieren.

Antwort1

Es scheint also, dass Sie mit regulären Ausdrücken nicht sehr vertraut sind, Sie haben eine steile Lernkurve. Das Dienstprogramm fail2ban verwendetPython-Regexe, es lohnt sich, diese Seite ein wenig durchzulesen.

Ein Teil des Problems, das Sie haben, ist dieser Teil Ihres Failregex

^<HOST>

Dies bedeutet, dass nach dem vordefinierten <HOST>regulären Ausdruck am Anfang der Zeile (oder direkt nach einer neuen Zeile) gesucht werden soll ^.

Wenn man sich Ihre Protokollbeispiele ansieht, beginnen sie alle mit einem Datum/einer Uhrzeit. Dies wird von fail2ban entfernt, bevor der reguläre Ausdruck auf den Rest der Zeile angewendet wird. Die Zeile beginnt mit nichts, was '^' erkennen würde, deshalb schlägt Ihr regulärer Ausdruck fehl.

Ein einfaches Beispiel mit Ihrem Fehlerprotokolleintrag. Wenn Sie bei scriptunknownFehlern Maßnahmen ergreifen möchten (was gut oder schlecht sein kann), können Sie einen Failregex wie diesen verwenden.

failregex= scriptunknown", clinet: <HOST>

Sie können dies testen, indem Sie es über Ihre Protokolldatei ausführen mitfail2ban-regex(1)z.B

fail2ban-regex /path/to/logfile 'scriptunknown", client: <HOST>'
Running tests
=============

Use   failregex line : scriptunknown", client: <HOST>
Use         log file : /path/to/logfile
Use         encoding : UTF-8


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] scriptunknown", client: <HOST>
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
|  [1] Year(?P<_sep>[-/.])Month(?P=_sep)Day 24hour:Minute:Second(?:,Microseconds)?
`-

Lines: 2 lines, 0 ignored, 1 matched, 1 missed [processed in 0.00 sec]    
|- Missed line(s):
|  [01/Oct/2015:09:15:52 +0800] - 60.18.17.206, 113.21.15.23  "POST/httprl_async_function_callback?count=121 HTTP/1.1" 200 1351 "-" "Drupal (+http://drupal.org/)" "-"

Ok, das führt vielleicht dazu, was Sie wollen, ist aber möglicherweise zu allgemein. Sie müssten sich die Ergebnisse ansehen und diese Anrufe tätigen.

übrigens verwende ich auf meinem Server keine iptables-Software (muss ich eine installieren, damit fail2ban funktioniert?)

Sie benötigen eine Firewall, die mit fail2ban kompatibel ist und auf Ihrem System installiert und funktioniert. Wie Sie es getestet haben und

ich habe meine eigene IP manuell gesperrt und es funktioniert

Dann nehme ich an, dass da etwas ist, das funktioniert.

verwandte Informationen