Fail2Ban : Install et config

Posted by on 7/sept/2011 in A la Une, Linux, Systèmes et Applicatifs | 0 comments

Fail2Ban : Install et config

Fail2Ban est un utilitaire permettant de surveiller divers logs fichier, de repérer à l’intérieur des messages critiques synonymes de tentatives de hack et à minima d’automatiser le bannissement des adresses IP concernées.

Fail2Ban permet de se prémunir des attaques par bruteForce sur les principaux logiciels serveurs (sshd, pop3d, imapd, httpd, ftpd, …), d’automatiser un ban sur une durée D1 et d’automatiser le déban au bout d’un temps D2.

1.  Présentation

1.1       Introduction

Fail2Ban est un utilitaire permettant de surveiller divers logs fichier, de repérer à l’intérieur des messages critiques synonymes de tentatives de hack et à minima d’automatiser le bannissement des adresses IP concernées.

Fail2Ban permet de se prémunir des attaques par bruteForce sur les principaux logiciels serveurs (sshd, pop3d, imapd, httpd, ftpd, …), d’automatiser un ban sur une durée D1 et d’automatiser le déban au bout d’un temps D2.

Le fichier fail2ban.zip (joint l’article RTFM de ce même document) contient la version 0.8.4 de jail2Ban.

Les updates de fail2Ban peuvent se trouver ici : http://sourceforge.net/projects/fail2ban/files/

1.2       Prérequis

fail2ban est un script écrit en Python, il ne nécessite aucun outil de compilation.

La version de Python exigée (à minima) est 2.3

Les librairies de développement de Pyhton sont nécessaires au déploiement de fail2ban (incluses dans toutes les distributions)

2.  Installation

-          Décompresser l’archivefail2ban dans un dossier temporaire D

-          Entrer dans le dossier D et taper la commande « python   setup.py   install »

-          Créer le fichier /etc/init.d/fail2ban tel que :

#! /bin/sh
# Copyright (c) XXX.
# All rights reserved.
#
# Author:XXX
# Please send feedback to http://sss/
#
# /etc/init.d/fail2ban
#
### BEGIN INIT INFO
# Provides:          fail2ban
# Required-Start:    $syslog $network $dovecot
# Required-Stop:
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       Fail2Ban Server
### END INIT INFO
. /etc/rc.status
# Reset status of this service
rc_reset
case "$1" in
start)
echo -n "Starting FAIL2BAN "
/usr/local/bin/fail2ban-client -v -c /etc/fail2ban start
echo "Etat des tables "
/usr/sbin/iptables --list
;;
stop)
echo -n "Stopping FAIL2BAN "
/usr/local/bin/fail2ban-client -v -c /etc/fail2ban stop
echo "Etat des iptables "
/usr/sbin/iptables --list
;;
restart)
$0 stop
$0 start
rc_status
;;
status)
echo -n "Statut FAIL2BAN "
/usr/local/bin/fail2ban-client -v -c /etc/fail2ban status
echo "Etat des tables "
/usr/sbin/iptables --list
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
rc_exit

-          Taper les commandes :

  • chmod +x /etc/init.d/fail2ban
  • chkconfig    -- add   fail2ban   35 
  • ln   –s   /etc.init.f/fail2ban   /usr/sbin/fail2ban

 

3.  Configuration

3.1       Configuration de base

3.1.1      Fichier « /etc/fail2ban/fail2ban.conf »

Voici les notions importantes à modifier, le reste peut rester en commentaires ou en valeurs par défaut :

loglevel = 4 Permet d’agrémenter un niveau de log suffisament verbeu pour les premiers tests, en production, il faudra le remettre à 1.
logtarget = /var/log/fail2ban.log Emplacement du fichier de log de fail2ban
socket = /var/run/fail2ban/fail2ban.sock Emplacement du fichier de socket unix de fail2ban (il faudra créér ce répertoire + chown –R root:root )

3.1.2      Fichier « /etc/fail2ban/jail.conf »

3.1.2.1         Configuration générale

Ce fichier contient une configuration par défaut de fail2ban (section « [DEFAULT] ») telle que :

bantime  = 3600 Si on doit bannir une IP, combien de temps reste-t-elle bannie ? (ici 1 heure)
findtime  = 600 Quel est l’intervalle de temps pendant lequel fail2ban compte les tentatives de hack avant d’atteindre le maximum toléré (maxretry) dans ce même intervalle ?
maxretry = 3 Maximum de tentatives infructueuses tolérée
backend = auto

Les autres sections de ce fichier de configuration sont des  « JAILS » (prisons).

Les JAILS indiquent la façon dont on va observer un fichier de log particulier, pour observer quel type de hack éventuel décris par des expressions régulières et quelles actions éventuelles seront alors à éffectuer (banissement temporaire d’IP ou autre), les JAILS sont décrits dans 3.1.2

3.1.2.2         Configuration des « JAILS »

Une JAIL est la description du besoin d’observer le contenu d’un fichier de log et de définir des actions en cas de tentative de hack. Les JAILS sont décrites dans le fichier /etc/fail2ban/jail.conf décrit en 3.1.2.

-          JAIL standard pour SSH :

[ssh-iptables] Nom de la JAIL
enabled  = true Est-elle pris en compte au démarrage de fail2ban ?
filter   = sshd Nom du filtre à utiliser pour parser le fichier de log concerné par cette JAIL (voir 3.1.2.3)
action=iptables[name=SSH, port=ssh, protocol=tcp] Quelle action doit-on entreprendre en cas de tentative de hack avérée ? (voir 3.1.2.4)
logpath     = /var/log/auth_sshd.log Fichier de log dans lequel l’authentification sur le serveur sshd doit être tracée pour traquer les failures.
maxretry = 3 Nombre de tentative maximum tolérée sur un intervalle glissant de <findtime> secondes
bantime  = 3600 Optionnel : Combien de temps en secondes un user banni le restera avant dé-banissement ?
findtime  = 600 Optionnel : Intervalle glissant en secondes pendant lequel on compte les echecs d’authentification (jusqu’à maxretry)

-          Construction d’une JAIL personalisée (exemple : DOVECOT pour mySQL) :

Dovecot est souvent utilisé comme serveur POP3/IMAP4, il est la pluspart du temps couplé avec mySQL dans lequel il trouvera la base utilisateurs (logins et passwords). Cependant, il n’existe pas de JAIL standard préconfigurée. Il faut donc faire tracer l’authentification de Dovecot dans un fichier précis, choisissons « /var/log/dovecot.log »,.

-          Paramétrage de DoveCot

  • Editer « /etc/dovecot/dovecont.conf » et fixer « log_path » à «  /var/log/dovecot.log », puis relancer Dovecot

-          Paramétrage de fail2ban (ajout d’une JAIL)

[dovecot] Nom de la jail
enabled = true Celle-ci doit être active
filter = dovecot L’expression régulière permettant d’identifier un hack dans le fichier de log de Dovecot sera repérée grâce au filtre nommé « dovecot » (voir 3.1.2.3)
action=iptables[name=dovecot, port=pop3, protocol=tcp] Quelle action doit-on entreprendre en cas de tentative de hack avérée ? (voir 3.1.2.4)
logpath = /var/log/dovecot.log Fichier de log d’authentification de dovecot
maxretry = 5 On tolère un peu plus d’echecs que pour SSH, ici 5

-          Paramétrage d’un Filtre « dovecot » (voir en 3.1.2.3)

-          L’action choisie dans cet exemple est la même que pour un la JAIL « ssh-iptables », celle-ci est donc déjà écrite il n’y a rien à faire, sinon il aurait fallu créer une action comme en 3.1.2.4.

3.1.2.3         Configuration d’un filtre

Les « filtres » de fail2ban sont dans le dossier « /etc/fail2ban/filter.d/ ».

Il existe un fichier unique par nom de filtre déclaré danes les JAILS, par exemple « /etc/fail2ban/filter.d/sshd.conf » pour la JAIL « ssh-iptables » décrite en 3.1.2.2.

Un filtre est principalement caractérisé par une expression régulière plus ou moins complexe décrite par le paramètre « failregex » du fichier de filtre. Si l’expression régulière « match » sur une nouvelle ligne dans le fichier de log d’une JAIL, alors fail2ban considèrera qu’une tentative de hack a été réalisée.

-          Exemple : Expression régulière du filtre sshd :

-

failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
^%(__prefix_line)sFailed (?:password|publickey) for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
^%(__prefix_line)sUser \S+ from <HOST> not allowed because not listed in AllowUsers$
^%(__prefix_line)sauthentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
^%(__prefix_line)sAddress <HOST> .* POSSIBLE BREAK-IN ATTEMPT!*\s*$
^%(__prefix_line)sUser \S+ from <HOST> not allowed because none of user's groups are listed in AllowGroups$

-          Exemple : Création d’un filtre « dovecont » pour la JAIL « dovecot »

La technique consiste à repérer dans le fichier de log (ici « /var/log/dovecot.log ») une ligne représentant un échec d’authentification puis, à l’aide des expressions régulières, la renseigner dans le paramètre failregex un fichier « /etc/fail2ban/filter.d/dovecot.conf » à créer.

Le fichier /var/log/dovecot.log contient des erreurs du style :

« dovecot: Oct 05 15:24:46 Info: auth-worker(default): sql(unUserBidon,192.168.10.19): unknown user »

L’expression régulière symbolisant cette chaine peut être par exemple :

« sql.*,<HOST>\).*unknown user »

Le paramètre <HOST> représente ici l’adresse IP que fail2ban peut récupérer dynamiquement dans cette expression régulière et qui sera passée en paramètre à son « action » correspondante et permettra un ban par iptables ou autre.

Le filtre de dovecot est donc le fichier « « /etc/fail2ban/filter.d/dovecot.conf » tel que :

# Fail2Ban configuration file
#
# Author: XXX
# Modified by: XXX
#
# $Revision: 1 $
#
[Definition]
# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values:  TEXT
#
#failregex = LOGIN FAILED, .*, ip=\[<HOST>\]$
# exemple:
# dovecot: Oct 04 17:59:00 Info: auth(default): pam(contact@hotel-lesvoyageurs.com,86.193.160.20): pam_authenticate() failed: Authentication failure
#failregex  = pam.*,<HOST>\).*failure
# exemple:
# dovecot: Oct 05 15:21:13 Info: auth-worker(default): sql(xaxaxa,192.168.10.19): unknown user
failregex  = sql.*,<HOST>\).*unknown user
ignoreregex =
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Il suffit de relancer fail2ban pour prendre en compte ces modifications.

Remarque) Pour vérifier la liste des IP(s) temporairement bannies par fail2ban, il faut utiliser la commande « iptables   –list ».

 

3.1.2.4         Configuration d’une action

Ce document ne documente pas cette section car les actions existantes par défaut dans fail2ban sont à priori largement suffisantes.

Les actions se trouvent dans le dossier « /etc/fail2ban/actions.d ».

Les paramètres récupérés dynamiquement dans les expressions régulières des filtres sont récupérable dynamiquement dans les scripts « actions ».  S’inspirer des scripts existant pour en créer de nouveaux.

 

Leave a Reply