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.
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.
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.
SystemMaxUse=1G
root@host:~# systemctl restart systemd-journald.service
root@host:~# apt install rsyslog
root@host:~# mkdir /var/log/nftables/
# /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:*
root@host:~# systemctl restart 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
}
root@host:~# systemctl restart logrotate.service
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/.
#!/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"
}
}
root@host:~# nft -f /etc/nftables.conf
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.
Contact :