Paquet Filter

Ceci est spécifique à OpenBSD

Lancement au boot

dans /etc/rc.conf

Vérifiez la présence de

pf=YES 
pf_rules=/etc/pf.conf

Ajout d’un fichier de configuration propre a pf, ceci est pratique en cas de maj de l’os car /etc/rc.conf peut être modifier. On ajoute les logs au passage.

/etc/rc.conf.local

pf=YES 
pf_rules=/etc/pf.conf
pflog_enable="YES"
pflog_logfile="/var/log/pflog"

Contrôle de pf avec pfctl

démarrage de pf

pfctl -e

Arrêt

pfctl -d

Test du fichier de configuration ( n dryrun ) attention l’ordre de ces options est important.

pfctl -vnf /etc/pf.conf

liste des règles actuelles

pfctl -sr 

Liste des règles avec leur numéro

pfctl -vv -sr

Chargement d’un fichier de règle

pfctl -f /etc/pf.conf

Sauvegarde dans un fichier de configuration ( attention format binaire )

pfctl -S /tmp/svgpf_conf

Chargement du fichier de config précédemment sauver par -S

pfctl -L /tmp/svgpf_conf

Configuration

Modification du fichier /etc/pf.conf

if_loc="em0"  # Ajoute une variable contenant la carte réseau
imaps_ports="143, 993"  # variables listé macro à la shorewall

Utilisation de la variable et usage des listes blocage en entrée, si le blockage en sortie est désiré utilisez block drop out …

block in on $if_loc proto tcp from { 192.168.21.0/24, 10.10.0.0/16 } to any port { 123 80 }

avec la commande

pfctl -vnf /etc/pf.conf

on obtient le résultat suivant :

block drop in on em0 inet proto tcp from 192.168.21.0/24 to any port = 123
block drop in on em0 inet proto tcp from 192.168.21.0/24 to any port = 80
block drop in on em0 inet proto tcp from 10.10.0.0/16 to any port = 123
block drop in on em0 inet proto tcp from 10.10.0.0/16 to any port = 80

Les listes c’est bien mais y a mieux a dit le monsieur : les tables !

une table en mémoire est beaucoup plus rapide, et moins coûteuse en temps processeur/mémoire que la recherche dans un jeu de règles correspondant chacune à une valeur d’une liste d’adresses.

toujours dans pf.conf

table <ip_unauthorized> const { 192.168.21.0/24, 10.10.0.0/16 }
table <blacklist> persist file "/etc/blacklist"
block in on $if_loc from { <ip_unauthorized>, <blacklist> } to any

file a un caractère optionnel.
const : table non modifiable
persist : permet l’initialisation de la table même vide et modifiable avec les commandes données ci-après

ATTENTION le fichier /etc/blacklist doit exister

sinon

/etc/pf.conf:12: cannot load "/etc/blacklist": No such file or directory

Ajout d’une ip par exemple 49.213.15.129

pfctl -t blacklist -T add 49.213.15.129/32

Retrait de la table d’une ip

pfctl -t blacklist -T delete 9.21.1.185/32

Voi le contenu des tables

pfctl -t blacklist -T show

Regarder les logs de pf en temps réel

tcpdump -nni pflog0 -e -t

regarder l’historique

tcpdump -nnr /var/log/pflog -e -ttt

Différentes directives

block  #bloque
block in log all  # block & log
pass  in|out   #si rien n'est précisez la règle évalue les deux sens de com. = accept
quick #si le paquet match cette règle le reste des règles n'est pas évaluée. 
rdr pass # = redirection des paquets
nat on # NAT
set skip lo # ne touche à aucun paquet à destination de la loopback

Règles de sécurité standard

Parle d’elle-même

antispoof for $if_loc

Normalisation = réassemble des paquets fragmentés pour analyse, permet de contrer les techniques de fragmentation en tout petit paquet pour passer les filtres des pare-feux.

match in all scrub (no-df)

Première règle à placer après les définitions de variables/liste/tables

block all

en suivant, les accept

exemples …

pass ...
rdr pass ...
nat on ...

Variables :

local_host="ip_em0_par_exemple"
udp_services = "{ dns, ntp }

Utilisées dans une règle

pass in on $if_loc inet proto tcp from any to $local_host port $udp_services

fichier de conf basique et sa traduction par PF

on vire tout sauf le ssh à destination de la machine, on se garde

#vars
if_loc="em0"
localip=192.168.21.145
sshp=22
table <blacklist> persist

antispoof for $if_loc
match in all scrub (no-df)
block in log all

set skip on lo
block drop from {<blacklist>} to  any
pass in on $if_loc proto tcp to $localip port $sshp

puis

pfctl -vnf /etc/pf.conf

traduction :

if_loc = "em0"
localip = "192.168.21.145"
sshp = "22"
table <blacklist> persist
set skip on { lo }
block drop in on ! em0 inet from 192.168.21.0/24 to any
block drop in inet from 192.168.21.145 to any
match in all scrub (no-df)
block drop in log all
block drop from <blacklist> to any
pass in on em0 inet proto tcp from any to 192.168.21.145 port = 22 flags S/SA