Fail2ban: Hinzufügung des Datumsmusters in der Filterdatei

Erstellt am 6. Juni 2018  ·  7Kommentare  ·  Quelle: fail2ban/fail2ban

Umfeld:

_Füllen Sie die zutreffenden Kästchen aus und kreuzen Sie sie an ( [x] ). Wenn Ihre Fail2Ban-Version veraltet ist,
und Sie nicht überprüfen können, ob das Problem in der aktuellen Version weiterhin besteht, wenden Sie sich besser an den Support
aus der Distribution, von der Sie Fail2Ban erhalten haben_

  • Fail2Ban-Version (einschließlich aller möglichen Distributions-Suffixe): 0.9-6
  • Betriebssystem, einschließlich Releasename/Version: Centos 06
  • [x ] Fail2Ban wird über Betriebssystem/Verteilungsmechanismen installiert
  • [ ] Sie haben keine zusätzlichen fremden Patches auf die Codebasis angewendet
  • [ ] Einige Anpassungen wurden an der Konfiguration vorgenommen (bitte Details unten angeben)

Das Thema:

Datumsmuster für ein Tomcat-Protokoll entspricht nicht dem Standard von irgendwelchen Daten
Daher fängt der Filter die erforderliche Zeichenfolge aus dem Protokoll ab, kann jedoch nicht nach Datum und Uhrzeit suchen
_Zusammenfassung hier_
Das in den Tomcat-Protokollen erwähnte Datumsmuster ist: (/var/log/tomcat2/catalina.out)

**[06-Jun-2018_19:37:41,631]** [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>

Schritte zum Reproduzieren

Filter erstellt, um das obige Protokoll zu erfassen:

failregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status :  Failure).*(?: Return Code : ).*
ignoreregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status :  Failure).*(?:Return Code : 114).*

Erwartetes Verhalten

  1. Der obige Filter sollte fehlgeschlagene Anmeldungen erfassen
  2. Der Filter sollte die fehlgeschlagene Anmeldung überspringen, wenn der Rückgabecodewert 114 ist

Beobachtetes Verhalten

  1. Der erstellte Filter kann das Datum aus den Protokollen von /var/log/tomcat2/catalina.out nicht analysieren

    Alle zusätzlichen Informationen

Konfiguration, Dump und weitere hilfreiche Auszüge

  1. Keine Änderungen an jail.config
  2. Erstellung eines Gefängnisses in jail.local zum Erfassen der fehlgeschlagenen Anmeldungen (Name = trialJail)

    Alle Anpassungen, die an der Konfiguration von /etc/fail2ban/ vorgenommen wurden

Gefängnis in jail.local hinzugefügt

[trialJail]

enabled = true
filter = multiService
action = iptables-multiport[name=trialJail, port="smtp,imap,pop3", protocol=tcp]
logpath = /var/log/tomcat2/catalina.out
findtime = 1200
bantime = 30
maxretry = 2
ignoreip =

Relevante Teile der Datei /var/log/fail2ban.log:

_vorzugsweise beim Ausführen von fail2ban mit loglevel = 4 _

  1. Der Fehler, der von fail2ban ausgelöst wird, weil das Datum nicht analysiert werden kann, lautet wie folgt
Jun  6 19:37:41 Master fail2ban.filter[7747]: WARNING Found a match for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>' but no valid date/time found for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>'. Please try setting a custom date pattern (see man page jail.conf(5)). If format is complex, please file a detailed issue on https://github.com/fail2ban/fail2ban/issues in order to get support for this format.

Relevante Zeilen aus den betreffenden überwachten Protokolldateien:

Die Protokollzeilen, an denen ich arbeite, sind: (Zeilen, die erfasst werden müssen)

[06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : **IMAP** from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 280 ms>
[06-Jun-2018_17:09:57,596] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : null from ip : null finished with status :  Failure. invalid parameters are provided to function. Return Code : 106. Execution finished in : 1 ms>
[06-Jun-2018_17:25:20,653] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : **POP** from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 84 ms>

Der Hauptfokus dieser Frage ist, wie ich das Datumsmuster parse?
Bonusfrage wäre, wie ich alle oben genannten Protokolle in einem einzigen Filter erfasse (etwas, an dem ich derzeit arbeite (Ports: smtp,pop3,imap))

documentation

Alle 7 Kommentare

Wie parse ich das Datumsmuster?

Ihr Muster könnte zum Beispiel '^[%d-%b-%Y_%H:%M:%S,%f]' lauten.

Beachten Sie, dass Sie es in den Konfigurationsdateien mit doppeltem Prozentzeichen angeben sollten, wie:

datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]

PoC:

$ fail2ban-regex -v -d '^\[%d-%b-%Y_%H:%M:%S,%f\]' "$str" 'from ip : <HOST>'

Running tests
=============

Use      datepattern : ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
Use   failregex line : from ip : <HOST>
Use      single line : [06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth....


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] from ip : <HOST>
|      192.168.0.124  Wed Jun 06 17:07:42 2018
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]

Beachten Sie auch, dass fail2ban das mit Datum und Uhrzeit übereinstimmende Datumsmuster aus der Zeichenfolge ausschneidet, bevor die Übereinstimmung nach failregex gesucht wird.

Bonus-Frage

Bonus-Antwort - Lesen Sie das Handbuch, beginnen Sie beispielsweise mit Regular Expression Syntax :: Python-Dokumentation .
Zum Beispiel können Ihre protokollierten Ports: smtp,pop3,imap so etwas wie sein
for service : (?:SMTP|POP3|IMAP|null) from ip ,
oder einfach als Nicht-Leerzeichen \S+ Regex:
for service : \S+ from ip ...

Das hat gut funktioniert, danke Sir
Eine andere Frage, ich habe ein Ignorier-Regex-Muster für die obigen Protokolle, das dem Rückgabecode entgeht: 114.
ignoreregex = .*(?:Return Code : 114.).*
Der obige Befehl "ignoreregex" funktioniert einwandfrei, um den Rückgabecode zu umgehen: 114.
Die Frage ist also, wie erwähne ich den obigen Ignoreregex in Failregex selbst, um alle Codes zu erfassen, aber nicht 114, um die Berechnung von Ignoreregex zu vermeiden?
Die Failregex, die für alle Codes funktioniert, ist - (funktioniert)
failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?:Return Code : ).*
Die Failregex, die alle Codes außer 114 erhalten soll, ist - (funktioniert nicht)
Bisher habe ich versucht,

> failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?!.*Return Code : 114.).*

So etwas wie .*(?!.*Return Code : 114.).* wird niemals funktionieren (geschweige denn, es ist verwundbar), denn catch all .* findet immer etwas, zB mit something. Return Code : 114. kann es ziemlich gut something. R fangen und der Rest eturn Code : 114. stimmt nicht mit Ihrer negativen Vorausschau überein.

Sie sollten also nur ein genaueres Muster verwenden:

>>> import re
>>> cr = re.compile(r"\S+\. Return Code : (?!114)\d+\.")
>>> print(bool(cr.match("something. Return Code : 108.")))
True
>>> print(bool(cr.match("something. Return Code : 114.")))
False

Und last but not least, verwenden Sie keine Catch-alls und versuchen Sie Regex zu verankern (zumindest von einer Seite, zB von begin ^... oder von beiden ^...$ , beachten Sie .*$ oder ^.* sind keine Anker und machen keinen Sinn).
Seien Sie also bei Regex präziser, insbesondere wenn einige fremde (Benutzer-) Eingaben in der Protokollzeile vorkommen können. Andernfalls machen Sie es anfällig für Eindringlinge (z. B. durch Manipulation der Leitung, er könnte eine Erkennung vermeiden oder sogar das Sperren einer anderen IP anstelle seiner echten IP erzwingen.

Wie implementiere ich es in Fail Regex? Ich habe in meinem vorherigen Kommentar eine funktionierende Regex für alle Zahlen bereitgestellt, ich möchte eine implementieren, die 114 in der Failregex selbst ignoriert. Danke für deine Zeit und Hilfe :)

Entschuldigung, keine Zeit für ATM, um Ihre Regex vollständig zu korrigieren. Und ich mache aus Prinzip keine schnellen und schmutzigen Lösungen.
Probieren Sie stackoverflow-ähnliche Seiten aus.

Hier sind Sie ja:

^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : \S+ from ip : <HOST> finished with status :  Failure\.\s+(?:[^.]+\.)* Return Code : (?!114)\d+\.

Aber ein etwas genauerer möglicher Filter sieht so aus:

[Definition]

# services (smtp,imap,etc,...):
_services = (?:\S+)

# all errors (not-precise):
#_errors = (?:[^.]+\.)*
# only expected errors (more precise), example:
#_errors = (?:unknown status|authenication error|something else)\.
_errors = (?:unknown status)\.

# return-codes (any excepting 114):
_ret_codes = (?!114)\d+

failregex = ^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : %(_services)s from ip : <HOST> finished with status :  Failure\.\s+%(_errors)s Return Code : %(_ret_codes)s\.

[Init]

datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]

Sie haben 3 zusätzliche Interpolationsvariablen (beginnend mit Unterstrich), um zu steuern, was genau verboten werden soll.
Sie können auch die erste (kommentierte) _errors -Ersetzung für alle möglichen Fehler verwenden, aber wie der Kommentar sagt - es ist nicht präzise ... und ich mag eine solche Lockerung nicht, ohne nach dem Format aller möglichen zu suchen Protokollnachrichtenformate dort.
Aber ich glaube, Sie können diese Liste wie im obigen Beispiel selbst erweitern.

Die failregex ist jetzt in der Lage, die Arbeit von ignoreregex in sich selbst zu erledigen !!
Ich verstehe, dass die Ignoreregex-Funktion dafür bereitgestellt wird, um die verfügbaren Funktionen zu verdeutlichen.
Das obige Beispiel hat deutlich gemacht, wie flexibel der Filter bei verschiedenen Szenarien sein kann.
Danke für deine Zeit und Hilfe.
Guten Tag Herr :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen