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