Mes passions, le boulots, mes coups de gueule...




Raspberry Pi : Configurer Fail2Ban

Catégories : Geek, Informatique, Raspberry Pi · par 14 Juil 2014

Fail2ban-01

Pour compléter l’article sur IPtables, nous allons maintenant installer Fail2Ban.

Fail2Ban est un programme écrit en Python qui va tourner en tâche de fond et analyser les logs des différents serveur (Nginx, SSH, FTP, …). Il va repérer les erreurs d’accès et bannir l’adresse IP qui en est à l’origine grâce à IPtable. Très concrètement il va empêcher les attaques par force brute qui consistent à essayer toutes les combinaisons de mots-de-passes.

Vous pensez que ça ne peut pas vous arriver ? Je croyait, comme vous, être à l’abri de ce genre d’attaque jusqu’à ce que je constate une charge anormale du processeur :

Fail2ban-02

Un petit netstat du port 22 m’a appris ceci :

$ netstat -tn 2>/dev/null | grep :22 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
 1 192.168.0.2
35 116.10.191.213

Il y avait 35 process en cours sur le port 22 (SSH) venant d’une adresse IP située en Chine :

Fail2ban-03

Pour installer Fail2Ban, c’est assez simple. Comme d’habitude, on va procéder aux mises à jours, puis à l’installation du service :

$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get install fail2ban
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
gamin libgamin0 python-central python-gamin whois
Les NOUVEAUX paquets suivants seront installés :
fail2ban gamin libgamin0 python-central python-gamin whois
0 mis à jour, 6 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 347 ko dans les archives.
Après cette opération, 1 371 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?

Une fois l’installation terminée, on va éditer le fichier de configuration de Fail2Ban :

$ sudo nano /etc/fail2ban/jail.conf

Les valeurs par défaut peuvent être adaptées. Elles vaudront pour toutes les règles, sauf si des valeurs spécifiques sont définies :

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1/8
bantime  = 3600
findtime = 3600
maxretry = 3

Le bantime et findtime sont défini en secondes.

bantime indique le temps de bannissement.
findtime indique jusqu’où Fail2Ban doit remonter dans l’historique.
maxretry indique le nombre de tentatives infructueuses avant bannissement.

Voici ce que j’ai défini pour SSH :

[ssh]

enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
findtime = 86400
bantime = 86400

Et les règles pour Nginx :

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
maxretry = 3

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
maxretry = 3

[nginx-noscript]
enabled = true
action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript
logpath = /var/log/nginx*/*access*.log
maxretry = 3
findtime = 86400
bantime  = 86400

Pour chaque nouvelle règle que l’on ajoute dans jail.conf, il faut créer un fichier de configuration dans /etc/fail2ban/filter.d/ :

$ sudo nano /etc/fail2ban/filter.d/nginx-auth.conf
# Auth filter /etc/fail2ban/filter.d/nginx-auth.conf:
#
# Blocks IPs that fail to authenticate using basic authentication
#
[Definition]

failregex = no user/password was provided for basic authentication.*client:
            user .* was not found in.*client:
            user .* password mismatch.*client:

ignoreregex =
$ sudo nano /etc/fail2ban/filter.d/nginx-login.conf
# Login filter /etc/fail2ban/filter.d/nginx-login.conf:
#
# Blocks IPs that fail to authenticate using web application's log in page
#
# Scan access log for HTTP 200 + POST /sessions => failed log in
[Definition]
failregex = ^ -.*POST /sessions HTTP/1\.." 200
ignoreregex =
$ sudo nano /etc/fail2ban/filter.d/nginx-noscript.conf
# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf:
#
# Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts.
#
# Matches e.g.
# 192.168.1.1 - - "GET /something.php
#
[Definition]
failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =

Une fois toutes les règles en place, on redémare Fail2Ban :

$ sudo service fail2ban restart

Après quelques minutes ou heures, on devrait voir apparaitre quelques traces d’activité dans le log de Fail2Ban :

$ sudo tail -f /var/log/fail2ban.log

Pour plus d’infos, vous pouvez visiter ce site qui résume tout un tas de précautions à prendre pour éviter de se faire hacker :
http://www.clubic.com/forum/hardware-general/raspberry-pi-ze-topic-id877239-page1.html

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.