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
1
2
|
touch /var/log/owncloud–fail.log
chown www–data:www–data /var/log/owncloud–fail.log
|
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
1
2
3
4
5
6
|
$today = new DateTime();
date_timezone_set($today, timezone_open(‘Europe/Paris’));
$IPClient= $_SERVER[‘REMOTE_ADDR’];
$logAuth = fopen(‘/var/log/owncloud-fail.log’, ‘a+’);
fputs($logAuth, date_format($today, ‘Y/m/d H:i:s’) . » Password check failed for: t » . $IPClient . « n »);
fclose($logAuth);
|
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.
1
2
3
4
5
6
|
$today = new DateTime();
date_timezone_set($today, timezone_open(‘Europe/Paris’));
$IPClient= $_SERVER[‘REMOTE_ADDR’];
$logAuth = fopen(‘/var/log/owncloud-fail.log’, ‘a+’);
fputs($logAuth, date_format($today, ‘Y/m/d H:i:s’) . » Invalid username: t » . $IPClient . « n »);
fclose($logAuth);
|
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
1
2
3
|
# Owncloud jail
[Definition]
failregex = <HOST>$
|
On test que la regex match bien. (Effectuez une erreur de login sur l’interface avant)
1
|
fail2ban–regex /var/log/owncloud–fail.log /etc/fail2ban/filter.d/owncloud.conf
|
On ajoute cette prison à la conf dans /etc/fail2ban/jail.conf
1
2
3
4
5
6
|
[owncloud]
enabled = true
port = http,https
filter = owncloud
logpath = /var/log/owncloud–fail.log
maxretry = 3
|
Restart de fail2ban pour prendre en compte
1
|
/etc/init.d/fail2ban restart
|
Il faut quand même garder en tête que les lignes dans le php seront à réécrire à chaque mise à jour de Owncloud.