Sécurité pro-active avec fail2ban
Installation et paramétrage de fail2ban 0.8.4
fail2ban est un programme en python dont la fonctionalité première est de fournir des filtres (filter.d), utilisés pour parser les logs de différents services. En fonction du nombre de « matchs » il réagit en poussant des règles iptables (via action.d). De base les logs d’un certain nombre de services sont prêt à etre monitorés (ssh,apache2, postfix, courier-imap….).
Je ne détaillerai bien évidement pas toutes les configurations possibles mais seulement celles qui répondent à mes besoins :
- Surveillance des logs ssh
- Surveillance des logs imap
- Notification des tentatives d’intrusion
Il est possible de réaliser tout cela via iptables sans l’aide de fail2ban mais pas de manière aussi souple. Sécuriser son serveur avec iptables fera l’objet d’un autre billet et prends tout son sens lorsque les ressources à disposition sont limités (plugcomputer)
Téléchargement des paquets
apt-get install fail2ban
Fail2ban est constitué de la manière suivante:
- action.d : contient les actions à mettre en oeuvre à un tentative d’intrusion
- filter.d : contient les expressions régulières permettant de parser les logs d’un service donné
- jail.conf : Content les paramètres de chacun des services surveillés (bantime, maxretry, mail etc…)
La surveillance des logs d’un service est activée via /etc/fail2ban/jail.conf.
Configuration des jails (jail.conf)
Le fichier de conf présent dans le paquet à l’installation est obsolète, nous allons donc le mettre à jour:
Il est conseillé de faire une copie du fichier de configuration jail.conf et de venir modifier un jail.conf.local qui sera lu automatiquement.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.local
Ingore ip est important à configurer pour éviter de se faire bannir par son propre serveur. Cette section permet de définir les paramètres et actions d’un service qui n’aurait pas été « surchargé » (actions personnalisées)
[DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not # ban a host which matches an address in this list. Several addresses can be # defined using space separator. ignoreip = 127.0.0.1 ipanepasbannir # "bantime" is the number of seconds that a host is banned. bantime = 600 # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 600 # "maxretry" is the number of failures before a host get banned. maxretry = 3
Activation des services à surveiller
Pour activer une surveillance :
enabled = true
- filter : filtre utilisé; présent dans filter.d
- port: port du service
- action: utilise les actions définis dans action action.d. mail-whois permet d’envoyer des mails via ‘mail’, pour être notifié d’un changement de configuration, le drop d’une ip etc..
- logpath: emplacement des log à surveiller. Si vous n’utilisez pas une distribution basé sur debian vous devrez surement la modifier
- findtime: période pendant laquelle il est possbile de faire des tentatives de connexions au nombre <= maxretry
Par défaut tous les services sont à enabled=false. Il faut les passer à true pour les activer. Attention à bien renseigner le fichier de log à surveiller. Par exemple le fichier de log de ssh pour debian/ubuntu est :
/var/log/auth.log
De même pour le port ssh veillez à mettre celui que vous avez configuré (ssh => port=22 par défaut)
[ssh] enabled = true port = 22xx filter = sshd logpath = /var/log/auth.log maxretry = 3 findtime = 60 action = iptables-multiport[name=SSH, port=22xx, protocol=tcp] mail-whois[name=SSH, dest=webmaster@yourdomain.fr, sender=fail2ban@yourdomain.fr] [courierauth] enabled = true port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s filter = courierlogin logpath = /var/log/mail.log maxretry = 3 findtime = 60 action = mail-whois[name=IMAP, dest=webmaster@yourdomain.fr, sender=fail2ban@yourdomain.fr]
Pour recevoir les mails lors du ban d’ip, editez le fichier d’action (ici /etc/fail2ban/action.d/mail-whois.conf) :
# Destination/Addressee of the mail
dest = webmaster@yoursite.fr
Tester sa conf au niveau des filtres
Après avoir modifié ses filtres, encore faut t-il vérifier que tout est fonctionnel! Pour cela on teste sur un fichier de log (ayant loggué des intrus de préférence) le filtre associé :
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/courierlogin.conf
Fin de l’installation
Après avoir modifié la configuration, il faut la recharger :
fail2ban-client reload ou fail2ban-client stop && fail2ban-client start
Pour avoir la liste des jails active:
fail2ban-client status
Status
|- Number of jail: 2
`- Jail list: courierauth,ssh
Si vous avez ce message d’érreur:
WARNING ‘findtime’ not defined in ‘postfix’. Using default value
La durée utilisée pendant laquelle des connexions « findtime » peuvent être essayées est celle défini au niveau de la balise [DEFAULT]
Il faut la redéfinir pour chaque service :
findtime = 60
Il est interessant de connaitre les ip ayant été bannis par fail2ban. Chaque action est logué dans /var/log/fail2ban.log
2011-09-14 13:41:14,371 fail2ban.actions: WARNING [ssh] Ban x.x.x.x
Ainsi on peu imaginer la récupération des ip des vilains pour la création d’une base et le ban définitif de certaines ip récidiviste.
En conclusion de ce billet je dirais que fail2ban est un projet extrêmement utile et fonctionnel mais ne remplace pas pour autant remplacer une configuration d’iptables appropriée. Un bémol cependant qui m’interpelle….fail2ban ne semble pas avoir évolué depuis 2009/09/07. Il reste efficace mais il est courant de devoir modifier les regex des filtres proposés à l’installation pour suivre les évolutions des logiciels. Si quelqu’un connait un fork de fail2ban qu’il me fasse signe !