Un serveur rsyslog avec authentification TLS
Sommaire
Bonjour à tous ! Aujourd'hui un article pour parler d'une chose simple : la configuration de la solution rsyslog sur un serveur GNU/Linux en utilisant les bonnes pratiques de sécurité : l'authentification par certificat TLS.
Le but étant de centraliser les logs en les chiffrant au passage pour ne pas tout faire transiter en clair sur le réseau (et oui, il faut même chiffrer les flux internes... Surtout les logs avec des DCP.).
Introduction
Que ça soit pour des raisons réglementaires (bonjour ISO27001/HDS), légales, que sais-je, vous aurez probablement besoin de stocker/centraliser vos logs. Je bossais déjà sur des sujets similaires il y a 8 ans et les moyens pour les collecter ont bien évolués : Elastic Agent, Agent (Wazuh par exemple), API, scraping, etc.
Il existe autant de solution que de log à récupérer (ce qui fait qu'à la fin généralement, ça ressemble plus à rien).
Pour notre cas, le but va simplement être de faire une configuration pour rsyslog en utilisant TLS sur un serveur Ubuntu 24.04.
Pourquoi rsyslog
Comme indiqué au-dessus, on va parler de rsyslog et d'Ubuntu. J'ai de mon côté utilisé rsyslog car il est présent nativement sur les machines Ubuntu et c'est ce que j'ai en majorité sur mon parc serveur.
De plus, cela permet d'utiliser le protocole syslog qui permet de récupérer de manière unifiée les logs de différents équipements. Si comme moi vous devez récupérer des informations venants de plusieurs sources : équipements réseaux (FW, switch), hyperviseur, etc. vous n'avez pas vraiment le choix. C'est généralement la solution utilisée pour faire la centralisation des logs "à plat" avant de transférer ça dans des outils comme Elastic et Wazuh.
Pour prendre l'exemple de Wazuh, cela permet d'installer un agent et de lever des alertes pour tout ce qui n'est pas adressable via des agents.
Et bien entendu, RSYSLOG est un outil libre disponible sur plusieurs plateformes, sa documentation officielle est disponible ici :
Présentation rapide de l'infrastructure
Côté configuration, on aura donc un client et un serveur (classique), dans notre cas on va s'occuper principalement du côté serveur, côté client il y a X moyens d'envoyer des logs : interface dédiée, rsyslog client, etc.
Je ne vais pas reprendre les éléments pour créer / générer des certificats, cela a déjà été fait sur le site à plusieurs reprises.
J'ai de mon côté utilisé des certificats issus d'une PKI interne mais vous pouvez adapter à votre besoin, vous pouvez même utiliser des certificats auto-signé.
Dans cette configuration, le port rsyslog pour TLS est le 6514/TCP
.
Configuration côté serveur
Quelques précisions :
- Chaque configuration (client / serveur) dispose d'une paire de certificat/clé pour l'authentification et pour le chiffrement venant de la même autorité de certification.
- Le CN côté client permet seulement au serveur de l'authentifier correctement dans la configuration, un enregistrement DNS n'est pas nécessaire.
- Les configurations présentées utilisent la nouvelle version des configurations de rsyslog et utilisent
gtls
.
Gestion des droits & dépendances
Les certificats peuvent être placés dans /etc/rsyslog.d/certs
avec les droits suivants :
1mkdir /etc/rsyslog.d/certs
2chown /etc/rsyslog.d/certs syslog:adm
3chmod 640 /etc/rsyslog.d/certs/*
Il faut aussi vérifier si rsyslog-gnutls
est installé sur le système, comme ryslog
:
1$ dpkg -l | grep rsyslog
2ii rsyslog 8.2502.0-0adiscon1noble3 amd64 reliable system and kernel logging daemon
3ii rsyslog-gnutls 8.2502.0-0adiscon1noble3 amd64 TLS protocol support for rsyslog (GnuTLS)
Et voir si le service est lancé/activé :
1$ systemctl is-enabled rsyslog
2enabled
3$ systemctl status rsyslog
4● rsyslog.service - System Logging Service
5 Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
6 Active: active (running) since Wed 2025-07-09 15:29:29 CEST; 1 day 6h ago
Configuration rsyslog server
Configuration rsyslog avec authentification TLS
Les configurations de rsyslog sont disponibles dans le dossier /etc/rsyslog.d/
. Le fichier de configuration principal lui est disponible ici /etc/rsyslog.conf
.
La bonne pratique est de ne pas modifier le fichier source mais de créer des configurations dans le répertoire dédié.
Voici une configuration côté serveur prenant en compte l'authentification TLS :
1module(
2load="imtcp"
3StreamDriver.Name="gtls"
4StreamDriver.Mode="1"
5StreamDriver.Authmode="x509/name"
6PermittedPeer="server-prod-01.dc.local"
7)
8
9global(
10 DefaultNetstreamDriver="gtls"
11 DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/syslog.dc.local.pem"
12 DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/syslog.dc.local.pem"
13 DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/syslog.dc.local.key"
14)
15
16input(
17 type="imtcp"
18 port="6514"
19)
Le PermittedPeer
renseigne ici le CN du certificat du client, en sachant qu'il est possible de passer un tableau en argument.
Le mode StreamDriver.Authmode="x509/name"
permet lui de faire une validation full du certificat :
Les élements renseignés dans global
correspondent à la configuration TLS server.
Configuration rsyslog avec authentification TLS sans la même autorité
La configuration dans ce cadre est différente car sur rsyslog il n'est (apparemment) pas possible de mettre en place une configuration spécifique pour l'authentification par certificat client.
C'est à dire qu'il n'est pas possible de mettre un certificat serveur validé par une autorité publique et de s'authentifier dans le même temps avec un certificat issu d'une autorité interne.
Cela peut être utile notamment dans le cas où vous avez besoin d'exposer un service rsyslog sur internet pour récupérer des traces de services externes. Vous pourrez donc exposer un certificat public en utilisant un certificat interne pour l'authentification.
Pour faire tout de même une configuration propre et ne pas exposer de certificat interne, la configuration suivante est appliquée :
1module(
2load="imtcp"
3StreamDriver.Name="gtls"
4StreamDriver.Mode="1"
5StreamDriver.Authmode="x509/fingerprint"
6StreamDriverPermittedPeers="SHA256:84:DF:81:D6:06:BA:XX:XX:X...........X:XX:XX:41:4A:6C:15:B3:32:C3:F0:64"
7)
8
9global(
10 DefaultNetstreamDriver="gtls"
11 DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/syslog.dc.local.pem"
12 DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/syslog.dc.local.pem"
13 DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/syslog.dc.local.key"
14)
15
16input(
17 type="imtcp"
18 port="6514"
19)
Ou le StreamDriverPermittedPeers
est directement le hash du certificat client installé sur la machine distante.
On utilise donc StreamDriver.Authmode="x509/fingerprint"
pour bypasser cette problématique et filtrer spécifiquement sur le hash du certificat.
Commandes pour récupérer le hash :
openssl x509 -noout -in mycert.pem -fingerprint
openssl x509 -noout -in mycert.pem -fingerprint -sha256
openssl x509 -noout -in sentinel.crt -fingerprint -sha256 | sed 's/^sha256 Fingerprint=/SHA256:/I'
Configuration rsyslog sans authentification TLS
Il est possible de faire la même chose sans pour autant demander un certificat client et une authentification. Cette configuration permet seulement de chiffrer les flux avec TLS.
1module(
2 load="imtcp"
3 StreamDriver.Name="gtls"
4 StreamDriver.Mode="1"
5 StreamDriver.Authmode="anon"
6)
7
8global(
9 DefaultNetstreamDriver="gtls"
10 DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/syslog.dc.local.pem"
11 DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/syslog.dc.local.pem"
12 DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/syslog.dc.local.key"
13)
14
15input(
16 type="imtcp"
17 port="6514"
18)
Sortie des logs
Les configurations présentées permettent d'envoyer les logs vers la sortie syslog /var/log/syslog
, si vous voulez appliquer des configurations spécifiques, voici des exemples. Ces configurations sont à rajouter à la suite de la configuration.
Sortie avec filtre sur une chaine de caractères
1if ($msg contains "example") then {
2 action(
3 type="omfile"
4 file="/var/log/example.log"
5createDirs="on"
6 )
7 stop
8}
Sortie avec filtre par IP
1if $fromhost-ip == '192.168.1.42' then {
2 action(type="omfile" file="/var/log/clients/client42.log" createDirs="on")
3 stop
4}
Sortie avec filtre IP dynamique
1template(name="PerHostLog" type="string" string="/var/log/per-host/%fromhost-ip%.log")
2
3if ($msg contains "example") then {
4 action(
5 type="omfile"
6 dynaFile="PerHostLog"
7 createDirs="on"
8 )
9 stop
10}
Commandes en vrac
- Tester votre configuration rsyslog avant de redémarrer le service :
rsyslogd -N1
- Tester votre configuration TLS avec openssl :
openssl s_client IP_SERVEUR:6514
Conclusion
Et voilà, vous avez tout maintenant pour configurer votre serveur rsyslog. J'ai écrit cela car j'ai quand même un peu galéré à trouver les informations et à sortir une configuration propre et fonctionnelle avec la doc de rsyslog qui est un peu (beaucoup) approximative.
J’espère que cet article vous aura plu, si vous avez des questions ou des remarques sur ce que j’ai pu écrire n’hésitez pas à réagir avec moi par mail ou en commentaire ! N’hésitez pas à me dire également si ce genre d’article vous plaît !
Merci pour votre lecture et à bientôt !
Mickael Rigonnaux @tzkuat