📝 Gestion des logs — Syslog et centralisation rsyslog

Bloc 2 Module 2.4 Séance 1 3h30 BTS SIO SISR
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Administration Systèmes & Réseaux
ModuleM2.4 | Compétence : B2.4 / Lien B3.4
Durée3h30

🎯 Introduction (10 min)

🔥 Accroche — Log4Shell (décembre 2021)

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

ValeurFacility
0kern — messages kernel
1user — messages utilisateur
2mail — service mail
3daemon — démons système
4auth — authentification & sécurité
5syslog — messages syslog internes
6lpr — impression
7news — news réseau
ValeurSeverity
0Emergency — système inutilisable
1Alert — action immédiate requise
2Critical — conditions critiques
3Error — conditions d'erreur
4Warning — avertissements
5Notice — condition normale mais significative
6Info — messages informatifs
7Debug — 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.

💡 Astuce — Calculer PRI rapidement

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.

⚠️ Attention — Boucles de forwarding

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=yes dans /etc/systemd/journald.conf puis systemctl restart systemd-journald. rsyslog reçoit les messages via socket Unix.
  • Option B — imjournal : utiliser le module imjournal de 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 IDDescription
4624Logon success — authentification réussie
4625Logon failure — échec d'authentification
4648Logon with explicit credentials — utilisation d'identifiants explicites
4776NTLM authentication
7045A service was installed
4697A 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"]
📌 Remarque

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.conf et /etc/rsyslog.d/30-remote.conf fournis (captures d'écran ou diff).
  • Preuve de réception : ls /var/log/remote et tail montrant des entrées venant de debian-srv02 et (si applicable) win-srv01.
  • Fichier /etc/logrotate.d/remote pré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.

💡 À retenir

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.

❓ Question de vérification

Expliquez en une phrase comment est calculé le champ PRI et pourquoi le RFC 5424 facilite la corrélation temporelle des logs.

➡️ Séance suivante

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

  1. 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
  2. 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
  3. Q3 (QCM) : Quelle commande journalctl affiche 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
  4. Q4 (QCM) : Quel Event ID Windows signale un échec d'authentification (Logon failure) ?
    • A) 4624
    • B) 7045
    • C) 4648
    • D) 4625
  5. Q5 (Vrai / Faux) : Dans rsyslog, la directive *.* @@192.168.10.10:514 envoie les logs via UDP (non fiable) vers le collecteur distant.
📝 Corrections
  1. 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é.
  2. C) imudp — Le module imudp (Input Module UDP) ouvre un socket UDP sur le port spécifié. imtcp est pour TCP, omfwd est pour le forwarding sortant, imjournal lit le journal systemd.
  3. B) journalctl -u sshd --since "1 hour ago" — L'option -u filtre par unité systemd, --since limite la plage temporelle. -k filtre les messages kernel uniquement.
  4. 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.
  5. Faux — La double arobase @@ désigne le protocole TCP (fiable). Une seule arobase @ désigne UDP (non fiable). Pour TLS, on utilise action(type="omfwd" ... protocol="tcp").
← C2.4.1 Séance 2 — Zabbix alertes C2.4.2 Séance 2 — ELK, Filebeat et dashboards →