Sécurisation de son serveur : fail2ban

Publié le 27 décembre 2010 par Pach

Comme l'a très bien dit Tancrède dans son article "La sécurité sera-t-elle l'argument anti auto-hébergement ?" :

S'il y a bien une raison qui pourrait s'opposer à l'auto-hébergement, je pense que ce serait celle de la sécurité. C'est probablement le point noir qui empêchera, voire interdira, l'auto-hébergement.

Je suis assez d'accord avec lui et vous invite à lire son article. Aussi, j'ai décidé de partager mon experience en vous montrant une première sécurisation quasi-indispensable pour votre serveur => fail2ban, un logiciel qui scrute les fichiers de logs à la recherche d'actions suspectes et bannit les utilisateurs mal intentionnés grâce aux iptables.

I. Installation

Mon serveur tourne avec une Debian Lenny. Fail2ban est déjà dans les dépôts officiels, un simple apt-get install sera suffisant :

apt-get install fail2ban

II. Configuration

Toute la configuration se passe dans le répertoire /etc/fail2ban/.

Le fichier fail2ban.conf défini le niveau de verbosité de logs ainsi que le fichier de log utilisé. Par défaut, /var/log/fail2ban.log.

Les services à monitorer sont stockés dans le fichier jail.conf. Il est recommandé d'en effectuer une copie nommée jail.local qui sera automatiquement utilisée à la place du fichier d'origine.

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

J'ai modifié l'en-tête de ce fichier jail.local :

[DEFAULT]
# "ignoreip" les adresses IP qui seront ignorées par fail2ban
ignoreip = 127.0.0.1
#3600 secondes = 1 heure de banissement
bantime = 3600
# Le laps de temps pendant lequel les tentatives vont être possibles
findtime = 600
# Le nombre d'essais maximum avant bannissement
maxretry = 3

Les jails sont les "actions/logs/chaines" à surveiller. Par exemple, le jail [ssh] :

[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6

  • enabled est là pour activer le jail (ou le désactiver s'il est positionné à false)
  • port du service. Si vous avez décidé d'ouvrir ssh sur un autre port, remplacez le mot ssh par le numéro du port
  • filter est le nom du filtre utilisé pour ce jail (les filtres se trouvent dans le répertoire filter.d) = sshd.conf dans notre exemple
  • logpath est le fichier de log qui doit être analysé 
  • maxretry est le nombre d'essais autorisés (écrase la valeur positionnée à 3 ci-dessus)

Pour redémarrer :
fail2ban-client reload

Pour voir la conf actuelle :
fail2ban-client status
iptables -L -v

Voici les services que j'ai activé :
root@wario:/etc/fail2ban# fail2ban-client status
Status
|- Number of jail: 8
`- Jail list: apache-w00tw00t, apache-noscript, ssh-ddos, apache-multiport, apache-overflows, ssh, apache, apache-phpmyadmin

Note : Lors du redémarrage de la machine, il se peut que fail2ban ne charge pas toutes les iptables (voir erreurs dans fichier de log fail2ban). Dans ce cas, il faut recharger le fail2ban-client ou bien ajouter une commande sleep dans les jails (expliqué ici).

III. Mes jails perso

apache-wOOtwOOt

Ce jail est là pour bannir les requêtes DFind w00tw00t.
Dans le fichier /etc/fail2ban/jail.local tout en bas, j'ajoute :

#Mes jails
[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log
maxretry = 1

On notera que contrairement aux autres règles, celle-ci s'attaque au fichier de log des accès (/var/log/apache2/access*.log).

Voici le fichier de règles /etc/fail2ban/filter.d/apache-w00tw00t.conf

[Definition]
failregex = ^ -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
ignoreregex =

On teste maintenant si la règle s'applique bien en faisant :

fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-w00tw00t.conf 

Puis on recharge l'application

fail2ban-client reload

apache-phpmyadmin

Pour bannir les requêtes du style :

[Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/phpmyadmin
[Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/phpMyAdmin
[Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/PHPmyadmin
[Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/sqldmin
[Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/admin
[Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/scripts

Je créé le fichier /etc/fail2ban/filter.d/apache-phpmyadmin.conf

# Fail2Ban configuration file
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
[Definition]
docroot = /home/www
badadmin = PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|webdb|sqlmanager|sqlweb|websql
failregex = [[]client []] File does not exist: %(docroot)s/(?:%(badadmin)s)
ignoreregex =

Puis j'édite le fichier /etc/fail2ban/jail.local

[apache-phpmyadmin]
enabled = true
port = http,https
filter = apache-phpmyadmin
logpath = /var/log/apache2/error*.log
maxretry = 2


VI. Conclusion

Si vous avez mis en place fail2ban et que vous avez des jails perso supplémentaires à partager, n'hésitez pas à m'en faire part, je les ajouterai à cet article. Merci par avance :)