[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) on $ext_if inet proto tcp to $ext_if port 22 keep state
Trace tous les paquets entrants à destination du port 22.
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 de 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 fourni avec OpenBSD 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.
Il faut d'abord créer un utilisateur, pflogger, avec un shell /sbin/nologin. La façon la plus simple de créer cet utilisateur consiste à utiliser la commande adduser(8).
Après avoir crée l'utilisateur pflogger, créez les deux scripts suivants :
/etc/pflogrotate
#!/bin/sh FILE=/home/pflogger/pflog5min.$(date "+%Y%m%d%H%M") kill -ALRM $(cat /var/run/pflogd.pid) if [ $(ls -l /var/log/pflog | cut -d " " -f 8) -gt 24 ]; then mv /var/log/pflog $FILE chown pflogger $FILE kill -HUP $(cat /var/run/pflogd.pid) fi
/home/pflogger/pfl2sysl
#!/bin/sh # feed rotated pflog file(s) to syslog # do not start if another instance of this script is already running pgrep pfl2sysl >/dev/null 2>&1 if [ $? -ne 0 ] ; then for logfile in /home/pflogger/pflog5min* ; do if [ -f "$logfile" ] ; then tcpdump -n -e -ttt -r $logfile | logger -t pf -p local0.info rm $logfile fi done 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
Créer une liste de tâches cron pour l'utilisateur pflogger :
# crontab -u pflogger -e
Ajoutez-y les deux lignes suivantes :
# alimenter le(s) fichier(s) pflog après rotation à
# syslog 0-59/5 * * * * /bin/sh /home/pflogger/pfl2sysl
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 le 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.
# touch /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]