Ändern Sie fail2ban failregex so, dass es mit fehlgeschlagenen öffentlichen Schlüsselauthentifizierungen über ssh übereinstimmt


12

fail2banerkennt fehlgeschlagene SSH-Anmeldungen mit öffentlichem Schlüssel nicht und ich gehe davon aus, dass dies gelöst werden kann, indem das failregexvon so geändert wird, dass es /etc/fail2ban/filter.d/sshd.configmit der folgenden Zeile übereinstimmt:

<date> <time> <server-hostname> sshd[25917]: Connection closed by <client-ip> [preauth]

Aber ich kann keine anständige Einführung finden, wie man diesen Failregex richtig modifiziert. Da ich nicht wirklich weiß, welche Variablen ^%(__prefix_line)senthalten, ist es schwierig, einen funktionierenden regulären Ausdruck zu erhalten.

Ich verstehe, dass die neueste Version 0.9.1 den regulären Ausdruck enthält, um die Zeile "Verbindung durch [preauth] geschlossen" abzugleichen, aber ich verwende fai2ban aus dem Debian-Repository und die Konfiguration von 0.9.1 ist nicht mit der von I kompatibel haben.

Antworten:


10

Diese Zeile macht es:

^%(__prefix_line)sConnection closed by <HOST> \[preauth\]$

Getestet mit folgendem Logstring:

Apr 29 12:30:12 sendai sshd[25917]: Connection closed by 127.0.0.1 [preauth]

Erfolgreich getestet mit:

$ fail2ban-regex ~/ssh.log sshd.conf 

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

Use regex file : sshd.conf
Use log file   : /home/user/ssh.log


Results
=======

Failregex
|- Regular expressions:
[...]
|  [12] ^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*Connection closed by <HOST> \[preauth\]$
|
`- Number of matches:
[...]
   [12] 1 match(es)

Summary
=======

Addresses found:
[...]
[12]
    127.0.0.1 (Wed Apr 29 12:30:12 2015)
[..]

Success, the total number of match is 1

Ich ging davon aus, dass sich fail2ban /var/log/fail2ban.logbei Spielen anmelden würde , aber dies geschah nicht, nur wenn es gesperrt wurde, wurde es schließlich protokolliert. Vielen Dank für die Hilfe!
Apoc

Ich verwende 0.9.3 und der nächstgelegene Filter, den ich für mehrzeilige Filter verwenden konnte: fail2ban # 227f27c . Es stimmt nicht mit Ihrem Logstring (oder meinem) überein, sondern mit MaxAuthTries=Nin /etc/ssh/sshd_config. Wissen Sie, ob so etwas wie Ihre Regex absichtlich vom Standardfilter weggelassen wurde? Vielen Dank!
Timss

6

Zumindest in openssh 7.3 enthalten die Protokollnachrichten auch eine Portnummer. Also musste ich die Lösung von sebix wie folgt ändern:

^%(__prefix_line)sConnection closed by <HOST> port \d+ \[preauth\]$

5

Es ist kein Regex-Hacking erforderlich (zumindest seit fail2ban 0.10.4). In /etc/fail2ban/jail.confist die folgende Information:

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal

Befolgen Sie daher die Empfehlungen, indem Sie /etc/fail2ban/jail.localmit Ihren anderen Anpassungen zusammen mit einem der strengeren Modi erstellen, z.

[sshd]
mode   = aggressive

Dieser Modus deckt jetzt fehlerhafte öffentliche Schlüssel ab.


1
Dies ist die richtige Antwort, außer dass der Fehler Connection closed ... [preauth]bei fehlgeschlagenen öffentlichen Schlüsseln im Grunde nichts hat (Sie würden Failed publickey ...stattdessen erhalten). Weitere fehlgeschlagene Nachrichten finden Sie unter github.com/fail2ban/fail2ban/blob/… . Verbindung geschlossen bedeutet nur, dass die Verbindung in der Vorbereitungsphase geschlossen wurde (der Benutzer wird also aus irgendeinem Grund nicht authentifiziert).
sebres

@sebres mein System tatsächlich funktioniert zeigt die Connection closed…Meldung für „Fehler beim Verbinden mit einem gültigen Benutzernamen aber falschen öffentlichen Schlüssel“, die das ist letzte Zeile Sie verknüpft.
Sparhawk

Sicher tut es das. Sowie nach jedem anderen Fehler in der Preauth-Phase (z. B. wenn Sie eine nicht unterstützte / deaktivierte Authentifizierungsmethode versuchen oder wenn sie ohne Authentifizierung vollständig geschlossen wurde). Wie bereits erwähnt, enthält die Nachricht überhaupt nichts mit falschen öffentlichen Schlüsseln. Sie signalisiert lediglich, dass die Verbindung geschlossen wurde, bevor der Authentifizierungsprozess abgeschlossen ist.
sebres

@sebres Ah okay, verstanden. Bei Ihrem zweiten Punkt verstehe ich mich jedoch nicht so. Wenn ich mit dem falschen öffentlichen Schlüssel versage, erhalte ich nicht die Failed publickey…Nachricht, sondern nur die Connection closed…eine.
Sparhawk

Klar, da mehrere Nachrichten nur auf VERBOSE-Ebene protokolliert werden, siehe serverfault.com/a/477424/488604
sebres

3

Unter Ubuntu 18.04 mit OpenSSH 7.6p1 musste ich die " cmnfailre " -Regeln in /etc/fail2ban/filter.d/sshd.conf um erweitern

^%(__prefix_line)sConnection closed by authenticating user <F-USER>.+</F-USER> <HOST> port \d+ \[preauth\]$

um SSH-Anmeldeversuche ohne korrekten SSH-Schlüssel abzugleichen:

Apr 14 15:27:15 ubuntu-server sshd[8719]: Connection closed by authenticating user root x.x.x.x port 42664 [preauth]
Apr 14 15:27:15 ubuntu-server sshd[8721]: Connection closed by authenticating user root x.x.x.x port 42666 [preauth]
Apr 14 15:27:16 ubuntu-server sshd[8723]: Connection closed by authenticating user root x.x.x.x port 42668 [preauth]
Apr 14 15:27:16 ubuntu-server sshd[8725]: Connection closed by authenticating user root x.x.x.x port 42670 [preauth]
Apr 14 15:27:17 ubuntu-server sshd[8727]: Connection closed by authenticating user root x.x.x.x port 42672 [preauth]

Dies funktionierte auch für mein Ubuntu 18.04, danke! Gibt es eine Möglichkeit, die Standardeinstellung sshd.confnur mit dieser Zeile zu erweitern , oder gibt es die einzige Möglichkeit, das Ganze zu kopieren .localund dort hinzuzufügen?
Chrisan

1
@chrisan Sie können eine Datei erstellen , /etc/fail2ban/filter.d/sshd.localwie diese `[Definition] failregex =% (bekannt / failregex) s% (__ prefix_line) sConnection geschlossen durch Authentifizierung Benutzer <F-USER> + </ F-USER> <host> Port \:. d + [preauth] $ `
Arnel A. Borja

@ ArnelA.Borja und das wird zur Basis hinzufügen, .confnicht überschreiben? Das war mein Hauptanliegen. Ich habe das .localursprünglich erstellt, aber nur die gesamte Konfiguration kopiert und den neuen Filter hinzugefügt
chrisan

1
@chrisan Ja, es wird es nicht überschreiben, es wird nur einen neuen Wert hinzufügen failregex, aufgrund von %(known/failregex)s. Sie können dies bestätigen, indem Sie sudo fail2ban-regex -v /var/log/auth.log /etc/fail2ban/filter.d/sshd.confvor und nach dem Hinzufügen der genannten Datei ausführen. Die Anzahl der Failregex-Einträge erhöht sich um 1.
Arnel A. Borja

1

Für mich funktioniert dies besser, da ich Tonnen von legitimen Protokolleinträgen erhalte, die mit dem regulären Ausdruck "Verbindung geschlossen" übereinstimmen, zumindest in OpenSSH 6.6.1-Varianten. Glauben Sie, dass es auch das neue OpenSSH-Protokollformat abdeckt, das "Port" enthält:

^%(__prefix_line)sDid not receive identification string from <HOST>\s*$
^%(__prefix_line)sReceived disconnect from <HOST>: (port \d*: ){,1}11: (Bye Bye){,1} \[preauth\]\s*$

$ cat /etc/*relea* | grep -i desc
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

$ fail2ban-regex /var/log/auth.log filter.d/sshd.conf

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

Use   failregex file : filter.d/sshd.conf
Use         log file : /var/log/auth.log


Results
=======

Failregex: 39 total
|-  #) [# of hits] regular expression
|  12) [16] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*Did not receive identification string from <HOST>\s*$
|  13) [23] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*Received disconnect from <HOST>: (port \d*: ){,1}11: (Bye Bye){,1} \[preauth\]\s*$
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [62412] MONTH Day Hour:Minute:Second
`-

Lines: 62412 lines, 0 ignored, 39 matched, 62373 missed
Missed line(s):: too many to print.  Use --print-all-missed to print all 62373 lines

$ grep "Did not receive identification string from" /var/log/auth.log | wc -l
16
$ grep "Received disconnect from" /var/log/auth.log | grep -v x.x.x.x | wc -l
23
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.