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