Fail2ban: sshd.conf leerer Benutzername in "Ungültiger Benutzer" regexp führt zu einer ipdns-Warnung

Erstellt am 6. Juni 2020  ·  5Kommentare  ·  Quelle: fail2ban/fail2ban

sshd-Logging mit leerem Benutzernamen führt dazu, dass die Regexp den Port anstelle der IP-Adresse abfängt und schließlich zu einer ipdns-Warnung führt.

Umfeld:

  • Fail2Ban-Version: 0.11.1 (fail2ban/focal 0.11.1-1 alle)
  • Betriebssystem: Ubuntu 20.04 LTS
  • [x] Fail2Ban über Betriebssystem-/Verteilungsmechanismen installiert
  • [x] Sie haben keine zusätzlichen fremden Patches auf die Codebasis angewendet
  • [ ] Einige Anpassungen wurden an der Konfiguration vorgenommen (Details unten sind so)
    (keine, außer jail.local config unten)

Die Angelegenheit:

sshd-Logging mit leerem Benutzernamen führt dazu, dass die Regexp den Port anstelle der IP-Adresse abfängt und schließlich zu einer ipdns-Warnung führt.

Schritte zum Reproduzieren

syslog-Beispielzeile:

Jun  6 04:17:04 myshot sshd[1189074]: Invalid user  from 65.49.20.68 port 34916
Jun  6 04:17:09 myshot sshd[1189074]: Connection closed by invalid user  65.49.20.68 port 34916 [preauth]

fail2ban Ergebnis:

2020-06-06 04:17:09,123 fail2ban.ipdns          [11148]: WARNING Determined IP using DNS Lookup: 34916 = {'0.0.136.100'}

Erwartetes Verhalten

65.49.20.68 als IP bestimmen statt 34916

Beobachtetes Verhalten

Port 34916 wird als ermittelte IP abgefangen

#### Zusätzliche Informationen
-

### Konfiguration, Dump und weitere hilfreiche Auszüge
-

Alle Anpassungen an /etc/fail2ban/ configuration

[sshd]
aktiviert = wahr
Modus = aggressiv
port = ssh
logpath = %(sshd_log)s
Backend = %(sshd_backend)s

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

2020-06-06 04:17:09,123 fail2ban.ipdns          [11148]: WARNING Determined IP using DNS Lookup: 34916 = {'0.0.136.100'}

Relevante Zeilen aus fraglichen überwachten Protokolldateien:

Jun  6 04:17:04 myshot sshd[1189074]: Invalid user  from 65.49.20.68 port 34916
Jun  6 04:17:09 myshot sshd[1189074]: Connection closed by invalid user  65.49.20.68 port 34916 [preauth]
3rd party issue moreinfo

Hilfreichster Kommentar

OK danke!
Die Lösung ist einfach ( .+? -> .*? ):

-__authng_user = (?: (?:invalid|authenticating) user <F-USER>\S+|.+?</F-USER>)?
+__authng_user = (?: (?:invalid|authenticating) user <F-USER>\S+|.*?</F-USER>)?

Ich werde auch den aktuellen sshd-Filter bald reparieren.

Alle 5 Kommentare

Ich habe hier etwas nicht verfolgt - ein solches RE-Matching von Invalid user am Anfang der Log-Zeile nach dem Präfix existiert nicht in unserem sshd-Filter.
Die Beispielzeile wird also von unserem Standardfilter überhaupt nicht gefunden. PoC:

$ fail2ban-regex -rvv 'Jun 6 04:17:04 myshot sshd[1189074]: Invalid user from 65.49.20.68 port 34916' 'sshd[mode=aggressive]'
...
Lines: 1 lines, 0 ignored, 0 matched, 1 missed
|- Missed line(s):
|  Jun 6 04:17:04 myshot sshd[1189074]: Invalid user from 65.49.20.68 port 34916
`-

Wenn dies durch diese Zeile verursacht wird, sollten Sie die entsprechende Regexp angeben.
Und wenn es Ihr eigenes RE ist, müssen Sie es reparieren (präzisieren Sie es, mit Ankern und keinen Auffangelementen, verwenden Sie <ADDR> anstelle von <HOST> .
Wenn es sich eher um eine andere Zeile handelt - können Sie den gesamten Protokollauszug bereitstellen (alle Nachrichten für sshd[1189074] )?

Als Zwischenlösung (da ich noch nie gesehen habe, dass sshd einen Hostnamen normal loggt), können Sie dies mit usedns = no deaktivieren, was schaltet (dadurch wird der Filter zusätzlich etwas schneller).
Aber besser wäre es, die Regex zu reparieren.

Die Übereinstimmung stammt aus der angehängten filter.d sshd.conf, die mit dem Ubuntu 20 fail2ban-Paket im Original geliefert wird und überhaupt nicht modifiziert wurde. Ich weiß nicht genau, welche der Zeilen damit übereinstimmen, aber dies ist die Datei, auf die sich die Übereinstimmung bezieht.

Was ich sehen kann - irgendwie hat github "Benutzer von" mit zwei Leerzeichen gemacht, um als "Benutzer von" mit nur einem Leerzeichen im ursprünglichen Beitrag oben angezeigt zu werden.

Aus diesem Grund stimmt die Regex nicht überein, ein Auszug des Originalkommentars und Zeilen mit richtigen Leerzeichen werden angehängt.

sshd.conf.txt
lines_with_blanks.txt

Die Übereinstimmung stammt aus der angehängten filter.d sshd.conf, die mit dem Ubuntu 20 fail2ban-Paket im Original geliefert wird und überhaupt nicht modifiziert wurde.

Du hast Recht (das habe ich leider übersehen):

^[iI](?:llegal|nvalid) user <F-USER>.*?</F-USER> from <HOST>%(__suff)s$

Was ich sehen kann - irgendwie hat github "Benutzer von" mit zwei Leerzeichen gemacht, um als "Benutzer von" mit nur einem Leerzeichen im ursprünglichen Beitrag oben angezeigt zu werden.

Sie müssen die Markdown-Formatierung verwenden, um die Protokolle einzuschließen (ich habe das ursprüngliche Problem geändert).

Und jetzt findet es die Übereinstimmung, aber es funktioniert wie erwartet:

$ fail2ban-regex -rvv 'Jun  6 04:17:04 myshot sshd[1189074]: Invalid user  from 65.49.20.68 port 34916' 'sshd[mode=aggressive]'

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

Use   failregex filter file : sshd, basedir: /etc/fail2ban/
Use   filter options : {'mode': 'aggressive'}
Real  filter options : {'logtype': 'file', 'mode': 'aggressive', 'datepattern': '{^LN-BEG}'}
Use         maxlines : 1
Use      datepattern : Default Detectors
Use      single line : Jun  6 04:17:04 myshot sshd[1189074]: Invalid user...


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
...
|   6) [1] ^[iI](?:llegal|nvalid) user <F-USER>.*?</F-USER> from <HOST>(?: (?:port \d+|on \S+|\[preauth\])){0,3}\s*$
|      65.49.20.68  Sat Jun 06 04:17:04 2020
...
`-
...
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

$ fail2ban-regex -o row 'Jun  6 04:17:04 myshot sshd[1189074]: Invalid user  from 65.49.20.68 port 34916' 'sshd[mode=aggressive]'
['65.49.20.68', 1591409824.0,   {'user': '', 'ip6': None, 'mlfid': ' myshot sshd[1189074]: ', 'dns': None, 'ip4': '65.49.20.68'}],

Beachten Sie, dass diese Regex von links und rechts verankert ist, sodass es egal ist, was der Teil des Benutzers ist, bevor from genau ist und das nicht gierige Catch-All hier leer passen würde.
Und ich sehe im ganzen RE nicht, was genau dazu führen kann, dass 34916 als DNS abgeglichen werden kann:

^[iI](?:llegal|nvalid) user (?P<user>.*?) from (?:\[?(?:(?:::f{4,6}:)?(?P<ip4>(?:\d{1,3}\.){3}\d{1,3})|(?P<ip6>(?:[0-9a-fA-F]{1,4}::?|::){1,7}(?:[0-9a-fA-F]{1,4}|(?<=:):)))\]?|(?P<dns>[\w\-.^_]*\w))(?: (?:port \d+|on \S+|\[preauth\])){0,3}\s*$

Ich vermute immer noch, dass es die andere Protokollzeile ist, also wiederhole ich - bitte geben Sie "ganzen Protokollauszug (alle Nachrichten für sshd[1189074])" an. Oder sogar mit 34916 (oder einem Zeitstempel) grep.
Oder versuchen Sie es mit fail2ban-regex wie oben beschrieben, es sei denn, Sie sehen eine DNS-Übereinstimmung, zum Beispiel:

fail2ban-regex -o row systemd-journal 'sshd[mode=aggressive]' | grep "'dns': '"

* systemd-journal durch den Namen der Protokolldatei ersetzen (sofern es sich auch um ein Protokoll handelt).

Stellen Sie außerdem sicher, dass der Filter einen wirklich unveränderten Status hat (keine lokalen), geben Sie die Ausgabe von fail2ban-client -d | grep sshd .

Vielen Dank für den Formatierungshinweis - angehängt sind die grep'ed Zeilen aus den beiden Logs (auth.log und fail2ban.log)

auth.log.grepped.txt
fail2ban.log.grepped.txt

fail2ban-regex -o row auth.log.grepped.txt 'sshd[mode=aggressive]' | grep "'dns': '"
gibt
['0.0.136.100', 1591409829.0, {'mlfid': ' myshot sshd[1189074]: ', 'user': ' 65.49.20.68 port', 'ip4': None, 'ip6': None, 'dns': '34916', 'users': {' 65.49.20.68 port'}, 'mlfforget': 'Connection closed'}],

Also ja, du hast recht, die "geschlossene" Leitung löst dies aus, ich habe es falsch erraten. Erster Beitrag entsprechend bearbeitet.

OK danke!
Die Lösung ist einfach ( .+? -> .*? ):

-__authng_user = (?: (?:invalid|authenticating) user <F-USER>\S+|.+?</F-USER>)?
+__authng_user = (?: (?:invalid|authenticating) user <F-USER>\S+|.*?</F-USER>)?

Ich werde auch den aktuellen sshd-Filter bald reparieren.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen