[OpenBSD]

[Précédent : Balisage de Paquets] [Index] [Suivant : Performances]

PF : Journal des Evénements


Table des Matières


Introduction

Lorsqu'un paquet est enregistré par PF, une copie de l'en-tête est envoyée à une interface pflog(4) ainsi que des informations supplémentaires telles que l'interface sur laquelle transitait le paquet, l'action que PF a entreprise (pass ou block), etc. L'interface pflog(4) permet aux applications utilisateur de recevoir les événements enregistrés par PF à partir du noyau. Si PF est activé lors du démarrage du système, le service pflogd(8) est démarré. Par défaut, pflog(8) écoute sur l'interface pflog0 et enregistre tous les événements reçus dans le fichier /var/log/pflog.

Traçage De Paquets

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 :

all
Tous les paquets seront tracés et pas uniquement le paquet initial. Utile pour les règles à état.
to pflogN
Tous les paquets correspondants seront enregistrés par l'interface pflog(4) spécifiée. Par exemple, lorsque spamlogd(8) est utilisé, tout le trafic SMTP peut être enregistré par une une interface pflog(4) dédiée. Le service spamlogd(8) peut alors être configuré pour écouter sur cette interface. Ceci permet de garder le fichier d'événements principal propre de tout trafic SMTP qui n'aurait pas dû figuré dans les fichiers journaux. Utilisez ifconfig(8) pour créer des interfaces pflog(4). L'interface par défaut pflog0 est créée automatiquement.
user
Trace aussi les identifiants UNIX utilisateur et groupe qui possèdent la socket à partir de laquelle le paquet est émis ou vers laquelle il est destiné (socket local bien entendu), en plus des informations standard.

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

Lire un Fichier d'Evénements

pflogd écrit le fichier d'événements dans un format binaire compatible tcpdump(8). Il ne peut donc n'être analysé que par tcpdump(8) ou tout autre outil acceptant des fichiers dans ce format.

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)).

Filtrer les Evénements en Sortie

Etant donné que pflogd enregistre les événements au format binaire tcpdump, la totalité des fonctionnalités tcpdump peut être utilisée pour analyser les événements. Par exemple, pour voir uniquement les paquets qui correspondent à un certain port :
# 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.

Enregistrement des Evénements à Travers Syslog

Dans plusieurs situations, il est souhaitable de disposer des événements enregistrés par le pare-feu sous format ASCII ou de les envoyer à un serveur d'événements central distant. Tout ceci peut être effectué par un petit script shell, quelques modifications mineures aux fichiers de configuration d'OpenBSD, et syslogd(8), le service qui permet d'enregistrer les événements. Syslogd enregistre les événements au format ASCII et il est aussi capable de les envoyer à un serveur d'événements distant.

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]


[back] www@openbsd.org
$OpenBSD: logging.html,v 1.29 2008/01/13 13:43:34 tobias Exp $