Monthly Archive for May, 2008

Filtrer un client FTP local au firewall Packet Filter

Le titre du film pourrait être “Client FTP protégé par un pare-feu PF” et il manque cruellement à la FAQ OpenBSD. En effet, ftp-proxy est au poil pour protéger les clients derrière l’interface interne du pare-feu (poétiquement nommée $int_if). Cependant, avez-vous déjà essayé de filtrer le trafic FTP issu d’un programme client local à la machine protégée par PF (machine mono interface avec une adresse publique dans mon cas) ?

Moi oui et c’est la misère car pour faire rentrer le trafic client dans le ftp-proxy on doit passer par une règle de type rdr. Or, si le trafic FTP est issu de la machine elle même (cad avec comme source l’interface de sortie vers le serveur FTP) alors PF ne le fait pas passer dans le règles de réécriture type redirection de port. Donc la transaction FTP n’est pas déroutée vers ftp-proxy. Heureusement, j’ai des amis talentueux (et chanceux). Nono m’a envoyé ce un lien vers ce thread . La solution était là : il faut utiliser les possibilités de routage de PF.

La solution est de dérouter le trafic issu de notre interface réseau et à destination du port 21 vers lo0. Ensuite lo0 va renvoyer le trafic vers notre interface réseau. Cette fois ci, la transaction va passer “à travers” notre interface réseau et va donc être soumise au règle de rdr. Après ça rentre comme papa dans maman. La seule restriction est de bien faire attention à ne pas avoir un set skip on lo0 sinon le paquet part bien vers lo0 mais ne reviens jamais.

En pratique dans le pf.conf :

nat-anchor “ftp-proxy/*”
rdr-anchor “ftp-proxy/*”
rdr pass proto tcp from ($int_if) to any port 21 -> 127.0.0.1 port 8021

pass out on $int_if route-to lo0 proto tcp from ($int_if) to any port 21
pass out quick on $int_if proto tcp from ($int_if) to any port 21 user proxy

Voila, maintenant vous pouvez faire du FTP depuis votre machine en utilisant ftp-proxy.

Bloquer les bruteforces SSH juste avec PF

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