--- date: 2021-07-28T00:13:24+02:00 description: "Installer et utiliser pfstat, pour analyser le flux réseau IPv4 et IPv6 au-travers du parefeu PF, sous OpenBSD !" draft: false tags: ['supervision','dataviz','pfstat','OpenBSD','httpd'] title: "pfstat sur OpenBSD : analyser le flux IPv4 et IPv6 dans PF" translationKey: "monitor-pfstat-openbsd" --- ## Description **pfstat** est un projet de Daniel Hartmeir pour générer des statistiques graphiques du flux réseau qui passe au-travers du parefeu PF. - Site web officiel : https://www.benzedrine.ch/pfstat.html --- ⇒ Environnement : * OpenBSD : 6.9 ⇒ 7.1 ## Installation Classique : `# pkg_add pfstat pfstatd` Le paquet **pfstatd** n'est pas essentiel pour une configuration simple et minimale. Il devient intéressant pour être fonctionner avec un utilisateur dédié. ;-) ## Configuration ### PF En admettant que l'interface réseau est de type **em0**, modifions le fichier de configuration `/etc/pf.conf` pour ajouter : ```cfg set loginterface em0 ``` {{< note info >}} Si vous avez plusieurs interfaces réseaux, il est possible de toutes les analyser ; ligne après ligne, ajoutez chacune d'elles, si nécessaire. {{}} ### pfstat La configuration de pfstat n'est pas compliquée. Pour débuter, le package installe un fichier de configuration exemple, juste pour IPv4. - Fichier de configuration : `/etc/pfstat.conf` Il faut le modifier pour changer le chemin du répertoire de destination où seront les futures images créées pour la vision et l'analyse. En admettant toujours que l'interface reseau à analyser est **em0** : ```sh # sed -i -e 's/sis0/em0/g;s/benzedrine.cx/pfstat/g' /etc/pfstat.conf ``` La commande va changer toutes les lignes où : - l'interface **sis0** par **em0** - le chemin de publication contenant *benzedrine.cx* par *pfstat*. --- Ensuite, il suffit de configurer la crontab de root pour que le binaire **pfstat** analyse le flux réseau. ```cfg * * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db */15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db 30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db ``` - la première ligne fonctionne toutes les minutes pour analyser et enregistrer - la seconde ligne a pour propos de générer les images toutes les quinze minutes depuis la base de données de pfstat - la troisième ligne aura pour propos d'effacer toutes les jours à 0:30 les données qui sont vieilles de plus de trente jours. ⇒ Cela nécessite la création du répertoire de la future base de données : ```sh # mkdir -p /var/db/pfstat/ ``` *Juste pour info, cela peut être absolument un tout autre chemin sur le système d'exploitation, et avoir un tout autre nom de base de données. C'est à vous de voir…* --- Voilà une configuration minimale fonctionnelle ! Passons à une configuration plus poussée avec un utilisateur dédié qui va gérer et le service et l'utilisation du binaire. ### Utilisateur _pfstat L'utilisateur dédié nous sera utile pour démarrer le service pfstatd avec les droits utilisateurs de **_pfstat**, puis d'utiliser **pfstat** avec cet utilisateur… ```sh # useradd -s /sbin/nologin -d /var/db/pfstat _pfstat # chown _pfstat /var/db/pfstat ``` #### pfstatd Il suffit d'activer le service, de le paramétrer et le démarrer : ```sh # rcctl enable pfstatd # rcctl set pfstatd flags -u _pfstat -a 127.0.0.1 # rcctl start pfstatd ``` N'ayant pas paramétré de numéro de port, c'est celui par défaut, à savoir 9999, qui sera écouté. Des outils comme **nc** peuvent permettre de s'assurer du fonctionnement ; essayez `nc localhost 9999`, vous devriez avoir les statistiques qui s'affichent rapidement les unes à les suites des autres, ligne après ligne.
*Si ce n'est pas le cas, il y a un soucis…* ##### pfstatd et PF Je vous encourage vivement à bloquer au niveau du pare-feu d'OpenBSD, toutes tentatives de communications sur le service de pfstatd ! Une règle comme la suivante devrait suffire : ```cfg block drop in on ! lo0 proto tcp to port 9999 ``` #### pfstat et _pfstat Maintenant nous allons pouvoir reconfigurer l'utilisation de pfstat en tenant compte de l'utilisateur dédié **_pfstat** 1. dans un premier temps, décommentons ou supprimons les écritures dans la crontab de root, 2. pour paramétrer celle de l'utilisateur **_pfstat** : - créer un fichier de crontab, tel que **crontab4pfstat**, contenant les déclarations suivantes : ```conf * * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db -r 127.0.0.1 */15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db 30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db ``` Petites explications : - Remarquez l'usage de l'option `-r` suivie de l'adresse de bouclage localhost ; cette option nous permet d'interroger le service "à distance" pour récupèrer les statistiques et les enregistrer dans la base de données. Maintenant injections le fichier **crontab4pfstat** dans la crontab de l'utilisateur **_pfstat** : ```sh # crontab -u _pfstat crontab4pfstat ``` #### Surveillance de _pfstat Il y a différents moyens de surveiller l'activité de l'utilisateur **_pfstat** : - `top -U _pfstat` : ```sh load averages: 0.05, 0.38, 0.38 56 processes: 54 idle, 2 on processor CPU0 states: 0.0% user, 0.0% nice, 0.0% sys, 0.0% spin, 0.0% intr, 100% idle Memory: Real: 84M/5985M act/tot Free: 9778M Cache: 2757M Swap: 0K/32G PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 16833 _pfstat 2 0 700K 984K sleep/6 netcon 0:00 0.00% pfstatd ``` --- ```sh $ fstat -u _pfstat -n USER CMD PID FD DEV INUM MODE R/W SZ|DV _pfstat pfstatd 16833 wd 4,0 2 40755 r 512 _pfstat pfstatd 16833 0 4,0 27162 20666 rw 2,2 _pfstat pfstatd 16833 1 4,0 27162 20666 rw 2,2 _pfstat pfstatd 16833 2 4,0 27162 20666 rw 2,2 _pfstat pfstatd 16833 3 4,0 27028 20600 r 73,0 _pfstat pfstatd 16833 4* internet stream tcp 0x0 127.0.0.1:9999 $ ps aux -U _pfstat USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND _pfstat 16833 0.0 0.0 700 984 ?? I 1:19AM 0:00.02 /usr/local/bin/pfstatd -u _pfstat -a 127.0.0.1 ``` Ces trois commandes nous confirment que : - le service **pfstatd** est démarré avec l'utilisateur **_pfstat** - le service **pfstatd** écoute bien sur la boucle locale, sur le port 9999 et qu'il est en attente de connexion, dans le cas de ces exemples. --- Configurons maintenant httpd ! ### httpd Commençons par créer le répertoire : ```sh # mkdir -p /var/www/htdocs/pfstat/ ``` Puis occupons-nous du fichier de configuration de httpd `/etc/httpd.conf` et ajoutons les déclarations suivantes, au besoin : ```cfg types { include "/usr/share/misc/mime.types" } server "pfstat" { listen on 127.0.0.1 port 80 location "/pfstat/" { directory auto index root "/htdocs/" } } ``` Il reste à vérifier la configuration et activer/démarrer le service : ```sh # rcctl enable httpd # httpd -n && rcctl start httpd ``` Il ne reste plus qu'à consulter localement, tel que : http://localhost/pfstat --- Voilà une configuration minimale qui fonctionne et qui restituera des images. #### httpd et _pfstat Du fait d'avoir créé l'utilisateur **_pfstat**, donnons à l'utilisateur le droit d'écrire dans le répertoire web : ```sh # usermod -G www _pfstat # chown -R _pfstat:www /var/www/htdocs/pfstat ``` - ainsi nous intégrons l'utilisateur **_pfstat** au groupe web **www** - cela nous permet ensuite de pouvoir écrire dans le répertoire web --- ## PFstats **PFstats** est mon petit projet de page responsive web pour consulter de manière agréable les images générées par pfstat. Elle est conçue pour analyser des statistiques d'une heure, quotidiennes, hebdomadaires, et mensuelles, voire annuelles. - dépôt : https://tildegit.org/hucste/pfstats - N'hésitez pas à lire le fichier [README.md](https://tildegit.org/hucste/pfstats/src/branch/main/README.md) - Sous [Licence BSD 2 Clauses](https://tildegit.org/hucste/pfstats/src/branch/main/LICENSE) Voici un aperçu : {{< img a="Aperçu de la page 'pfstat.hml'" s="openbsd/pfstats.html.png" w="250" >}} --- Quelques explications : ### pfstat.conf ⇒ Le fichier de configuration pfstat.conf est configuré : - pour analyser IPv4 et IPv6, au-travers de l'interface réseau **em0**, *Modifier l'interface par la vôtre*. - pour restituer des graphiques d'une heure, quotidien, hebdomadaire, et mensuel. - et pour publier vers le répertoire de publication web `/var/www/htdocs/pfstat`. Il faut le copier à la place du fichier de configuration original. --- *Si vous analysez le fichier correctement, j'ai commenté toutes les lignes concernant le traitement des queues ; en effet quand les lignes sont actives, pfstat se plaint et s'arrête avec le message suivant* :
`/etc/pfstat.conf:61: ALTQ-style queues not supported anymore` Il semble que ce ne soit plus supporté ! ### pfstat.html Copier les fichiers .css, .js, et .html dans le répertoire de publication web ### convert-img.sh ⇒ Ce script shell sert à convertir les images JPEG générées par pfstat au format avif, et webp. Il nécessite l'installation des paquets **libavif**, et **libwebp**. - Ajoutez l'utilisateur **_pfstat** au groupe de votre utilisateur, puis - donnez les droits nécessaires sur le script shell ```sh # usermod -G votre-identifiant-utilisateur _pfstat # chmod 0750 /home/votre-identifiant-utilisateur/pfstats/convert-img.sh ``` {{< note info >}} La génération des images au format AVIF est un peu lente ; ce qui n'est pas le cas des images Webp. Cela dépend aussi de la puissance machine. {{}} ### pfstats et crontab Il faudra modifier la deuxième ligne de la crontab de l'utilisateur **_pfstat**, tel que : ```cfg 15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db; /dir/convert-img.sh ``` Ainsi se déroulent les étapes suivantes : - la création des images se fait à l'heure programmée - le script de conversion d'images s'exécute ### pfstats et httpd Pour gérer correctement les images au format avif et webp, il peut être nécessaire de modifier légérement la configuration d'httpd, pour ajouter dans le bloc de directives **types** : ```cfg image/avif avif ``` Tel que : ```cfg types { include "/usr/share/misc/mime.types" image/avif avif } ``` ⇒ Pour vérifier le support du format webp : ```sh $ grep webp /usr/share/misc/mime.types image/webp webp ``` Si la commande n'affiche aucun résultat, alors il faudra ajouter au bloc **types** : `image/webp webp`. *Depuis OpenBSD 6.9, ce n'est pas nécessaire.* ### pfstats et nginx Si vous êtes plutôt un fan de nginx, lisez mes articles suivants pour savoir comment gérer : - le format avif : {{< inside "web/nginx/nginx-image-avif" >}} - le format webp : {{< inside "web/nginx/nginx-image-webp" >}} Il vous suffit d'adapter la configuration pour la consultation de la page web de pfstats. ## Dépannage ### ALTQ-style queues not supported anymore Le message complet est le suivant : `/etc/pfstat.conf:61: ALTQ-style queues not supported anymore` Il semble que l'analyse des queues ne soit plus possible. Supprimez ou **commentez** toutes lignes relatives. *Dans le fichier de configuration que je fournis, elles sont commentées, juste au cas où ce serait une erreur de compréhension ou qu'il me manque une information pour les rendre fonctionnelles.* ### dbopen: /var/db/pfstat/pfstat.db: No such file or directory Avez-vous bien pensé à créer le répertoire ; vérifiez ! --- Voilà ! --- ## Documentations ⇒ Projet **PFstats** : https://tildegit.org/hucste/pfstats ⇒ Qui supportent ces formats : - https://caniuse.com/avif - https://caniuse.com/webp --- - [https://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html](https://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html) ---