Les scans SSH sont une véritable plaie.
Il existe une multitude d’outils pour les stopper (sshguard, fail2ban, snort-inline etc.).
Ces outils ont tous des aspects assez contraignants :
- Ils ajoutent une “couche” logicielle supplémentaire (soit sous forme de scripts interprétés, soit d’exécutable compilés) qui manipulent vos fichiers de logs.
- Il faut les maintenir, suivre leurs évolutions et mises à jour.
- Ces couches sont elles même susceptibles de contenir des vulnérabilités.
Ce court billet va vous expliquer comment utiliser des fonctionnalités de Packet Filter (Pare-feu *BSD) pour mettre fin aux scans SSH. Tout est à réaliser dans votre fichier de configuration de PF (pf.conf).
Tout d’abord, il nous faut déclarer une table pour stocker les IP des brutes épaisses.
table <ssh-brute> persist
Cette table va nous permettre de bloquer le trafic issu de ces hôtes indélicats.
block quick from <ssh-brute>
Enfin, nous allons nourrir cette table avec la règle suivante :
pass in on $ext_if proto tcp from any to ($ext_if) port ssh keep state (max-src-conn-rate 2/20, overload <ssh-brute> flush global)
Explications : cette règle qui match les connexions entrantes sur le port 22 (ssh) n’autorise pas plus de deux connexions issues de la même IP¨sur une durée de 20 secondes (max-src-conn-rate 2/20). En cas de dépassement de ces paramètres l’hôte est ajoutée dans la table ssh-brute (overload <ssh-brute>) et ses connexions en cours sont coupées (flush global).
Pour gérer la péremption des enregistrements dans la table <ssh-brute> on peut utiliser le port expiretable disponible dans l’arbre des ports FreeBSD et OpenBSD. Un simple ajout de la ligne suivante dans votre crontab donne une durée de vie de 24 heures aux enregistrements /usr/local/sbin/expiretable -t 24h ssh-brute
Merci !
C’est ce dont j’avais besoin!
1.
Peut-on l’adapter à un pare-feu de site et non pas un pare-feu local. Peut-être en changeant la règle “pass” au niveau des “from”-”to” ?
pass in on $ext_if proto tcp from any to port ssh keep state (max-src-conn-rate 2/20, overload flush global)
2.
Quelle version de PF/openbsd supporte les options spéciales après “keep state” sur la ligne de la gègle ?
Cordialement.
François Tamone
Salut François,
Les réponses :
1) En fait dans la règle “pass in on $ext_if proto tcp from any to ($ext_if) port ssh keep state (max-src-conn-rate 2/20, overload flush global)” tu remplaces le ($ext_if) par l’IP (jamais de FQDN dans un fichier de règles de pare-feu
) de ton serveur SSH.
2) Je ne sais pas. Ca doit quand même dater. SI tu as un doute regarde dans le man associé au pf.conf.
Salut garnett,
Je me suis mis à FreeBSD (à cause de Rémi et toi). J’ai envie d’utiliser cette règle mais je me pose une question.
Si je reprends exactement ce que tu as fait, que je me connecte deux fois en ssh en 20 secondes, ces connexions ne sont pas bloquées mais mon adresse IP se retrouve dans la table et je me retrouve dans l’impossibilité de me reconnecter dans les 24 heures suivantes.
J’ai bien compris ? C’est bien ça ?
Parce que ça me parait trop restrictif. Je modifierais surement le “max-src-conn-rate” si c’est le cas.
Hello Ideal Gender,
L’idée c’est que le connrate te permets de fixer une limite au delà de laquelle ton IP est ajoutée dans une table PF.
Il faut ensuite blocker explicitement les hôtes de cette table avec une règle “block”.
On notera que cette règle ne protège pas contre les DDoS, les scans lents etc.
Mais quel outil le fait ? Je suis curieux de vos retours !