Packet Filter : Lutter contre le bruteforce
Contents
1 Introduction
Vous avez surement déja vu dans vos logs de connexion des tentatives de connexion par attaque bruteforce (sshd, httpd, ftpd...). C’est chiant, ca remplit vos logs, et ca fait loader votre serveur qui n’avait pas besoin de ca.
Heureusement, l’ami Daniel Hartmeier pense à vous, et a ajouté des options convi à son fameux firewall PacketFilter, affectueusement surnommé PF. Il s’agit de ‘max-src-conn-rate’ et de ‘max-src-conn’, a utiliser en combinaison avec ‘overload’. Ces options sont disponibles dans PF à partir d’OpenBSD 3.7, FreeBSD 6.0 et NetBSD 2.0.
2 Configuration de PF
Ca se passe donc dans le fichier de conf de pf, /etc/pf.conf. Je donne l’exemple pour ssh, mais le principe est le même pour les autres ports.
Avant, pour autoriser les connexions ssh de l’extérieur, on avait une ligne ressemblant à cela (avec $external le nom de son interface réseau externe) :
/etc/pf.conf |
pass in quick on $external inet proto tcp from any to any port ssh flags S/SA keep state |
Il suffit de remplacer ces lignes par:
Dans l’ordre :
- on crée une table qui va conserver les ip des attaquants
- on bloque tout ce qui provient de ces ips
- on autorise les connexions ssh si il y a moins de 2 tentatives de connexion en 10 secondes
- sinon on enregistre l’ip dans la table, et on détruit toutes les connexions correspondant à cette ip.
Évidemment, on peut personnaliser la fréquence des tentatives de connexion, et utiliser aussi ‘max-src-conn’ pour limiter le nombre total de connexions provenant d’une ip.
Voila, à vous la tranquillité, et adieu les attaques bêtes et méchantes !!
2.1 Manager les IP blacklistées
Pour afficher la liste des IP blacklistées :
pfctl |
pfctl -t bruteforce -T show |
Pour supprimer une IP blacklistée ou toutes :
pfctl |
pfctl -t bruteforce -T delete @IP pfctl -t bruteforce -T flush |
2.2 Ajouter une Whitelist
Pour ceux qui souhaiteraient ajouter une whitelist, voici les lignes a rajouter :
/etc/pf.conf |
table <whitelist> persist file "/etc/ssh/whitelist" pass in on $ext_if proto tcp from <whitelist> to $ext_if port 22 flags S/SA keep state |
Ici, il faut donc que le fichier /etc/ssh/whitelist soit rensigné avec les IP à whitelister.
3 Exemple de configuration
Si malgré tout ça, certains se retrouvent encore dans le flou, voici un exemple de configuration :
Ici, la dernière règle entre whitelist et blacklist est whitelist. Pour la simple et bonne raison que c'est la dernière règle qui match qui est prise en compte. Donc ça nous permet que même si on se fait blacklisté parcequ'on a pas réussi à se connecter au bout de x tentatives, du fait qu'on soit dans la whitelist, ça passe.
On oublies pas de reloader la conf :
pfctl |
pfctl -f /etc/pf.conf |
4 Références
http://www.openbsd.org/faq/pf/fr/filter.html
http://wiki.gcu.info/doku.php?id=bsd:pf_et_bruteforce&s=ssh