Fail2ban lit les logs de divers serveurs (SSH, Apache, FTP, lighttpd…) à la recherche d'erreurs d'authentification répétées et ajoute une règle iptables pour bannir l'adresse IP de la source. Le but de fail2ban est d'empêcher une attaque qui, par force brute, trouve un identifiant/mot de passe permettant l'accès à un service. Les postes serveurs ne dormant jamais, ils sont la cible d'attaques automatiques en provenance de partout. Et sans un tel outil, qui sanctionne les tentatives, plus un serveur est rapide à répondre, plus il est menacé!!!
Pour tous ceux d'entre vous qui donnent un accès extérieur à Nas4free (serveur, owncloud, site web, ssh...), alors ce tuto est pour vous!!!
Je remercie alexey123 sans qui rien n'aurait été possible!
Si vous avez besoin d'aide, merci de poster sur le [Topic unique] Sécuriser Owncloud avec Fail2ban !!
La version Nas4free utilisée est la suivante:
9.2.0.1 - Shigawire (revision 972), FreeBSD 9.2-RELEASE-p4 (kern.osreldate: 902001, x64-embedded sur Intel(R) Pentium(R) Dual CPU E2140 @ 1.60GHz
Pour commencer vous créez une jail avec Thebrig, que vous nommerez owncloud.. par exemple.
[TUTO] Comment créer une Jail avec Thebrig
Vous installez Owncloud en suivant ce tuto:
[TUTO] Installation Owncloud 8 + Mysql
Pour une meilleure compréhension, durant tout le tuto j'utiliserai pool1 comme point de montage, adaptez avec le vôtre.. Par ailleurs Owncloud et Fail2ban seront installéS dans la même Jail.
On commence par entrer dans la jail:
Code: Select all
jexec 1 cshon installe fail2ban dans la jail
Code: Select all
pkg_add -r py27-fail2banCode: Select all
mkdir /var/run/fail2banCode: Select all
edit /etc/rc.confCode: Select all
syslogd_flags="-ss -cc"Code: Select all
fail2ban_enable="YES"Code: Select all
pkg_add -r wait_onCode: Select all
exitCode: Select all
mkdir /mnt/pool1/appCode: Select all
#!/bin/csh
start:
set FILE1=/mnt/pool1/Jail/owncloud/tmp/fail2ban
/mnt/pool1/Jail/owncloud/usr/local/bin/wait_on -w $FILE1
sh /mnt/pool1/Jail/owncloud/tmp/fail2ban
sleep 2
goto startOn crée un 2ème fichier que l'on va nommer "f2banner" avec comme permission 755 et on y colle dedans le script ci dessous
Code: Select all
#!/bin/sh
# f2banner
#
. /etc/rc.subr
name=fail2banner
pidfile="/var/run/${name}.pid"
command="/mnt/disk/app/$name"
killproc() {
pid=`/bin/ps ax | grep -w ${name} | grep -v grep | awk '{print$1}'`
echo "Stopping $1 now."
[ "$pid" != "" ] && kill -15 $pid
rm ${pidfile}
echo $pid
}
# Start/stop processes
case "$1" in
'start')
pid=`/bin/ps ax | grep -w ${name} | grep -v grep | awk '{print$1}'`
if [ -n "${pid}" ]; then
echo "${name} already running? (pid=${pid})."
return 1
fi
echo -n "Starting ${name} "
${command} start &
echo `ps -ax | grep fail2banner | grep -v grep | awk '{print $1}'`
echo `ps -ax | grep fail2banner | grep -v grep | awk '{print $1}'` > ${pidfile}
;;
'stop')
killproc fail2banner
;;
'status')
pid=`/bin/ps ax | grep -w ${name} | grep -v grep | awk '{print$1}'`
echo $pid
;;
'restart')
killproc fail2banner
${command} start &
echo `/bin/ps ax | grep -w ${name} | grep -v grep | awk '{print$1}'` > ${pidfile}
;;
*)
echo "Usage: $0 [ start | stop | restart | status]"
;;
esacVous allez ensuite dans l interface webui de Nas4free dans Système|Avancé|Scripts de commande et vous ajoutez les deux lignes en "postinit" et "shutdown" comme ci dessous:
On retourne ensuite dans la jail
On démarre Fail2banjexec 1 csh
Code: Select all
/usr/local/etc/rc.d/fail2ban startOn édite maintenant le fichier "database.php" pour le modifier
Code: Select all
edit /usr/local/www/owncloud/lib/private/user/database.phpEt on remplace tout le paragraphe jusqu'à "return false" sauvegardez votre fichier original avant de faire la manip comme cela si vous faites une errreur, vous l aurez sous la main!!
Code: Select all
public function checkPassword( $uid, $password ) {
$query = OC_DB::prepare( 'SELECT `uid`, `password` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)' );
$result = $query->execute( array( $uid));
$row=$result->fetchRow();
if($row) {
$storedHash=$row['password'];
if ($storedHash[0]=='$') {//the new phpass based hashing
$hasher=$this->getHasher();
if($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), $storedHash)) {
return $row['uid'];
}else{ $today = new DateTime();
date_timezone_set($today, timezone_open('EUROPE/PARIS'));
$IPClient= $_SERVER['REMOTE_ADDR'];
$logAuth = fopen('/var/log/owncloud/auth.log', 'a+');
fputs($logAuth, date_format($today, 'Y/m/d H:i:s') . " \tWebform Login" . " Username/Password failed for: \t" . $IPClient . "\n");
fclose($logAuth);
return false;
}
}else{//old sha1 based hashing
if(sha1($password)==$storedHash) {
//upgrade to new hashing
$this->setPassword($row['uid'],$password);
return $row['uid'];
}else{ $today = new DateTime();
date_timezone_set($today, timezone_open('EUROPE/PARIS'));
$IPClient= $_SERVER['REMOTE_ADDR'];
$logAuth = fopen('/var/log/owncloud/auth.log', 'a+');
fputs($logAuth, date_format($today, 'Y/m/d H:i:s') . " \tWebform Login" . " Username/Password failed for: \t" . $IPClient . "\n");
fclose($logAuth);
return false;
}
}
}else{
$today = new DateTime();
date_timezone_set($today, timezone_open('EUROPE/PARIS'));
$IPClient= $_SERVER['REMOTE_ADDR'];
$logAuth = fopen('/var/log/owncloud/auth.log', 'a+');
fputs($logAuth, date_format($today, 'Y/m/d H:i:s') . " \tWebform Login" . " Username/Password failed for: \t" . $IPClient . "\n");
fclose($logAuth);
return false;
}
}On crée un dossier dans /var/log que l'on va nommer owncloud
Code: Select all
mkdir /var/log/owncloudOn édite ensuite le fichier jail.conf
Code: Select all
edit /usr/local/etc/fail2ban/jail.confCode: Select all
[owncloud]
enabled = true
action = owncloud[localhost=10.0.0.21]
filter = owncloud
logpath = /var/log/owncloud/auth.log
maxretry = 3Ensuite vous créez un nouveau fichier "owncloud.conf" que vous allez placer dans /usr/local/etc/fail2ban/filter.d/
Et dedans vous y placez le script ci dessous
Code: Select all
# /usr/local/etc/fail2ban/filter.d/owncloud.conf
#
# Fail2Ban configuration file
# By Anthony25 and Malekith25
# Owncloud
# Edited by Alexey
[Definition]
# Option: failregex
# Filter Ban in /var/log/owncloud/auth.log
failregex = <HOST>$
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =Et vous y placez dedans le script suivant
Code: Select all
# Fail2Ban configuration file
#
# Author: Nick Munger
# Modified by: Alexey Kruglov
#
# $Revision$
#
[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart =
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop =
# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck =
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionban = echo "ipfw add deny tcp from <ip> to <localhost> <port>" > /tmp/fail2ban
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionunban = echo "ipfw delete \`ipfw list | grep -i <ip> | awk '{print \$1;}'\`" > /tmp/fail2ban
[Init]
# Option: port
# Notes.: specifies port to monitor, as for me, it not understand http and https, I wrote port number
# Values: [ NUM | STRING ]
#
port = 443
# Option: localhost
# Notes.: the local IP address of the network interface
# Values: IP
#
localhost = 127.0.0.1 10.0.0.21Code: Select all
/usr/local/etc/rc.d/fail2ban restartVolia.. essayer de faire 3 erreurs de login dans owncloud et vous allez être banni pendant 10 mn A ce propos une précision concernant le temps de bannissement.. le journal de fail2ban se trouve dans /var/log/fail2ban.log.
A vous de régler le temps de bannissement à votre grèsLe paramétrage par défaut de la sanction est de 10mn, alors faisons un petit calcul : si un attaquant du service SSH fait 5 tentatives toutes les 10mn (il ne se fait sanctionner qu'à 6 erreurs), alors sans jamais se faire bloquer, il pourra effectuer 5×(60/10)×24×365=262800 tentatives par an, soit plus d'un quart de million. Alors supposons qu'un individu dispose de 10 postes (10 IP) d'où lancer une attaque, il aura effectué au bout d'un an 2.6 millions d'essais, et avec 100 ou 1000 postes, 26 millions ou 260 millions. On voit donc bien que 10 minutes n'est pas une sanction suffisante. Par rapport au blocage par défaut (600s), un blocage de 1h est bien plus réaliste (3600s), ou même 1 journée (86400s), ou pourquoi pas 1 semaine (604800s). Mais attention que changer le 'bantime' n'agit pas sur le 'findtime' qu'il faut également ajuster, car sinon le 'findtime' par défaut (10mn) est utilisé, ce qui permet à nouveau l'attaque expliqué au point précédent. L'inconvénient d'un (très ?) grand 'findtime' est qu'il pousse fail2ban à analyser de plus longs fichiers de log, et que ça peut être pénalisant du point de vue des performances, alors c'est à vous de voir. La solution est alors de choisir un grand 'findtime' et un très grand 'bantime' : 3600 et 86400, ou encore 86400 et 604800.
Je n'ai pas essayer l'installation de fail2ban dans Finch mais il n'y a aucune raison que cela ne fonctionne pas.. je vous laisse essayer et n'hésitez pas à partager vos experiences
enjoy!
