Owncloud Sicherheit durch fail2ban

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.

Owncloud Grey Logo

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.

30 Gedanken zu „Owncloud Sicherheit durch fail2ban“

    • Ja, Sorry.
      Richtig lautet es:

      [owncloud]
      
      enabled = true
      port = 80,443
      protocol = tcp
      filter = owncloud
      logpath = /var/log/syslog
      maxretry = 3

      Habe es eben verbessert

  1. 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

  2. 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?

        • 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_

  3. 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:

      Bitte oben schauen, denn da wurde dauernd etwas von dem tollen WordPress verschluckt, kein Wunder, dass es nicht ging. Siehe /etc/fail2ban/filter.d/owncloud.conf im Text

      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

  4. 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.

  5. 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

  6. 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

  7. 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>’\).+$

  8. 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+

  9. 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 =

  10. 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

Kommentare sind geschlossen.