[Précédent : Balisage de Paquets] [Index] [Suivant : Performances]
Afin de tracer les paquets passant à travers PF, le mot-clef log doit être utilisé dans les règles de NAT/rdr et de filtrage. Il est à noter que PF ne peut tracer que les paquets qu'il bloque ou qu'il laisse passer; vous ne pouvez pas créer de règle qui ne fait que du traçage de paquets.
Le mot-clef log indique à PF de tracer les paquets correspondant à la règle dans laquelle ce mot-clef figure. Dans le cas où la règle crée un état, seul le premier paquet "vu" (celui qui entraîne la création de l'état) sera tracé.
Les options qui peuvent être fournies au mot-clef log sont :
Les options sont fournies entre parenthèses après le mot-clef log; plusieurs options peuvent être séparées par une virgule ou un espace.
pass in log (all, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state
Pour lire le fichier d'événements :
# tcpdump -n -e -ttt -r /var/log/pflog
La lecture du fichier pflog à l'aide de tcpdump(8) ne donne pas un affichage en temps réel. Cependant, il est possible d'obtenir un tel affichage en utilisant l'interface pflog0 :
# tcpdump -n -e -ttt -i pflog0
REMARQUE : Lorsque vous examinez les événements, une attention particulière doit être accordée au décodage verbeux des protocoles effectué par tcpdump (décodage activé par l'option -v). Les décodeurs protocolaires de tcpdump ne possèdent pas un historique sécurité parfait. En théorie du moins, une attaque reste possible en utilisant les charges utiles partielles enregistrées par le périphérique d'enregistrement d'événements. Il est recommandé de déplacer les fichiers d'événements du pare-feu vers une autre machine avant de les traiter à l'aide de tcpdump(8).
Des précautions supplémentaires doivent êtres prises pour sécuriser l'accès aux événements. Par défaut, pflogd enregistrera 96 octets du paquet dans le fichier d'événements. L'accès aux fichiers d'événements pourrait fournir un accès partiel à des charges utiles de paquets sensibles (tels que les noms d'utilisateurs et les mots de passe telnet(1) ou ftp(1)).
# tcpdump -n -e -ttt -r /var/log/pflog port 80
Ceci peut être encore affiné en limitant l'affichage des paquets à une certaine combinaison d'hôte et de port :
# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3
La même idée peut être appliquée quand on lit les événéments directement à partir de l'interface pflog0 :
# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2
Il est à noter que ces manipulations n'ont aucun impact sur les paquets enregistrés dans le fichier d'événements pflogd; les commandes ci-dessus ne feront qu'afficher les paquets au fur et à mesure qu'ils sont enregistrés.
En plus de l'utilisation des règles de filtrage standard tcpdump(8), le langage de filtrage du tcpdump a été étendu pour lire la sortie de pflogd :
Exemple :
# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0
Cette commande affichera l'événement en temps réel créé par des paquets entrants bloqués sur l'interface wi0.
Créez le script suivant :
/etc/pflogrotate
#!/bin/sh
PFLOG=/var/log/pflog
FILE=/var/log/pflog5min.$(date "+%Y%m%d%H%M")
kill -ALRM $(cat /var/run/pflogd.pid)
if [ -r $PFLOG ] && [ $(stat -f %z $PFLOG) -gt 24 ]; then
mv $PFLOG $FILE
kill -HUP $(cat /var/run/pflogd.pid)
tcpdump -n -e -ttt -r $FILE | logger -t pf -p local0.info
rm $FILE
fi
Editez la liste des tâches cron du super-utilisateur root :
# crontab -u root -e
Ajoutez-y les deux lignes suivantes :
# effectuer une rotation du fichier d'événements
# toutes les 5 minutes 0-59/5 * * * * /bin/sh /etc/pflogrotate
Ajoutez la ligne suivante au fichier /etc/syslog.conf :
local0.info /var/log/pflog.txt
Si vous voulez les envoyer aussi à un serveur d'événements distant, ajoutez la ligne suivante
local0.info @syslogger
Assurez vous que l'hôte syslogger a bien été défini dans le fichier hosts(5).
Créez le fichier /var/log/pflog.txt afin de permettre à syslog d'enregistrer les événements dans ce fichier et donnez lui les mêmes permissions qu'au fichier pflog.
# touch /var/log/pflog.txt
# chmod 600 /var/log/pflog.txt
Relancez syslogd pour que les modifications soient prises en compte :
# kill -HUP $(cat /var/run/syslog.pid)
Tous les événements enregistrés sont maintenant envoyés vers /var/log/pflog.txt. Si la seconde ligne a été ajoutée, les événements sont aussi envoyés au serveur d'événements distant syslogger.
Le script /etc/pflogrotate traite désormais
/var/log/pflog et le supprime à la fin du traitement. La
rotation du fichier pflog par
newsyslog(8)
n'est plus nécessaire désormais et devrait être désactivée. Cependant
/var/log/pflog.txt remplace /var/log/pflog et sa
rotation devrait être activée. Modifiez /etc/newsyslog.conf
comme suit :
#/var/log/pflog 600 3 250 * ZB /var/run/pflogd.pid
/var/log/pflog.txt 600 7 * 24
PF, à l'aide du mécanisme précité, générera des événements qui seront enregistrés au format ASCII dans le fichier /var/log/pflog.txt. Si /etc/syslog.conf est configuré en conséquence, ces événements pourront aussi être envoyés à un serveur de logs distant. L'enregistrement des événements n'est pas immédiate. Elle prend jusqu'à 5-6 minutes (l'intervalle d'exécution de la tâche cron) avant que les événements enregistrés apparaissent dans le fichier.
[Précédent : Balisage de Paquets] [Index] [Suivant : Performances]