Fail2ban: Hilfe bei fail2ban-regex Guacamole Docker Logs benötigt

Erstellt am 24. Nov. 2020  ·  6Kommentare  ·  Quelle: fail2ban/fail2ban

Allgemeine Informationen:
Verbreitung: Ubuntu 18.04
Fail2Ban v0.10.2

Umfeld:

_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_

  • Fail2Ban-Version (einschließlich aller möglichen Distributionssuffixe):
  • Betriebssystem, einschließlich Release-Name/Version:
  • [X] Fail2Ban über Betriebssystem-/Verteilungsmechanismen installiert
  • [ ] Sie haben keine zusätzlichen fremden Patches auf die Codebasis angewendet
  • [ ] Einige Anpassungen wurden an der Konfiguration vorgenommen (Details unten sind so)

mein Problem:

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?

how-to

Alle 6 Kommentare

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!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

AleksCee picture AleksCee  ·  5Kommentare

Skyridr picture Skyridr  ·  3Kommentare

Madh93 picture Madh93  ·  6Kommentare

twixi picture twixi  ·  5Kommentare

KiwiMorpheus picture KiwiMorpheus  ·  3Kommentare