Allgemeine Informationen:
Verbreitung: Ubuntu 18.04
Fail2Ban v0.10.2
_Füllen Sie die zutreffenden Kästchen aus und markieren Sie ( [x]
). Wenn Ihre Fail2Ban-Version veraltet ist,
und Sie können nicht überprüfen, ob das Problem in der neuesten Version weiterhin besteht. Wenden Sie sich besser an den Support
von der Distribution, von der Sie Fail2Ban erhalten haben_
Liebe Sebres,
Ich habe in den letzten 3 Tagen viel über Shell-Skripting gelernt :)
Aber die Regex-Syntax ist wirklich seltsam; Ich verstehe nicht, wie es funktioniert.
Bei diesem WAF-Produkt gibt es jetzt Sichtbeschränkungen und ich muss meine guten alten Guacamole-Behälter aktivieren.
So sieht das Protokoll aus:
{"log":"12:59:14.168 [http-nio-8080-exec-4] WARN o.a.g.r.auth.AuthenticationService - Authentication attempt from [192.168.8.5, 172.17.0.1] for user \"admin\" failed.\n","stream":"stdout","time":"2020-11-22T11:59:14.168982605Z"}
{"log":"12:59:15.477 [http-nio-8080-exec-9] WARN o.a.g.r.auth.AuthenticationService - Authentication attempt from [192.168.8.5, 172.17.0.1] for user \"admin\" failed.\n","stream":"stdout","time":"2020-11-22T11:59:15.477692225Z"}
Schritt 1: Einfach starten - Hilfreich: https://github.com/fail2ban/fail2ban/issues/2645#issuecomment -592032811
Funktioniert!
fail2ban-regex -v \
'19:48:16.995 [http-nio-8080-exec-2] WARN o.a.g.r.auth.AuthenticationService - Authentication attempt from [192.168.8.5, 172.17.0.1] for user "dfg" failed.' \
'\b[Aa]uthentication attempt from \[<HOST>(?:,[^\]]*)?\] (?:for user (?:"[^"]*" )?)?failed\.\s*$'
Schritt 2; Datumsmuster hinzufügen; Hilfreiche https://github.com/fail2ban/fail2ban/issues/2592#issuecomment -573119939
Fehlgeschlagen :(
fail2ban-regex -v \
--datepattern='^\{"log":"%%H:%%M:%%S\.%%f+\s+' \
'"log":"19:48:16.995 [http-nio-8080-exec-2] WARN o.a.g.r.auth.AuthenticationService - Authentication attempt from [192.168.8.5, 172.17.0.1] for user "dfg" failed."' \
'\b[Aa]uthentication attempt from \[<HOST>(?:,[^\]]*)?\] (?:for user (?:"[^"]*" )?)?failed\.\s*$'
Und mit dem vollständigen Log-String inkl. „n","stream":"stdout","time":"2020-11-22T11:59:15.477692225Z"“ Step1 gibt auch NULL-Matches zurück.
Könnten Sie mir hier bitte ein zweites Mal helfen?
Sie müssen %
als %%
in Konfigurationsdateien (zB in Filter oder Jail) maskieren, in der Befehlszeile muss es immer noch ein einzelnes Zeichen sein, also
-fail2ban-regex -v --datepattern='^\{"log":"%%H:%%M:%%S\.%%f+\s+' ...
+fail2ban-regex -v --datepattern='^\{"log":"%H:%M:%S\.%f+\s+' ...
wie bei RE, Ihre (zweite) Variante würde nicht funktionieren (auch mit korrektem Datumsmuster), da Ihre Nachricht nicht mit failed.
endet (wegen End-Anker $
in failed\.\s*$
), so dass die Regex auf den Inhalt von Wert in "log":"value"
angewendet werden kann, aber nicht auf die ganze Nachricht, die Json ähnlich sieht und mehr Daten enthält, in einer Struktur eingeschlossen und anders maskiert (zB Backslash in for user \"...
beachten)
ich würde sowas machen:
$ msg='{"log":"12:59:14.168 [http-nio-8080-exec-4] WARN o.a.g.r.auth.AuthenticationService - Authentication attempt from [192.168.8.5, 172.17.0.1] for user \"admin\" failed.\n","stream":"stdout","time":"2020-11-22T11:59:14.168982605Z"}'
$ dp=',"time"\s*:\s*"%Y-%m-%dT%H:%M:%S\.%f\d*%z"\}$'
$ re='^\{"log"\s*:\s*"\S+\s+\[[^\]]+\]\s+WARN\s+\S+\s+-\s+[Aa]uthentication attempt from \[<ADDR>(?:,[^\]]*)?\] (?:for user (?:\\"<F-USER>[^"]*</F-USER>\\" )?)?failed\.'
$ fail2ban-regex -v --datepattern="$dp" "$msg" "$re"
...
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] ^\{"log"\s*:\s*"\S+\s+\[[^\]]+\]\s+WARN\s+\S+\s+-\s+[Aa]uthentication attempt from \[<ADDR>(?:,[^\]]*)?\] (?:for user (?:\\"<F-USER>[^"]*</F-USER>\\" )?)?failed\.
| 192.168.8.5 Sun Nov 22 12:59:14 2020
`-
...
Date template hits:
|- [# of hits] date format
| [1] ,"time"\s*:\s*"Year-Month-DayT24hour:Minute:Second\.Microseconds\d*Zone offset"\}$
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
# newer version can output found failure data (rows):
$ fail2ban-regex -o row --datepattern="$dp" "$msg" "$re"
['192.168.8.5', 1606046354, {'ip6': None, 'user': 'admin', 'ip4': '192.168.8.5'}],
Dies ist unverwechselbarer, von Anfang an verankert und verwendet datepattern für einen genaueren Zeitstempel mit Datum (in UTC, am Ende des Protokolls).
Beachten Sie auch, dass fail2ban einen Teil der Nachricht ausschneidet, der mit datepattern
übereinstimmt, bevor die Suche nach failregex
beginnt.
Oben hat sich ein kleiner Fehler eingeschlichen (ich habe die Nachricht aktualisiert) - um Z
(Zeichen für GMT) zu erkennen, sollte man das Zonen-Offset-Token ( %z
) anstelle des Zonennamen-Tokens %Z
):
-dp=',"time"\s*:\s*"%Y-%m-%dT%H:%M:%S\.%f\d*%Z"\}$'
+dp=',"time"\s*:\s*"%Y-%m-%dT%H:%M:%S\.%f\d*%z"\}$'
...
-| 192.168.8.5 Sun Nov 22 11:59:14 2020
+| 192.168.8.5 Sun Nov 22 12:59:14 2020
...
-| [1] ,"time"\s*:\s*"Year-Month-DayT24hour:Minute:Second\.Microseconds\d*Zone name"\}$
+| [1] ,"time"\s*:\s*"Year-Month-DayT24hour:Minute:Second\.Microseconds\d*Zone offset"\}$
Danke schön!
Habe es mit eurer Hilfe zum Laufen gebracht, echt genial!
Fügen Sie Ihren Rat hinzu:
fail2ban.datedetector [20911]: INFO Datumsmuster ',"time"\\s*:\\s*"%Y-%m-%dT%H:%M:%S\\.%f\\d*%z"\\}$'
: ,"time"\s*:\s*"Year-Month-DayT24hour:Minute:Second\.Microseconds\d*Zone offset"\}$
Eine letzte Frage; Ich möchte den kommenden Arbeitsaufwand für fail2ban.filter reduzieren :)
Ich dachte, es wäre eine gute Idee, den Logpfad so gut wie möglich zu definieren. ( Container Update ( ID-Änderungen etc. Ist hier nicht der Fall)
Von logpath = /media/data/docker/containers/*/*-json.log
bis
logpath = /media/data/docker/containers/5e2543bbe77a52ff310073fdfb4183fa3fda6a3dd98294b48a081517baa20eb4/5e2543bbe77a52ff310073fdfb4183fa3fda6a3dd98294b48a081517baa20eb4-json.log \
Dies führt zu einem Fehler;
Kann ich etwas tun?
Ich möchte den kommenden Arbeitsaufwand für fail2ban.filter reduzieren
Ich dachte, es wäre eine gute Idee, den Logpfad so gut wie möglich zu definieren.
Nicht wirklich. Denn derzeit macht fail2ban die Glob-Interpolation und die Suche nur einmal beim Start (es gibt ein Problem #1379 und viele experimentelle Zweige, die noch nicht im Kern zusammengeführt sind).
Dein Versuch ändert also nichts.
Kann ich etwas tun?
ja, entferne den nachgestellten Backslash \
nach .log
:)
(optional) Der zweite Parameter in jedem Protokollpfad kann entweder head
oder tail
.
Once again: Thank you!
Das Bier geht auf mich!
Thank you!!! Appreciated!
(wenn es das Bier sein sollte, lass ich es mir schmecken... aber ich befürchte, situationsbedingt, es wird eher irgendein Buch, oder eben zwei;)
Nochmals danke!