Packet Filter : Lutter contre le bruteforce

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

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

Configuration File /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:

Configuration File /etc/pf.conf
 table <ssh-bruteforce> persist
 block in quick from <ssh-bruteforce>
 pass in quick on $external inet proto tcp from any to any port ssh flags S/SA keep state ( max-src-conn-rate 2/10, overload <ssh-bruteforce> flush global)

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 :

Command pfctl
pfctl -t bruteforce -T show

Pour supprimer une IP blacklistée ou toutes :

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

Configuration File /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 :

Configuration File /etc/pf.conf
#       $OpenBSD: pf.conf,v 1.34 2007/02/24 19:30:59 millert Exp $
#
# See pf.conf(5) and /usr/share/pf for syntax and examples.
# Remember to set net.inet.ip.forwarding=1 and/or net.inet6.ip6.forwarding=1
# in /etc/sysctl.conf if packets are to be forwarded between interfaces.
 
ext_if="trunk0"
 
set skip on lo
 
scrub in all 
 
# Whitelist / Blacklist table
table <blacklist> persist
table <whitelist> persist file "/etc/ssh/whitelist"
 
# Block SSH bruteforce
pass in on $ext_if proto tcp from !<whitelist> to $ext_if port 22 \
        flags S/SA keep state \
        (max-src-conn-rate 3/60, \
         overload <blacklist> flush global)
 
# Allow Whitelist
pass in on $ext_if proto tcp from <whitelist> to $ext_if port 22 flags S/SA keep state
 
# Block the ssh bruteforce bastards
block drop in on $ext_if from <blacklist>
pass in on $ext_if from <whitelist>
 
# Allow all outbound traffic :
pass out inet proto tcp from $ext_if to any flags S/SA keep state
pass out inet proto { udp, icmp } from $ext_if to any keep state

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 :

Command 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