Bloquer les attaques "brute force" avec iptables
Par CrazyCat le 26/06/2009, 09:13 - Shell - Lien permanent
Iptables est l'interface en ligne de commande permettant de configurer Netfilter, qui est un module du noyau Linux qui offre la possibilité de contrôler, modifier et filtrer les paquets IP, et de suivre les connexions. Il fournit ainsi les fonctions de pare-feu, de partage de connexions internet et d'autorisation du trafic réseau.
Il est possible de configurer iptables pour automatiquement bloquer les adresses IP qui feraient trop de tentatives d'accès à votre serveur, un peu à la manière de fail2ban mais sans installer de module complémentaire.
Nous allons prendre l'exemple de la protection de l'accès SSH sur le port 22 (le port par défaut).
Blocage automatique
Pour ce faire, il suffit de créer 2 règles:
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
Explications
La première commande permet, à chaque tentative de connexion d'une nouvelle adresse IP, de mémoriser cette adresse, la seconde bloque cette adresse si les conditions définies sont remplies.
- l'option -i eth0 permet de définir quelle interface réseau est concernée,
- l'option --dport 22 vous permet de choisir le port à contrôler,
- --seconds 60 et --hitcount 8 sont les règles qui nous intéressent le plus: elles signifient que l'on bloquera le port s'il y a 8 tentatives en moins de 60 secondes depuis la même IP.
Débloquage automatique
Bien entendu, il est intéressant de pouvoir automatiquement nettoyer la liste des IP bannies, ne serait-ce que parce que vous pourriez vous trouver banni vous-même. Pour ce faire, il suffit d'installer un crontab:
*/10 * * * * /sbin/iptables -F
Cette simple ligne va vider iptables toutes les 10 minutes.
Initialisation automatique
Au redémarrage de votre machine, ces règles seront perdues, mais il est possible de les re-créer automatiquement. Pour ce faire, créez un fichier /etc/network/if-up.d/bfa_protection qui contiendra:
#!/bin/bash [ "${METHOD}" != loopback ] || exit 0 /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
Ensuite, rendez le exécutable (chmod u+x /etc/network/if-up.d/bfa_protection) et les règles seront automatiquement créées à l'initialisation de l'interface réseau.
Suppression automatique
Pour être propre, il faut que ces règles soient supprimées lorsque l'interface réseau se désactive. Il suffit alors de créer le fichier /etc/network/if-down.d/bfa_protection qui contiendra:
#!/bin/bash [ "${METHOD}" != loopback ] || exit 0 /sbin/iptables -D INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH /sbin/iptables -D INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
Bien sûr, il faut le rendre exécutable (chmod u+x /etc/network/if-down.d/bfa_protection), et tout sera fonctionnel.
Ce billet est une traduction de Block brute force attacks with iptables par Kevin van Zonneveld, ces explications sont initialement pour Ubuntu.
Commentaires
j'ai testé ta methode de bloquage automatique sur le port 21, et j'ai pu la tésté sur un cas qui fesait des attaques brute force en méme temps que mes testes...
j'ai debrider le nombre de tentative a 3 par minutes vue que le FTP est plus lent que le ssh...
Ca ne bloque rien du tout les attaques continue a arrivé...
Jul 19 05:45:53 serveur proftpd25415: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:45:53 serveur proftpd25415: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - Maximum login attempts (3) exceeded, connection refused
Jul 19 05:45:53 serveur proftpd25415: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - FTP session closed.
Jul 19 05:45:55 serveur proftpd25416: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:45:56 serveur proftpd25416: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:45:57 serveur proftpd25416: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:45:57 serveur proftpd25416: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - Maximum login attempts (3) exceeded, connection refused
Jul 19 05:45:57 serveur proftpd25416: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - FTP session closed.
Jul 19 05:45:59 serveur proftpd25417: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:45:59 serveur proftpd25417: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:46:00 serveur proftpd25417: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:46:00 serveur proftpd25417: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - Maximum login attempts (3) exceeded, connection refused
Jul 19 05:46:00 serveur proftpd25417: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - FTP session closed.
Jul 19 05:46:02 serveur proftpd25418: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:46:03 serveur proftpd25418: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:46:04 serveur proftpd25418: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - USER tim: no such user found from ::ffff:202.144.185.36 ::ffff:202.144.185.36 to ::ffff:192.168.30.2:21
Jul 19 05:46:04 serveur proftpd25418: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - Maximum login attempts (3) exceeded, connection refused
Jul 19 05:46:04 serveur proftpd25418: serveur.WORKGROUP (::ffff:202.144.185.36::ffff:202.144.185.36) - FTP session closed.
Resultat de mon iptables -L:
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:ssh state NEW recent: UPDATE seconds: 60 hit_count: 8 TTL-Match name: SSH side: source
DROP tcp -- anywhere anywhere tcp dpt:ftp state NEW recent: UPDATE seconds: 60 hit_count: 3 TTL-Match name: FTP side: source
Est-ce que par hasard tu ne serais pas en IPV6 ? Si oui, il faut utiliser ip6tables. Mais je vais faire des tests plus approfondis.
Après avoir fait quelques recherches, il y a peut-être un conflit avec --name SSH, et de plus certains préconisent de plutôt utiliser -I (insert) que -A (append). Cela pourrait donc donner:
Bonjour,
Dans la partie débloquage automatique, tu dis d'ajouter la ligne */10 * * * * /sbin/iptables -F au crontab.
Mais si on fait ça, ça va jarter les règles de blocage automatique, non ???