rss logo

Comment gérer les journaux nftables avec Rsyslog et Logrotate

Rsyslog Logo

Intro

En raison d'obligations légales sur un réseau public ouvert, j'ai dû travailler sur la gestion des journaux de connexions réseau. L'architecture était basée sur une Debian 12 bookworm, qui servait de passerelle Internet pour des clients, avec nftables pour le pare-feu. L'objectif était de journaliser tous les paquets traversant le routeur, en récupérant les informations suivantes : l'adresses MAC, les IPs de destination et les protocoles utilisés.

  • Mes exigences étaient assez simples :
    • Séparer les journaux nftables et les enregistrer dans un fichier spécifique.
    • Avoir un historique d'un an des journaux collectés de nftables.

Le problème est qu'avec l'implémentation de systemd, tous les messages système sont désormais gérés par celui-ci. Malheureusement, ce n'est pas très configurable (ou alors je suis peut-être juste un gros nul 😅). En effet, je n'ai pas trouvé de moyen de faire ce que j'ai décrit plus haut avec systemd. Pour répondre à mes besoins, j'ai me suis tourné vers Rsyslog pour trier les messages des journaux et logrotate pour gérer l'historique. Pour être précis, Rsyslog ne remplace pas systemd/journal. En fait, il se contente de récupérer les journaux de ce dernier et nous permet de répondre aux besoins énoncés ci-dessus.

Contrôler la taille de systemd/journal

En fonction du nombre de clients et de leur utilisation, la taille du fichier systemd/journal peut devenir assez importante en très peu de temps. Par défaut, sa taille est limitée à 10 % de la taille du système de fichiers sous-jacent et plafonnée à 4 Go. Consultez ce lien pour plus d'informations : https://wiki.archlinux.org/. Dans tous les cas, je vais d'abord définir une taille maximale de 1 Go pour le fichier systemd/journal. Comme expliqué, nous n'en avons plus vraiment besoin, car Rsyslog écrira les mêmes événements dans /var/logs/syslog et (c'est ce que nous allons configurer) dans /var/logs/nftables/ pour les journaux de nftables.

  • Pour limiter la taille de systemd/journal à 1 Go, éditez le fichier /etc/systemd/journald.conf :
SystemMaxUse=1G
  • Et redémarrez le service systemd/journal :
root@host:~# systemctl restart systemd-journald.service

Configurer Rsyslog

  • Installez le package Rsyslog :
root@host:~# apt install rsyslog
  • Créez un répertoire nftables pour les journaux :
root@host:~# mkdir /var/log/nftables/
  • Et modifiez le fichier /etc/rsyslog.conf :
# /etc/rsyslog.conf configuration file for rsyslog # # For more information install rsyslog-doc and see # /usr/share/doc/rsyslog-doc/html/configuration/index.html ################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") ########################### #### GLOBAL DIRECTIVES #### ########################### # # Set the default permissions for all log files. # $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf ############### #### RULES #### ############### # la règle regex ci-dessous permet de matcher les logs traditionnels de nftables, qui prennent la forme suivante : IN=interface1 OUT=interface2. # Chaque « match » sera écrit dans /var/log/nftables/nftables.log :msg, regex, "IN=[A-Za-z0-9_]* OUT=" -/var/log/nftables/nftables.log # & stop signifie que le match n'écrira pas dans un autre fichier & stop # # Log anything besides private authentication messages to a single log file # *.*;auth,authpriv.none -/var/log/syslog # # Log commonly used facilities to their own log file # auth,authpriv.* /var/log/auth.log cron.* -/var/log/cron.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log # # Emergencies are sent to everybody logged in. # *.emerg :omusrmsg:*
  • Redémarrez le service Rsyslog afin que la configuration soit prise en compte:
root@host:~# systemctl restart rsyslog

Configurer logrotate

  • Modifiez le fichier /etc/logrotate.d/rsyslog :
/etc/logrotate.d/rsyslog /var/log/syslog /var/log/mail.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/cron.log { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } /var/log/nftables/nftables.log { rotate 365 size 100M daily missingok notifempty compress delaycompress postrotate /usr/lib/rsyslog/rsyslog-rotate endscript dateext dateformat .%Y.%m.%d dateyesterday }
  • Explication des différentes options :
    • rotate 365 : Conserve jusqu'à 365 fichiers journaux tournants. Les journaux plus anciens seront supprimés.
    • size 100M : Fait tourner le fichier journal lorsqu'il atteint 100 Mo.
    • daily : Spécifie une rotation quotidienne du fichier journal.
    • missingok : Ignore les erreurs et avertissements si le fichier journal est manquant.
    • notifempty : Ne fait pas tourner le fichier journal s'il est vide.
    • compress : Compresse les fichiers journaux tournants pour économiser de l'espace.
    • delaycompress : Retarde la compression du fichier journal le plus récent jusqu'au prochain cycle de rotation.
    • postrotate : Recharge rsyslog pour s'assurer qu'il utilise le nouveau fichier journal tourné.
    • dateext : Ajoute une extension basée sur la date aux fichiers journaux tournants.
    • dateformat .%Y.%m.%d : Spécifie le format de la date pour l'extension des fichiers journaux sous la forme Année.Mois.Jour.
    • dateyesterday : Utilise la date d'hier pour l'extension de date des fichiers journaux tournants.
  • Redémarrez le service logrotate :
root@host:~# systemctl restart logrotate.service

Configurer nftables pour créer des journaux sur des règles spécifiques

Comme expliqué, j'avais besoin d'enregistrer les adresses MAC, les protocoles et les adresses IP. Pour ce faire, il suffit d'ajouter la mention log flags ether à nos règles nftables. Utilisez all pour activer tous les drapeaux. Consultez la page officielle pour voir les autres drapeaux ici : https://wiki.nftables.org/wiki-nftables/.

  • Par exemple, dans une configuration complète de nftables :
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; policy accept; } chain forward { type filter hook forward priority 0; policy drop; #by default, we drop traffic ct state invalid drop ip saddr 192.168.1.0/24 tcp dport { http, https } ct state { new, related, established } counter log flags ether accept comment "accept WEB" ip saddr 192.168.1.0/24 udp dport { domain, ntp } ct state { new, related, established } counter log flags ether accept comment "DNS" ip saddr 192.168.1.0/24 icmp type { echo-reply, echo-request} counter log flags ether accept comment "allow icmp" ip daddr 192.168.1.0/24 ct state { established, related } counter accept } chain output { type filter hook output priority 0; policy accept; } } table ip my_nat { chain my_masquerade { type nat hook postrouting priority 100; policy accept; ip daddr != { 192.168.1.0/24 } oifname "wan" masquerade comment "outgoing NAT" } }
  • Recharger les règles de nftables :
root@host:~# nft -f /etc/nftables.conf
  • Vous devriez voir un fichier apparaître dans le dossier /var/log/nftables :
root@host:~# ls /var/log/nftbles/ total 1,9G -rw-r----- 1 root adm 457M 6 déc. 20:14 nftables.log

Notez la taille du fichier journal, qui est supérieure à la taille définie dans le fichier de configuration /etc/logrotate.d/rsyslog. Cela s'explique par le fait que logrotate est exécuté une fois par jour. Il n'est pas déclenché une fois qu'une condition est remplie, mais seulement si elle est remplie lorsqu'il est exécuté à 00:00.

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

contact mail address