ownCloud kann durch viele Maßnahmen geschützt werden.
Varianten des Schutzes werde auf jeden Fall nach und nach ein Thema in meinem Blog sein. Mit Fail2Ban möchte ich einen Anfang machen, da es im Gegensatz zu mod_security und anderen Hilfsmitteln zu 99% mittlerweile auf jedem Server zu der Grundinstallation und dem Grundschutz gehört.
Fail2ban
Fail2ban überwacht Logdateien und erkennt dort bösartige Angriffe und blockt die IPs nach bestimmten Kriterien.
Anhand von Filterlisten mit regulären Ausdrücken wird ein Fehlverhalten in den Logdateien erkannt und nach einem definierten Reglement in einer Datei eine Blockaktion gestartet.
Da dies kein Grundlagenartikel zu fail2ban ist, gehe ich davon aus, dass fail2ban konfiguriert ist und auch fehlerfrei läuft.
Fail2ban und ownCloud
Fail2Ban kennt leider ownCloud nicht undownCloud schreibt ab Werk auch keine Logdatei, welches beides für das Blocken von Wörterbuchattacken und das sperren der IPs nötig ist.
Somit ist es nötig einmal das Log in ownCloud einzuschalten, damit es Fail2Ban lesen und einmal Fail2Ban zu konfigurieren, damit es mit dem gelesenen Log auch arbeiten kann.
Konfiguration des Logs für ownCloud
Damit ownCloud ein Log schreibt ist es nötig die folgende Änderungen in die Datei <owncloud>/config/config.php vorzunehmen:
'logtimezone' => 'Europe/Zurich', 'log_type' => 'owncloud' , 'log_authfailip' => true,
Natürlich sollte der Wert logtimezone der eigenen Zeitzone entsprechen.
Mit dieser Konfiguration schreibt ownCloud seine Logdaten in die Datei <owncloud>/data/owncloud.log.
Erstellen der Filterdatei und Konfiguration in Fail2Ban
Erstellen der Datei /etc/fail2ban/filter.d/owncloud.conf mit folgenden Inhalt:
[Definition] failregex = {"app":"core","message":"Login failed:(.*) , wrong password, IP:","level":2,"time":".*"} {"app":"core","message":"Login failed: '.*' \(Remote IP: '', X-Forwarded-For: '.*'\)","level":2,"time":".*"} {"reqId":".*","remoteAddr":"","app":"core","message":"Login failed: .*","level":2,"time":".*"} ignoreregex =
Und in der Datei /etc/fail2ban/jail.conf folgendes hinzufügen:
[owncloud] enabled = true filter = owncloud logpath = <owncloud>/data/owncloud.log maxretry = 3
Erklärung
Die failregex kann man sehr leicht verstehen, wenn man sich eine fehlgeschlagenen Login in der Datei <owncloud>/data/owncloud.log einmal anschaut:
{"reqId":"Vmmkth-tFnau-glNeXG28QAAAAE","remoteAddr":"10.40.10.104","app":"core","message":"Login failed: 'test@test.ch' (Remote IP: '10.40.10.104')","level":2,"time":"2015-12-10T17:13:42+01:00"}
Der hinzugefügte Inhalt in die Datei /etc/fail2ban/jail.conf gibt an
- Das die Regel eingeschaltet ist
- Welcher Filter genutzt wird (unsere Datei /etc/fail2ban/filter.d/owncloud.conf )
- und in welchem Log nach diesem regulären Ausdruck Ausschau gehalten wird.
Neue Regeln für Fail2Ban testen
Welches natürlich nur geht, wenn man sich mal falsch anmeldet, sonst kann nichts gefunden werden.
root@w2k.test:/# fail2ban-regex /data/owncloud.log /etc/fail2ban/filter.d/owncloud.conf Running tests ============= Use failregex filter file : owncloud, basedir: /etc/fail2ban Use log file : <owncloud>/data/owncloud.log Use encoding : UTF-8 Results ======= Failregex: 1 total |- #) [# of hits] regular expression | 3) [1] {"reqId":".*","remoteAddr":"","app":"core","message":"Login failed: .*","level":2,"time":".*"} `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [3] Year-Month-Day[T ]24hour:Minute:Second(?:\.Microseconds)?(?:Zone offset)? `- Lines: 3 lines, 0 ignored, 1 matched, 2 missed [processed in 0.00 sec]
Die Regeln funktionieren. Der Service/Daemon Fail2ban kann neu gestartet werden:
root@w2k.test:/# systemctl restart fail2ban