PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fail2ban und lighttp



honkstar
26.03.08, 09:08
Hallo zusammen,

ich habe ein kleines Problem bei der Zusammenarbeit von fail2ban mit lighttp.
Ich möchte einige Seiten von meinem vserver schützen.
Die Seiten werden von einer .htpasswd-Datei geschützt, was auch funktioniert.
Dafür habe ich bei lighttp in der conf-Datei folgendes drinstehen:


auth.backend = "htpasswd"
auth.backend.htpasswd.userfile ="/etc/lighttpd/htpasswd.userfile"
auth.require = ( "/server-config" =>
(
"method" => "basic",
"realm" => "Server-Config",
"require"=> "user=user1"
),
"/server-status" =>
(
"method" => "basic",
"realm" => "Server-Info",
"require" => "user=user1"
),
)

Wenn man sich dann falsch anmeldet, finde ich in der Logdatei error.log vom lighttpd folgendes:

2008-03-25 14:43:46: (http_auth.c.853) get_password failed


Jetzt versuche ich halt, per fail2ban darauf zu achten, wenn dieses geschrieben wird und dann fail2ban seine Arbeit machen zu lassen.
Dafür habe ich mir bei fail2ban einen Eintrag in der jail.local gemacht:



[lighttp]

enabled = true
port = 8081
filter = lighttpd
logpath = /var/log/lighttpd/error.log
maxretry = 5


und entsprechend in der filter.d/lighttpd folgendes als failregex:

failregex = .*get_password failed


Wenn ich jetzt fail2ban-client start ausführe und mich dann ein paar Mal falsch am lighttpd anmelde, sehe ich ... nix.
Keine Einträge in der /var/log/fail2ban.log, aber in der error.log stehen die Versuche drin.

Ich vermute ja, dass es an dem falschen Regex liegt, aber besser kriege ich ihn nicht hin. Und ein regex-Tester gibt eigentlich das richtige aus.

Vielleicht hat ja jemand die Konfiguration am Laufen und kann mir nen Schubser in die richtige Richtung geben.

Besten Dank schonmal

McPan
20.12.08, 12:24
Besser 'ne späte Antwort, als gar keine.

Das scheitert daran, das lighttpd in diesem Fall die Remote-IP nicht mit in das Log schreibt. Woher soll fail2ban die zu sperrende IP nehmen? Das geht auch aus dem fail2ban-logfile hervor.


2008-12-20 08:41:09,952 fail2ban.filter : ERROR No 'host' group in 'get_password failed $'

Abhilfe: eine kleine Änderung im lighttpd-Quelltext damit in diesem Fall die Remote-IP mit in das error.log File geschrieben wird. Für die aktuelle Version 1.4.20 wäre das das File "lighttpd-1.4.20/src/http_auth.c", Zeile 876. Diese ändern in:

log_error_write(srv, __FILE__, __LINE__, "sss", "get_password failed", ", IP:", inet_ntop_cache_get_ip(srv, &(con->dst_addr)));

Der Text im Logfile liest sich dann so:


2008-12-20 10:55:29: (http_auth.c.876) get_password failed , IP: nnn.nnn.nnn.nnn

Der entsprechende RegEx-Eintrag für fail2ban sollte dann lauten:


failregex = get_password failed , IP: <HOST> $
password doesn't match for .* , IP: <HOST> $


Diese o.g. beiden Ausdrücke decken dann auch die folgende Fehlermeldung vom lighttpd mit ab, da im error.log unterschieden wird, ob falscher Benutzername oder ein korrekter Benutzername mit falschem Passwort verwendet wird.

2008-12-20 10:55:22: (http_auth.c.884) password doesn't match for / user , IP: nnn.nnn.nnn.nnn

bla!zilla
21.12.08, 10:31
Vielen Dank für diese Antwort. :) Immer wieder schön, wenn Leute zu alten Threads etwas sinnvolles beitragen.