Owncloud + Fail2Ban

Je me rends compte seulement aujourd’hui que Owncloud ne prévient pas des attaques de brute-force de façon native. Il semble cependant que les développeurs en soit conscient et proposeront un système de captcha à la prochaine release. En attendant je vous propose de mettre en place un patch maison pour faire fonctionner notre instance Owncloud avec Fail2Ban.

Création d’un fichier de log spécifique

Modification du code source pour qu’il log les erreurs de connexion. On édite /owncloud/lib/user/database.php.
En ligne 202, dans la fonction checkPassword, juste avant le « return false » on ajoute le code suivant

Cette modification concerne les erreurs de mot de passe pour les logins existant en base. Si l’on souhaite également loguer les erreurs pour tous les logins il faut ajouter le même code avant le dernier “return false” dans la partie « else » de la fonction. On modifie juste le commentaire.

Edit: Depuis la version 6 de Owncloud le fichier se trouve dans /var/www/owncloud/lib/private/user/database.php. Dans le if($row) se trouve 2 return false au lieu de un. Remplir les deux de la même façon. 

On passe à présent à la création de la prison Fail2ban dans /etc/fail2ban/filter.d/owncloud.conf

On test que la regex match bien. (Effectuez une erreur de login sur l’interface avant)

On ajoute cette prison à la conf dans /etc/fail2ban/jail.conf

Restart de fail2ban pour prendre en compte

Il faut quand même garder en tête que les lignes dans le php seront à réécrire à chaque mise à jour de Owncloud.

18 thoughts on “Owncloud + Fail2Ban”

  1. Vincent Gallissot dit :

    Hello,
    Très bon tuto !!
    J’ai du changer le répertoire chez moi, impossible d’écrire autre part que dans le documentroot.
    php-APC fait aussi que pour tester et débugger, j’ai du redémarrer 43fois Apache ^.^
    J’ai juste rajouté le nom d’utilisateur à ta ligne, ça mange pas de pain et ça fait un rendu comme sshd dans auth.log, je préfère 😉
    ->
    fputs($logAuth, date_format($today, ‘Y/m/d H:i:s’) .  » Bad Password for  » . $uid .  » from: \t » . $IPClient . « \n »);

    et ->
    fputs($logAuth, date_format($today, ‘Y/m/d H:i:s’) .  » Unknown user  » . $uid .  » from: \t » . $IPClient . « \n »);

    Effectivement, il faut garder en tête de remettre ce fichier à chaque upgrade Owncloud.
    Cheers !
    Vincent

  2. Markhor dit :

    Très bonne astuce 🙂

    Je n’avais pas vu le commentaire de Vincent mais j’ai fait de même pour avoir l’uid de l’utilisateur distrait ^^

    Merci

  3. arka dit :

    Bonjour et merci pour le tuto.
    Malheureusement, ça ne marche pas pour moi (owncloud 6.0.1):

    – Les tentatives de connexions avec mauvais login ne sont pas loguées (Peux-tu être plus précis concernant l’emplacement où ajouter le code php et combien de fois l’ajouter?).

    – La regex fonctionne mais fail2ban ne bannit pas les @IP associées aux erreurs de login.

    Une idée ? J’ai lu sur d’autres tutos qu’il fallait rajouter la variable ‘logtimezone’ => ‘Europe/Paris’ dans le fichier /var/www/owncloud/config/config.php afin de passer l’heure de UTC à l’heure de mon fuseau horaire pour résoudre le problème. Mais rien n’y fait…

    Merci pour ton aide.

    Arka

  4. arka dit :

    Re.
    OK, autant pour moi, j’avais rajouté un bantime et un findtime dans la jail owncloud de /etc/fail2ban/jail.conf et c’est ça qui bloquait le processus…!!

    Par contre, j’ai toujours le même problème pour la partie « loguer les erreurs pour tous les logins  » 😉

    Bien cordialement.

    1. Sispheor dit :

      Je n’ai pas encore update sur cette version. Je mettrais à jour le billet une fois que c’est fait. Normalement le code à ce niveau ne devrait pas avoir trop bougé.

    2. Sispheor dit :

      Cela fonctionne chez moi après le passage à la version 6.0.1. Il faut bien placer le bout de code avant le « return false ».

      1. arka dit :

        C’est réparé!! J’avais, malgré une première relecture du code, fais une petite erreur. Ça marche impec’ maintenant. Merci beaucoup. 😉

  5. micadam dit :

    Bonjour,

    Un bon tuto en français, ça rend toujours les chose plus facile 🙂

    J’ai toutefois un petit problème qui persiste.
    J,ai fait un copier coller de ton code, et la commande
    fail2ban-regex /var/log/owncloud-fail.log /etc/fail2ban/filter.d/owncloud.conf

    Fonctionne, j’ai 11 match(oui, j’ai fait 11 erreur pour tester 😛 )

    Donc, la règle fonctionne et il log bien les erreur.
    Toutefois, après avoir ajouter les autre ligne à jail.conf et restart fail2ban, le lock du compte de semble pas fonctionner. J’ai tenté de voir de trouver la réponse dans mes logs (/var/log/audit/audit.log et /var/log/messages) tutefois, aucune mention de fail2ban.
    Est-ce que tu saurais ou je pourrais regarder pour savoir pourquoi il ne ban pas l’IP?

    Merci.

    1. Sispheor dit :

      La règle iptables est elle ajoutée après le BAN? La prison est bien enabled dans la conf?

    2. Sispheor dit :

      Il faut parfois déclarer le port en « all » et non juste http et https au niveau de la jail.

  6. micadam dit :

    Salut,

    Je viens de retester, de retour de vacance, mais cette fois sous ubuntu 14.04 au lieu de centos. Et avec la version 7 de Owncloud.

    Tout fonctionne parfaitement 🙂

    Donc c’était soit centos, soir owncloud 6.

    Je vais retenter sous centos un jour, si je trouve la solution, je la posterai ici.

    Encore merci pour ton tuto.

  7. Oliver T. dit :

    Une solution plus simple, car owncloud sait logger dans syslog:
    http://forum.owncloud.org/viewtopic.php?f=26&t=18520&hilit=fail2ban+syslog

    1. Sispheor dit :

      Bien vu. C’est en effet une solution possible sans avoir à modifier le code. Merci.

  8. Oliver T. dit :

    Avec la version 7.x d’OC, j’ai du adapter l’expression reguliere du tuto (OC6.x) car il n’y a plus de « , » et il y a des « ‘ » autour de l’IP.
    « failregex = .*ownCloud.*Login failed:.*, IP:(?P\S*) »
    => j’ai mis quelquechose comme ça « failregex = ^.*ownCloud.*Login failed:.*IP: ..*$ »
    A+

  9. Oliver T. dit :

    Le disparait ??
    failregex = .*ownCloud.*Login failed:.*IP: …*$

  10. Oliver T. dit :

    Désolé, il est impossible d’écrire HOST avec les signes sup et inf dans les commentaires… Il a été avalé.

Répondre à Vincent Gallissot Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *