Mit selbst erstellten Filtern in Fail2ban und deren regulären Ausdrücken lässt sich einiges an Sicherheit im kleinen einfachen, aber dennoch erfolgreichen Rahmen grundlegend für Owncloud definieren.
Erster Teil der Reihe Owncloud Sicherheit
[UPDATE]
Regeln für Owncloud 8 am Ende des Artikels
Internetgrundrauschen
Angriffe mit sanfter oder auch roher Gewalt gehören zu dem Internetgrundrauschen, welches uns wie das bekannte „White Noise“ umgibt.
Portscans, Wörterbuchattacken und das Austesten von Lücken im Programmcode sind Heute mehr als unisono. Damals noch irgendwie verständlich, dem Spieltrieb geschuldet. Aber Heute geht es nicht mehr um das Testen von Fähigkeiten, dem heimlichen aufsetzen eines BBS oder dem verteilen von GreenCDs.
Botnetze, Spamdistribution und Konsorten brauchen Plattformen. Das denunzieren durch das Ablegen falscher Daten mit darauf folgender Anzeige ist nicht mehr nur im Schlapphutrepertoire zu finden. Leider wird der Gehörnte hier nicht von mir aus Prestigegründen an die Wand gemalt, das ist mittlerweile auch fast dem Otto Normalbenutzer klar.
Meiner Meinung nach gehört jedem dieser Angreifer die Leviten gelesen. Nicht nur das Verschwenden der Zeit des Serverbetreibers, auch das unnütze Vernichten von Ressourcen ist nicht gerade die feine Art. Teilweise artet das private Dasein im Netz dadurch in Stress aus.
Natürlich betrifft dies leider auch die eigene Owncloudinstanz auf dem Server, wie man immer wieder den Logs seines Webservers entnehmen kann.
Owncloud Sicherheit durch fail2ban
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
Failb2an kennt leider Owncloud nicht und Owncloud 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 $OWNCLOUDORDNER/config/config.php vorzunehmen:
'logtimezone' => 'Europe/Berlin', 'log_type' => 'syslog' , 'log_authfailip' => true,
Natürlich sollte der Wert logtimezone der eigenen Zeitzone entsprechen.
Mit dieser Konfiguration schreibt Owncloud seine Logdaten in die Datei /var/log/syslog.
Wenn das nicht gewünscht ist, kann in der Datei auch folgende Änderung vorgenommen werden:
'logtimezone' => 'Europe/Berlin', 'log_type' => 'owncloud' , 'log_authfailip' => true,
Hier werden die Logs in die Datei /var/www/$OWNCLOUDORDNER/data/owncloud.log geschrieben, welches sich später auf jeden Fall in der Konfiguration von Fail2ban wiederspiegeln sollte und muss.
Erstellen der Filterdatei und Konfiguration in Fail2ban
Erstellen der Datei /etc/fail2ban/filter.d/owncloud.conf mit folgenden Inhalt:
[Definition] failregex = .*ownCloud.*Login failed:.*, IP:(?P<host>S*) ignoreregex =
Und in der Datei /etc/fail2ban/jail.conf folgendes hinzufügen:
[owncloud] enabled = true port = 80,443 protocol = tcp filter = owncloud maxretry = 3 logpath = /var/log/syslog
Erklärung
Die failregex kann man sehr leicht verstehen, wenn man sich eine fehlgeschlagenen Login in der Datei /var/log/syslog einmal anschaut:
Mar 19 21:23:01 got-tty ownCloud[25127]: {core} Login failed: user 'brutalbruteforce' , wrong password, IP:37.45.32.0
Der hinzugefügte Inhalt in die Datei /etc/fail2ban/jail.conf gibt an
- Das die Regel eingeschaltet ist
- Welcher Ports genutzt werden
- Das benutze Protkoll
- 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@got-tty:/# fail2ban-regex /var/log/syslog /etc/fail2ban/filter.d/owncloud.conf Running tests ============= Use regex file : /etc/fail2ban/filter.d/owncloud.conf Use log file : /var/log/syslog Results ======= Failregex |- Regular expressions: | [1] .*ownCloud.*Login failed:.*, IP:(?PS*) | `- Number of matches: [1] 4 match(es) Ignoreregex |- Regular expressions: | `- Number of matches: Summary ======= Addresses found: [1] 37.45.32.0 (Wed Mar 19 21:20:13 2014) 37.45.32.0 (Wed Mar 19 21:20:40 2014) 37.45.32.0 (Wed Mar 19 21:21:54 2014) 37.45.32.0 (Wed Mar 19 21:23:01 2014) Date template hits: 239 hit(s): MONTH Day Hour:Minute:Second 0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year 0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second 0 hit(s): Year/Month/Day Hour:Minute:Second 0 hit(s): Day/Month/Year Hour:Minute:Second 0 hit(s): Day/Month/Year Hour:Minute:Second 0 hit(s): Day/MONTH/Year:Hour:Minute:Second 0 hit(s): Month/Day/Year:Hour:Minute:Second 0 hit(s): Year-Month-Day Hour:Minute:Second 0 hit(s): Year.Month.Day Hour:Minute:Second 0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond] 0 hit(s): Day-Month-Year Hour:Minute:Second 0 hit(s): TAI64N 0 hit(s): Epoch 0 hit(s): ISO 8601 0 hit(s): Hour:Minute:Second 0 hit(s): Success, the total number of match is 4 However, look at the above section 'Running tests' which could contain important information.
Die Regeln funktionieren. Der Service/Daemon Fail2ban kann neu gestartet werden:
root@got-tty:/# service fail2ban restart
Update
Um Kopierfehler für die beiden Dateien zu vermeiden, habe ich nun ein Gist auf Github erstellt.
Owncloud Sicherheit durch fail2ban Gist
Fazit
Fail2ban ist immer auf einem meiner Server zu finden. Mit selbst erstellten Filtern und deren regulären Ausdrücken lässt sich einiges an Sicherheit im kleinen einfachen, aber dennoch erfolgreichen Rahmen grundlegend definieren.
Fail2ban ist ein Glied in meiner Sicherheitskette für Owncloud und bietet schon einmal eine Hürde für den Angreifer.
Danke für den guten Beitrag!
Danke für Dein Kommentar walter
Muss in der Sektion [owncloud] auch noch ein maxretry rein?
Ja, Sorry.
Richtig lautet es:
Habe es eben verbessert
Success, the total number of match is 12
Leider kann ich unendlich oft weiter versuchen ein falsches Kennwort ein zu geben.
Warum wird meine IP dann nicht kurzfristig gesperrt?
Gruß Walter
Bei mir hat die regel nicht funktioniert. Folgender Fehler ist aufgetreten:
ERROR Unable to compile regular expression '.*ownCloud.*Login failed:.*, IP:(?PS*)'
Ich hab die Zeile durch folgende ersetzt, und jetzt funktioniert es:
.*ownCloud.*Login failed:.*, IP:
Komisch, bei mir hat ja der Test funktioniert.
Du setzt aber die jetzige Communityversion von Owncloud ein, oder?
Ja, nicht die kommerzielle.
Siehe kommentare, es wurde der HOST verschluckt von WordPress, somit geht es nun.
Ab jetzt nur noch die Dateien auf Github und von dort aus einbinden. _stinkesauer_
ja, erst vor kurzem installiert. Das Problem war ja nicht owncloud, sondern dass die reguläre expression nicht ausgewertet werden konnte.
Das Kommentar-system hat mir leider den wichtigsten teil meiner änderung gelöscht. Ich hoffe jetzt funktioniert es (spitze klammern auf, dann HOST und dann wieder spitze klammern zu):
failregex = .*ownCloud.*Login failed:.*, IP:<HOST>
Das meine ich ja :)
Wie Du oben im Test siehst
root@got-tty:/# fail2ban-regex /var/log/syslog /etc/fail2ban/filter.d/owncloud.conf
Ist es ja bei mir aufgeschlagen, aus dem Grund bin ich verwundert, inkl Adressen natürlich.
Aber ich werde nun Deine mit Host einsetzen und mal schauen wie es sich dann verhätl
Bitte nutze doch mal:
So steht es nämlich in meiner Datei und ich frage mich gerade warum es in der Anleitung anders steht..
Also eben nochmal probiert:
Chain fail2ban-owncloud (1 references)
target prot opt source destination
DROP all -- HSI-KBW-MEINEIP.hsi5.kabel-badenwuerttemberg.de anywhere
RETURN all -- anywhere anywhere
geblockt
Der folgende oben genannte regex funktioniert:
failregex = .*ownCloud.*Login failed:.*, IP:
Oben im Artikel ist regex doppelt.
Danke Dir.
Aber Deine wird auch nicht richtig von WordPress aufgenommen.
Ich habe sie oben verbessert.
Ein Kreuz mit der Regex unter WordPress die treibt mich noch in den Wahnsinn.
Danke für die tolle Anleitung. Bin zunächst gescheitert, weil (copy and paste) sich in meiner owncloud.conf dieser Fehler: failregex = .*ownCloud.*Login failed:.*, IP:(?PS*) eingeschlichen hat ;-(
Nachdem daraus ein von Dir beschriebenes failregex = .*ownCloud.*Login failed:.*, IP: wurde, läuft alles bestens ;-)
Dachte für das nette Feedback.
Es kommt noch mehr in der Richtung, leider bin ich im Moment zeitlich gebunden und muss erst einmal wieder freiraum schaffen.
Somit, es geht circa übernächste Woche weiter
Hallo! Erstmal vielen Dank für die tolle Anleitung. Ich freue mich schon auf weitere Sicherheitstipps zu ownCloud.
Allerdings scheint die Regel bei mir noch nicht richtig zu greifen. Ich habe die Einrichtung Schritt für Schritt befolgt, bekomme jedoch bei dem Test folgende Fehler angezeigt:
Running tests
=============
Use regex file : /etc/fail2ban/filter.d/owncloud.conf
Use log file : /var/log/syslog
No 'host' group in '.*ownCloud.*Login failed:.*, IP:'
Cannot remove regular expression. Index 0 is not valid
Traceback (most recent call last):
File "/usr/bin/fail2ban-regex", line 354, in
fail2banRegex.testRegex(line)
File "/usr/bin/fail2ban-regex", line 232, in testRegex
self.__filter.addFailRegex(regex.getFailRegex())
File "/usr/share/fail2ban/server/filter.py", line 90, in addFailRegex
raise e
server.failregex.RegexException: No 'host' group in '.*ownCloud.*Login failed:.*, IP:'
Ich habe auch die unterschiedlichen Variationen zu der owncloud.conf in den Kommentaren getestet.
Vielen Dank schonmal für eure Hilfe!
Vergleiche Deine Daten doch bitte einmal mit dem Gist, welches ich nun erstellt habe.
Da fehlt wie es schon die Fehlermeldung sagt der Hostanteil
Grüsse
Hallo Chris,
damit hat das alles einwandfrei funktioniert!
Vielen Dank für die Rückmeldung und nochmals danke für das Tutorial. Ich freue mich auf weitere Sicherheitstipps zu owncloud!
Liebe Grüße
Vielen Dank für die tolle Anleitung!
Sehr hilfreich, Danke!!
Gern geschehen.
Feedback freut mich immer
Vielen Dank für das Tutorial!
Meine aktuelle Owncloud-Installation schreibt allerdings folgende Art von Einträgen ins log, auf die die regular expression offenbar nicht passt:
{„reqId“:“5825614cecafc349b478472ccce995c8″,“remoteAddr“:“xxx.xxx.xxx.xxx“,“app“:“core“,
„message“:“Login failed: ‚testlogin‘ (Remote IP: ‚xxx.xxx.xxx.xxx‘, X-Forwarded-For: “)“,“level“:2,“time“:“2015-03-09T08:06:03+00:00″}
Was kann man da machen?
Da du vermutlich nicht in die syslog reinschreibst, sondern in die owncloud.log sollte diese Regex passen:
^.+“Login failed.+Remote IP: “.+$
So, jetzt wird es hoffentlich auch richtig angezeigt:
^.+Login failed: ‚.+\(Remote IP: ‚<HOST>’\).+$
Bei meiner owncloud Installation der Version 8.0.2 hat die Logzeile folgendes, etwas vom Beispiel abweichendes, Format:
Jan 01 12:34:56 laleluhost ownCloud[12345]: {core} Login failed: ‘admin’ (Remote IP: ‘192.168.1.123’, X-Forwarded-For: ”)
Ich fange das mit folgender fail2ban-Regel ab:
failregex = .*ownCloud\[\d{1,5}\]: \{core\}.*Login failed: ‘\w+’ \(Remote IP: “\S+
Das könnte für Version 8.0.2 hinkommen.
Danke Dir Bob
Funktioniert bei mir in Owncloud 8.1 super :)
ownCloud[3861]: {core} Login failed: ‚admi‘ (Remote IP: ‚93.96.188.74)
[Definition]
failregex = .*ownCloud\[\d{1,5}\]: \{core\}.?Login.?failed:.*[(]Remote.?IP:.?'[)]
ignoreregex =
Hallo,
habe dein Tutorial befolgt und dabei meine owncloud 8.2.2 abgeschossen. Ein Wiederherstellen ist mir leider auch nicht mehr möglich.
Hättest du einen Lösungsvorschlag?
lG. Franz
Der ganze Beitrag bezog sich ja mal auf Owncloud 6.
Hast den Link im Beitrag gesehen, welcher auf Owncloud 8 hinweist?
Und hast Du auch die Fehlermeldungen im Syslog beachtet.
Und in meinem Tutorial geht es nur um fail2ban, wenn man dies löschen würde, dann würde auch Owncloud wieder gehen, natürlich nachdem man die eigene IP in iptables wieder erlaubt hat.
Sprich ich lösche den erstellten Eintrag aus /etc/fail2ban/jail.conf und starte fail2ban neu und entferne Deine IP, falls sie geblockt wurde:
Regelname finden mit wlecher Deine IP geblockt wurde:
iptables -L -n
Jailname herausfinden falls sie nicht gleich sind:
fail2ban-client status
IP aus den Regeln entfernen:
fail2ban-client set NAMEDERJAIL unbanip DEINEIPADRESSE
Wie Du an meinem Artikel sehen kannst, sowie an dem Beitrag, wird an Owncloud selbst nichts geändert.
Schönes WE Franz