📝 Gestion des logs — Syslog et centralisation rsyslog
| Formation | BTS SIO option SISR — IRIS Mediaschool |
|---|---|
| Bloc | B2 — Administration Systèmes & Réseaux |
| Module | M2.4 | Compétence : B2.4 / Lien B3.4 |
| Durée | 3h30 |
🎯 Introduction (10 min)
En décembre 2021, la faille Log4Shell a produit des premiers scans et payloads JNDI visibles dans les access logs Apache plusieurs heures avant les premières exploitations réussies. Si une plateforme de centralisation et d'analyse en temps réel avait été en place, la détection et la mise en quarantaine des adresses sources auraient été immédiates et l'incident partiellement contenu. Cette séance pose les bases techniques permettant de centraliser des logs hétérogènes et d'en extraire des alertes exploitables.
🎯 Objectifs de la séance
À l'issue de cette séance, vous serez capable de :
- Expliquer le format RFC 5424 (PRI, TIMESTAMP, STRUCTURED-DATA) et calculer PRI à partir de facility et severity.
- Configurer rsyslog pour collecter les logs locaux, recevoir des logs réseau (UDP/TCP/TLS) et organiser les fichiers de logs avec des templates.
- Vérifier et exploiter les logs systemd (journald) et configurer la collecte d'événements Windows via Winlogbeat.
1. Comprendre le format syslog RFC 5424 (70 min)
Le RFC 5424 définit un format structuré et normalisé pour les messages syslog. Chaque message commence par un champ PRI encodant la facility et la severity :
PRI = facility × 8 + severity
Le message RFC 5424 suit la structure suivante :
<PRI>TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG
Exemple concret :
<34>1 2021-12-10T14:12:00Z debian-srv02 sshd 1234 ID47 [origin@32473 ip="192.168.10.20"] Accepted password for alice from 192.168.10.20 port 51324 ssh2
Dans cet exemple, PRI=34 provient de facility=4 (auth) et severity=2 (Critical), soit 4×8+2=34.
Tables de référence
| Valeur | Facility |
|---|---|
| 0 | kern — messages kernel |
| 1 | user — messages utilisateur |
| 2 | mail — service mail |
| 3 | daemon — démons système |
| 4 | auth — authentification & sécurité |
| 5 | syslog — messages syslog internes |
| 6 | lpr — impression |
| 7 | news — news réseau |
| Valeur | Severity |
|---|---|
| 0 | Emergency — système inutilisable |
| 1 | Alert — action immédiate requise |
| 2 | Critical — conditions critiques |
| 3 | Error — conditions d'erreur |
| 4 | Warning — avertissements |
| 5 | Notice — condition normale mais significative |
| 6 | Info — messages informatifs |
| 7 | Debug — messages de debug |
Le champ STRUCTURED-DATA
Le champ STRUCTURED-DATA permet d'encapsuler des paires clé=valeur utiles (ex : origine, identifiant de session, hôte source) sans casser le parsing automatique. Exemple :
[origin@32473 ip="192.168.10.20"]
Pourquoi RFC 5424 ?
Le RFC 5424 normalise l'horodatage (utile pour la corrélation), les métadonnées (PROCID, MSGID) et fournit un espace pour des données structurées — ceci facilite l'indexation et la recherche dans un SIEM.
Pour un message sshd de niveau Notice : facility=4 (auth), severity=5 (Notice) → PRI = 4×8+5 = 37. Pour un message kernel critique : facility=0 (kern), severity=2 (Critical) → PRI = 0×8+2 = 2.
2. Configuration et bonnes pratiques rsyslog (70 min)
Le démon rsyslog (fichier principal : /etc/rsyslog.conf et fichiers additionnels dans /etc/rsyslog.d/) est l'outil principal pour centraliser et manipuler des messages syslog sur Debian. La version moderne utilise RainerScript et des modules modulaires.
Activation des modules d'écoute UDP/TCP
Pour recevoir des logs depuis le réseau on active les modules imudp et imtcp. Exemples de lignes à ajouter dans /etc/rsyslog.conf ou dans /etc/rsyslog.d/50-listen.conf :
module(load="imuxsock") # écoute socket Unix local
module(load="imklog") # kernel messages
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# Pour lire le journal systemd via imjournal (si souhaité) :
module(load="imjournal")
Organisation des fichiers de logs — Templates
Plutôt que d'éparpiller les logs, on crée un template qui place chaque hôte dans /var/log/remote/<hostname>/<program>.log.
En RainerScript :
template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
*.* action(type="omfile" dynaFile="RemoteLogs")
En syntaxe héritée :
$Template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
Filtrage par programme
Pour séparer sshd dans un fichier dédié :
if $programname == 'sshd' then /var/log/sshd.log
& stop
Redirection distante (forward)
Pour transmettre les logs vers un collecteur distant :
# en UDP (non fiable) :
*.* @192.168.10.10:514
# en TCP (fiable) :
*.* @@192.168.10.10:514
# en TCP/TLS (mutual TLS recommandé) :
action(type="omfwd" target="192.168.10.10" port="6514" protocol="tcp"
StreamDriver.Name="gtls" StreamDriver.Mode="1" StreamDriver.AuthMode="x509/name")
TLS mutuel
Pour le TLS mutuel, il faudra générer une CA, signer un certificat serveur et un certificat client, installer les fichiers CA/server/client sur les machines et configurer StreamDriver (paramètres caCert, cert, key selon la distribution). Le TLS protège l'intégrité et l'authenticité des flux de logs — fortement recommandé sur des liaisons inter-sites publiques.
Toujours tester la réception locale avant d'ouvrir le firewall : logger "test message" puis tail -f /var/log/remote/<votre-hote>/syslog.log. Évitez d'envoyer vers un collecteur qui vous renvoie les mêmes logs.
3. journald (systemd) et intégration
systemd utilise le journal binaire ; les commandes pour l'inspection sont journalctl. Exemples utiles pour le diagnostic :
# logs unit sshd depuis 1 heure
journalctl -u sshd --since "1 hour ago"
# logs de priorité err à alert (err..alert inclus)
journalctl -p err..alert
# messages kernel uniquement
journalctl -k
Intégration journald → rsyslog
Deux approches sont disponibles :
- Option A — ForwardToSyslog : activer
ForwardToSyslog=yesdans/etc/systemd/journald.confpuissystemctl restart systemd-journald. rsyslog reçoit les messages via socket Unix. - Option B — imjournal : utiliser le module
imjournalde rsyslog pour lire directement le journal binaire et le transformer en messages syslog. Ce mode préserve davantage de métadonnées.
Le choix dépend du besoin de métadonnées et de performances.
4. Windows Event Log et Winlogbeat (20 min)
Les événements Windows sont riches et contiennent des Event IDs importants pour la sécurité opérationnelle.
| Event ID | Description |
|---|---|
| 4624 | Logon success — authentification réussie |
| 4625 | Logon failure — échec d'authentification |
| 4648 | Logon with explicit credentials — utilisation d'identifiants explicites |
| 4776 | NTLM authentication |
| 7045 | A service was installed |
| 4697 | A service was installed or suspicious service creation |
Configuration minimale Winlogbeat
Winlogbeat (outil officiel Elastic) lit les canaux Windows (Security, System, Application) et transmet les événements vers Logstash ou Elasticsearch. Exemple minimal de winlogbeat.yml :
winlogbeat.event_logs:
- name: Security
- name: System
- name: Application
# envoyer vers Logstash (option courante en architecture centralisée)
output.logstash:
hosts: ["192.168.10.10:5044"]
# ou envoyer directement vers Elasticsearch
# output.elasticsearch:
# hosts: ["http://192.168.10.10:9200"]
Winlogbeat ne produit pas nativement du syslog UDP/TCP ; il envoie via le protocole Beats (vers Logstash) ou directement vers Elasticsearch. On peut, si nécessaire, impliquer Logstash pour transformer les événements en messages syslog et les écrire dans /var/log/remote.
💻 Travaux Pratiques (120 min)
Contexte
Vous êtes technicien chez InnovatTech SARL. La direction veut un point de collecte centralisé simple pour commencer :
- debian-srv01 (192.168.10.10) — collecteur principal
- debian-srv02 (192.168.30.5) — doit envoyer ses logs
- win-srv01 (192.168.10.5) — doit envoyer ses Event Logs via Winlogbeat
Objectif
Configurer debian-srv01 pour collecter ses logs locaux, recevoir des messages syslog TCP/UDP, organiser les logs dans /var/log/remote/, et mettre en place une rotation journalière conservant 7 jours.
Prérequis techniques
- Accès root ou sudo sur debian-srv01 et debian-srv02
- Compte admin sur win-srv01
- Paquets : rsyslog installé (Debian 12)
Étape 1 — Préparer debian-srv01
# sur debian-srv01
sudo apt update && sudo apt install -y rsyslog
# créer répertoire remote
sudo mkdir -p /var/log/remote
sudo chown syslog:adm /var/log/remote
Étape 2 — Activer écoute TCP/UDP dans rsyslog
Éditez /etc/rsyslog.d/50-listen.conf et ajoutez :
module(load="imuxsock")
module(load="imklog")
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
module(load="imjournal")
Puis redémarrez et vérifiez :
sudo systemctl restart rsyslog
sudo ss -tunlp | grep 514
Étape 3 — Créer template et règle de stockage
Créez /etc/rsyslog.d/30-remote.conf :
template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
*.* action(type="omfile" dynaFile="RemoteLogs")
sudo systemctl restart rsyslog
Étape 4 — Ouvrir le firewall
sudo ufw allow 514/tcp
sudo ufw allow 514/udp
Étape 5 — Configurer debian-srv02 pour forwarder (test)
Sur debian-srv02, éditez /etc/rsyslog.d/50-forward.conf :
*.* @@192.168.10.10:514
sudo systemctl restart rsyslog
logger "Test message from debian-srv02"
Étape 6 — Configurer win-srv01 (Winlogbeat)
Sur la machine Windows, installez Winlogbeat, éditez winlogbeat.yml :
winlogbeat.event_logs:
- name: Security
- name: System
- name: Application
# Option A: envoyer vers Logstash (si installé sur 192.168.10.10)
output.logstash:
hosts: ["192.168.10.10:5044"]
# Option B: écriture locale pour test
# output.file:
# path: "C:/ProgramData/winlogbeat"
# filename: winlogbeat
Start-Service winlogbeat
Étape 7 — Vérifier l'arrivée des logs
# sur debian-srv01
ls /var/log/remote
# suivre les logs sshd d'un hôte
tail -F /var/log/remote/debian-srv02/sshd.log
Étape 8 — Configurer logrotate
Créez /etc/logrotate.d/remote :
/var/log/remote/*/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 syslog adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate || true
endscript
}
Testez la rotation :
sudo logrotate -d /etc/logrotate.d/remote
Livrable attendu
- Fichiers
/etc/rsyslog.d/50-listen.confet/etc/rsyslog.d/30-remote.conffournis (captures d'écran ou diff). - Preuve de réception :
ls /var/log/remoteettailmontrant des entrées venant de debian-srv02 et (si applicable) win-srv01. - Fichier
/etc/logrotate.d/remoteprésent et testé.
Critères de réussite
- ☐ debian-srv01 écoute bien sur le port 514 TCP/UDP.
- ☐ Les messages envoyés par debian-srv02 apparaissent dans
/var/log/remote/debian-srv02/. - ☐ Une configuration Winlogbeat documentée et testée (événements visibles ou fichiers produits).
- ☐ Logrotate tourne en mode daily et conserve 7 rotations.
📋 Synthèse (10 min)
Cette séance vous a donné les connaissances nécessaires pour comprendre le format normalisé des messages syslog (RFC 5424), pour configurer rsyslog en collecte locale et en réception réseau, et pour intégrer des événements Windows via Winlogbeat/Logstash.
Centraliser les logs permet de corréler, rechercher et historiser des événements indispensables à la détection d'incidents. Le champ PRI = facility × 8 + severity encode en un seul entier la source et la gravité du message. RFC 5424 normalise l'horodatage ISO 8601, ce qui facilite la corrélation temporelle dans un SIEM.
Expliquez en une phrase comment est calculé le champ PRI et pourquoi le RFC 5424 facilite la corrélation temporelle des logs.
ELK Stack et corrélation SIEM — nous allons indexer, parser et visualiser ces logs en temps réel, puis créer des règles d'alerte.
🎮 Quiz — Testez vos connaissances
-
Q1 (Calcul) : Quel est le champ PRI d'un message auth (facility=4) de niveau Warning (severity=4) selon RFC 5424 ?
- A) 32
- B) 36
- C) 44
- D) 48
-
Q2 (QCM) : Quel module rsyslog faut-il charger pour recevoir des messages syslog en UDP sur le port 514 ?
- A)
imtcp - B)
omfwd - C)
imudp - D)
imjournal
- A)
-
Q3 (QCM) : Quelle commande
journalctlaffiche uniquement les logs du service sshd depuis la dernière heure ?- A)
journalctl -k --since "1 hour ago" - B)
journalctl -u sshd --since "1 hour ago" - C)
journalctl -p sshd -n 100 - D)
journalctl --program=sshd --last 1h
- A)
-
Q4 (QCM) : Quel Event ID Windows signale un échec d'authentification (Logon failure) ?
- A) 4624
- B) 7045
- C) 4648
- D) 4625
-
Q5 (Vrai / Faux) : Dans rsyslog, la directive
*.* @@192.168.10.10:514envoie les logs via UDP (non fiable) vers le collecteur distant.
📝 Corrections
- B) 36 — PRI = facility × 8 + severity = 4 × 8 + 4 = 36. La formule est systématique : facility encode la source du service, severity encode la gravité.
- C)
imudp— Le moduleimudp(Input Module UDP) ouvre un socket UDP sur le port spécifié.imtcpest pour TCP,omfwdest pour le forwarding sortant,imjournallit le journal systemd. - B)
journalctl -u sshd --since "1 hour ago"— L'option-ufiltre par unité systemd,--sincelimite la plage temporelle.-kfiltre les messages kernel uniquement. - D) 4625 — L'Event ID 4625 correspond à "An account failed to log on". L'ID 4624 est le succès, 4648 est l'utilisation d'identifiants explicites, 7045 est la création d'un service.
- Faux — La double arobase
@@désigne le protocole TCP (fiable). Une seule arobase@désigne UDP (non fiable). Pour TLS, on utiliseaction(type="omfwd" ... protocol="tcp").
