This is the old XigmaNAS forum in read only mode,
it will taken offline by the end of march 2021!



I like to aks Users and Admins to rewrite/take over important post from here into the new fresh main forum!
Its not possible for us to export from here and import it to the main forum!

[TUTO] Sécuriser Owncloud avec Fail2ban

Moderators: velivole18, ernie, mtiburs

Locked
laster13
PowerUser
PowerUser
Posts: 995
Joined: 01 Jun 2013 19:15
Location: France-Marseille
Status: Offline

[TUTO] Sécuriser Owncloud avec Fail2ban

Post by laster13 »

Bonjour,

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 csh
rappellez vous le chiffre "1" correspond avotre "id"

on installe fail2ban dans la jail

Code: Select all

pkg_add -r  py27-fail2ban
On crée ensuite un dossier fail2ban pour stocker les fichiers pid et sock

Code: Select all

mkdir /var/run/fail2ban
on modifie le fichier rc.conf

Code: Select all

edit /etc/rc.conf
et on y ajoute les lignes suivantes

Code: Select all

syslogd_flags="-ss -cc"

Code: Select all

fail2ban_enable="YES"
Ensuite on installe wait_on

Code: Select all

pkg_add -r wait_on
On sort maintenant de la jail

Code: Select all

exit
Ensuite dans le dossier "mnt" de nas4free, en dehors de la jail, on crée un dossier "app"

Code: Select all

mkdir /mnt/pool1/app
On crée un un fichier que l'on va nomme "fail2banner" avec comme permission 755 et on y colle dedans le script ci dessous

Code: 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 start
Adaptez avec vos données, rappellez vous, "pool1" est mon point de montage.. et vous placez ce fichier dans le dossier app.

On 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]"
     ;;
esac
Même chose, vous adaptez le chemin en laissant la variable "$name" à la fin et vous le placez également dans le dossier "app"

Vous 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:

Image

On retourne ensuite dans la jail
jexec 1 csh
On démarre Fail2ban

Code: Select all

/usr/local/etc/rc.d/fail2ban start
Protection de Owncloud contre les attaques Brute Force

On édite maintenant le fichier "database.php" pour le modifier

Code: Select all

edit /usr/local/www/owncloud/lib/private/user/database.php
On repère la ligne suivante "public function checkPassword( $uid, $password )"

Et 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;
		}
	}
ensuite:

On crée un dossier dans /var/log que l'on va nommer owncloud

Code: Select all

mkdir /var/log/owncloud
Et dans ce dossier owncloud, vous créez un fichier nommé "auth.log" (utiliser winscp pour ceux qui ne sont pas allergique à windaube :))

On édite ensuite le fichier jail.conf

Code: Select all

edit /usr/local/etc/fail2ban/jail.conf
Et vous collez à la fin le paragraphe suivant

Code: Select all

[owncloud]
enabled  = true
action   = owncloud[localhost=10.0.0.21]
filter   = owncloud
logpath  = /var/log/owncloud/auth.log
maxretry = 3
Vous remplacez 10.0.0.21 par l ip de votre jail

Ensuite 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 =
Ensuite vous créez encore un fichier "owncloud.conf" que vous placez dans /usr/local/etc/fail2ban/action.d/

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.21
On redemarre fail2ban

Code: Select all

/usr/local/etc/rc.d/fail2ban restart
Vous remplacez 10.0.0.21 par l ip de votre jail et le port 443 par celui que que vous avez choisis pour owncloud.

Volia.. 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.
Le 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.
A vous de régler le temps de bannissement à votre grès

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!
You do not have the required permissions to view the files attached to this post.

Locked

Return to “Tuto”