Fail2ban

Présentation :

Parmi les indispensables pour sécuriser un serveur sous GNU/Linux, on trouve le logiciel Fail2ban.
Cet utilitaire va parser (lire) les fichiers de log système (auth.log, syslog, mail.log etc) et bannir les adresses IP qui ont obtenu un trop grand nombre d’alerte.
Il met à jour les règles du pare-feu (iptables) et bloquer tous les communications avec cet IP pour une durée déterminée.
C’est un logiciel libre publié sous licence GPL v2 et écrit avec en Python.

Pourquoi installer Fail2Ban ?

Dans un précédent article, j’ai présenté logwatch, un autre utilitaire qui permet d’avoir une synthèse de l’activité anormale de la machine. Vous êtes en train de lire votre rapport et là vous constaté qu’il y a eu de nombreuses tentatives (>100) d’accéder à votre machine via SSH ou FTP … En fait, un meilleur mot pour accéder est plutôt trouver le mot de passe. La machine va tenter encore et encore de tester un dictionnaire de mot de passe jusqu’à réaliser l’exploit.
Face à ce type d’attaque, deux possibilités : faire des mots de passe compliqués (il est fortement recommander d’enfaire des très compliqués) et/ou bloquer la machine qui vous attaque.
Fail2Ban va permettre de bannir temporairement la machine qui attaque ce qui rallonger grandement la durée pour trouver vos mots de passes et ainsi améliorer la sécurité de votre serveur !!

Distribution :

Distribution utilisée : Ubuntu 14.04.1 LTS
Version de Fail2ban installée : v0.8.11

Installation :

Shell

apt-get install fail2ban

Puis faire une copie du fichier jail.conf, nommée jail.local, pour que vos paramétrages ne soient pas écrasés lors d’une mise à jour :
Shell

cp -a /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Structure du soft :

Shell

cd /etc/fail2ban
ls -Rl

Résultat :

fail2banconfig

Présentation des différents fichiers importants de l’outil :

  • fichier fail2ban.conf : défini quatre paramètres :
    – le niveau max de log à scruter ;
    – le fichier où les enregistrer les logs de fail2ban ;
    – le chemin du socket de communication avec le serveur ;
    – le pidfile ;
    Ce fichier n’est pas à modifier.
  • fichier jail.conf : Il s’agit d’un fichier qui contient l’ensemble des règles, encore appelées Jail, qui vont bloquer les IP agressifs.
  • fichier jail.local : copie du fichier jail.conf, à réaliser, qui ne sera pas écrasée en cas de mise à jour. C’est dans ce fichier qu’il faudra modifier.
  • dossier action.d : contient un ensemble de fichiers d’actions que Fail2ban va utiliser lorsqu’une IP est trouvée trop souvent dans les logs.
  • le dossier filter.d : contient un ensemble fichiers de règles que Fail2ban va utiliser lors du parsing (de la lecture) des différents fichier de logs.

Configuration :

Modifier le fichier de configuration de fail2ban :

vi /etc/fail2ban/jail.local

Fichier jail.local

Le fichier se divise en trois parties : Default, Action, Jails

Partie [Default] :

Dans cette première partie, 6 options intéressantes à modifier :

# Option Informations
1
ignoreip = 127.0.0.1/8 xxx.xxx.xxx.xxx

ignoreip : comme le libellé l’indique, cette variable permet d’ignorer certain IP lors du parsing. N’hésitez pas à ajouter votre adresse IP

2
bantime  = 86400 
« bantime » est la durée, en seconde, durant laquelle l’IP banni va être stocké dans les règles iptables, ici 1 jour = 86400 secondes = 60s x 60 min x 24 heures.
3
findtime = 7200
findtime : est la durée de recherche de Fail2ban. Ici, il s’agit de 2 heures = 7200 secondes = 60s x 60 min x 2 heures. Attention, plus la durée est longue et plus le parsing va consommer du CPU et ralentir votre serveur
4
maxretry = 3
maxretry : nombre d’alerte maximum au delà de laquelle l’IP va être enregistrée dans iptable. Attention, il s’agit de valeur par défaut qui va être « overrider » si elle est mentionnée dans un jail.
5
destemail = example@webdevpro.net example2@webdevpro.net
« destemail » : destinataire des mails de notification. Si plusieurs destinataires, les séparer par des espaces.
6
sendername = Fail2Ban - nom de votre serveur
sendername : nom l’émetteur du mail. Intéressant à modifier si vous avez plusieurs serveurs disposant de cet outil.

Partie [Action] :

Dans cette seconde partie, une seule variable est intéressante à modifier.

# Option Information
1
action = %(action_)s
action : trois valeurs possibles :

  • action_ : bannir l’IP ;
  • action_mw : bannir l’IP et envoyer une mail à destemail avec les infos Whois de l’IP ;
  • action_mwl : bannir l’IP et envoyer une mail à destemail avec les infos Whois de l’IP et les lignes de logs incriminées.

Partie [JAILS] :

Il s’agit de la partie la plus importante du fichier. Une jail utilise la structure suivante :

# Option Information
1
[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3 
  • enabled avec pour valeur true ou false permet d’activer ou pas la prison
  • port indique les ports TCP surveillés, par leur numéro ou nom
  • filter définit le nom du filtre à utiliser
  • action définit l’action à réaliser
  • servicemail permet l’envoi d’un mail d’alerte
  • logpath indique le chemin du fichier de logs à analyser
  • maxretry définit le nombre de tentatives possibles avant l’interdiction
  • findtime définit le temps en seconde durant lequel les tentatives peuvent être accumulées
  • bantime définit la durée de l’interdiction

Remarque : si une option n’est pas définie dans une jail, c’est la valeur mentionnée dans la partie [Defaut] qui sera utilisée.

Liste des jails à mettre en place

Nom Jail path du fichier de log
[ssh] /var/log/auth.log
[ssh-ddos] /var/log/auth.log
[pam-generic] /var/log/auth.log
[apache] /var/log/apache*/*error.log
[apache-multiport] /var/log/apache*/*error.log
[apache-overflows] /var/log/apache*/*error.log
[apache-noscript] /var/log/apache*/*error.log
[proftpd] /var/log/auth.log

Relancer Fail2Ban après modification du fichier jail.conf :

Shell Answer

/etc/init.d/fail2ban restart

ou

fail2ban-client reload

Si tout se passe bien, vous avez le message suivant :
Shell Answer

* Restarting fail2ban                    [ OK ]

Message d’erreur lors du rechargement :

sinon, vous allez avoir un message d’erreur, fail2ban ne peut pas redémarrer car il ne trouve pas tous les fichiers de log à scruter. Le message vous donne des informations sur les jails à désactiver :

Shell

* Restarting authentication failure monitor fail2ban
WARNING 'actionstart' not defined in 'Definition'. Using default one: ''
WARNING 'actionstop' not defined in 'Definition'. Using default one: ''
WARNING 'actioncheck' not defined in 'Definition'. Using default one: ''
WARNING 'actioncheck' not defined in 'Definition'. Using default one: ''
WARNING 'actioncheck' not defined in 'Definition'. Using default one: ''
ERROR  Found no accessible config files for 'filter.d/lighttpd-fastcgi' under /etc/fail2ban
ERROR  Unable to read the filter
ERROR  Errors in jail 'lighttpd-fastcgi'. Skipping...
ERROR  No file(s) found for glob /var/log/daemon.log
ERROR  Failed during configuration: Have not found any log file for xinetd-fail jail

Il faut mettre à false toutes les jails qui ne dispose pas de fichiers de logs présents dans la distribution.

Listes jails disponibles :

Shell

fail2ban-client status

Shell Answer

Status
|- Number of jail:      9
`- Jail list:           apache-noscript, pam-generic, postfix, ssh-ddos, apache-multiport, dropbear, ssh, apache-overflows, apache

Savoir si fail2ban est actif :

Shell

ps -edf | grep fail2ban

Le Shell doit vous lister des processus en cours d’action. Par exemple :
Shell Answer

root      2222     1  0 15:36 ?        00:00:11 /usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid
root      3333  4444  0 16:34 pts/0    00:00:00 grep --color=auto fail2ban

Connaître globalement le nombre d’IP bloqué grâce à Fail2ban :

Shell

iptables -L -n -v

Connaître les IP bloqués grâce à une jail particulière :

Nous allons vérifier le nombre d’IP bloqué grâce à la jail ssh :
Shell

/usr/bin/fail2ban-client status ssh

Shell Answer

Status for the jail: ssh
|- filter
|  |- File list:        /var/log/auth.log
|  |- Currently failed: 1
|  `- Total failed:     651
`- action
   |- Currently banned: 2
   |  `- IP list:       58.xx.xx.xx 43.xx.xx.xx
   `- Total banned:     148