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.
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.
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'}
65.49.20.68 als IP bestimmen statt 34916
Port 34916 wird als ermittelte IP abgefangen
#### Zusätzliche Informationen
-
### Konfiguration, Dump und weitere hilfreiche Auszüge
-
[sshd]
aktiviert = wahr
Modus = aggressiv
port = ssh
logpath = %(sshd_log)s
Backend = %(sshd_backend)s
2020-06-06 04:17:09,123 fail2ban.ipdns [11148]: WARNING Determined IP using DNS Lookup: 34916 = {'0.0.136.100'}
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]
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.
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.
Hilfreichster Kommentar
OK danke!
Die Lösung ist einfach (
.+?
->.*?
):Ich werde auch den aktuellen sshd-Filter bald reparieren.