Parfois, lors d'une mise à jours d'un serveur par exemple, il peut être intéressans de limiter l'accès SSH au seul utilisateur root.
Pour faire cela, c'est très simple: il suffit de mettre la raison dans un fichier /etc/nologin et les autres utilisateurs se verront refuser l'accès, avec comme raison le contenu du fichier.
Pour ré-autoriser l'accès, supprimez le fichier.
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.