Packet Filter : protection bruteforce SSH

Le firewall PacketFilter utilisé sur les systèmes BSD tels qu’OpenBSD et FreeBSD permet de vous protéger des attaques SSH par brute force. Etudions la mise en place d’une telle protection.
La technique consiste à ajouter les IP sources des connexions d’attaque dans une table dynamique et de bloquer toute connexion entrante durant un période définie.
Le fichier de règles PF à concevoir devra donc inclure les actions suivantes :
- déclarer la table qui va contenir les IP bannies.
- bloquer en début de filtrage les connexions entrantes des IPs présentes dans cette table.
- ajouter les options de collecte des états des connexions sur les règles que l’on souhaite protéger des attaques par bruteforce (ici le flux SSH)
Par extension, la table pourra être vidée après définition d’une période d’expiration.
Dans le fichier de règles ci-dessous, seul le trafic entrant ICMP et SSH est autorisé. La protection d’attaque par bruteforce est positionnée sur les connexions SSH :
1#
2# pf.conf
3#
4
5# macros
6
7ext_if = "re0"
8myip = "XX.XX.XX.XX"
9
10# tables
11
12table <bruteforce> persist {}
13
14# options
15
16set block-policy drop
17set skip on lo0
18set limit { states 20000, frags 5000, src-nodes 2000 }
19
20# normalization
21
22scrub in all fragment reassemble
23scrub all reassemble tcp
24scrub in all random-id
25
26# rules
27
28block all
29block quick from <bruteforce>
30antispoof quick for lo0
31
32pass out inet proto tcp all flags S/SA keep state
33pass out inet proto udp all keep state
34
35pass in on $ext_if inet proto icmp from any to any keep state
36pass out on $ext_if inet proto icmp from any to any keep state
37
38pass in on $ext_if inet proto tcp from any to any port 22 flags S/SA keep state (source-track rule, max-src-nodes 8, max-src-conn 8, max-src-conn-rate 10/60, overload <bruteforce> flush global)
Dans le cas où un client effectue une connexion réseau plus de 10 fois par minute sur le port SSH (TCP/22), il sera banni et bloqué à toute nouvelle connexion.
Pour débannir les IP collectées au bout de 24 heures par exemple, la commande suivante peut être utilisée :
# /usr/local/sbin/expiretable -t 24h bruteforce
Toutes les addresses IP dont la date d’insertion est supérieure à 24h seront supprimées.