Centralisation et analyse des journaux système – rsyslog + Filebeat + Elasticsearch + Kibana

Architecture rsyslog ELK
Projet
BTS SIO SISR – E6
Période
Décembre 2025 – Mars 2026
Serveur
ubulog – Ubuntu Server 24.04 LTS
Domaine
srvlog.lan

Stack technique

rsyslog Filebeat Elasticsearch 8.x Kibana NXLog Ubuntu Server 24.04 Windows Server 2022 Active Directory UFW logrotate

Objectif du projet

Mise en place d'une infrastructure complète de centralisation et d'analyse des journaux système (logs) pour un parc Linux et Windows intégré à un domaine Active Directory. L'objectif est de collecter, structurer en JSON, indexer dans Elasticsearch et visualiser dans Kibana les événements de toutes les machines, avec un système d'alertes automatiques pour la détection d'incidents de sécurité en temps réel.

"Infrastructure de centralisation des logs avec alertes temps réel : rsyslog collecte, Elasticsearch indexe, Kibana supervise."

Architecture de l'infrastructure

Machine IP Rôle
ubulog (SRV-RSYSLOG) 192.168.10.1 Ubuntu Server 24.04 LTS – rsyslog (collecte) + Filebeat (transfert) + Elasticsearch 8.x (indexation) + Kibana (visualisation)
clsyslog 192.168.10.x Client Linux – envoi des logs via syslog TCP vers ubulog:514
SRV-AD 192.168.10.10 Windows Server – Contrôleur de Domaine (srvlog.lan) + DNS. Authentification des utilisateurs Linux via Kerberos/SSSD

Flux de centralisation des logs

Clients (syslog) rsyslog:514/TCP

Templates JSON /var/log/central/**/all-json/*.json

Filebeat Elasticsearch (index rsyslog-logs)

Kibana (dashboards + alertes)

Travaux réalisés

1. Configuration du serveur rsyslog (collecte et structuration)
  • Activation réception TCP port 514 (module imtcp)
  • Template JSON RFC3339 : @timestamp, hostname, programme, sévérité, message
  • Arborescence : /var/log/central/hostname/categorie/YYYY-MM-DD.json
  • Règles de tri par programme : sshd, sudo, systemd, kernel, apache2, nginx
  • Configuration clients Linux : *.* @@192.168.10.1:514 (relais TCP fiable)
2. Déploiement Elasticsearch 8.x (stockage et indexation)
  • Ajout dépôt Elastic official (GPG key + signed-by)
  • Installation avec génération automatique mot de passe elastic
  • Certificats SSL auto-générés et configuration HTTPS
  • Configuration snapshots : path.repo: ["/var/backups/elasticsearch"]
  • Vérification santé cluster : curl -k -u elastic:password https://localhost:9200
3. Déploiement Kibana (interface de visualisation)
  • Installation kibana + génération token d'enrôlement pour Elasticsearch
  • Configuration 3 clés xpack obligatoires : encryptedSavedObjects, reporting, security (32 chars min)
  • Permissions certificats SSL : chmod 755 /etc/elasticsearch/certs/
  • Kibana groupe elasticsearch pour accès certificats
  • Accès sécurisé : http://192.168.10.1:5601 (réseau interne uniquement)
4. Installation Filebeat (transfert JSON vers Elasticsearch)
  • Collecte fichiers JSON : /var/log/central/**/all-json/*.json
  • Configuration multiline : json.keys_under_root + json.add_error_key
  • Output Elasticsearch : hosts https://localhost:9200 avec username/password
  • Index destination : rsyslog-logs (sans ILM pour contrôle manuel)
  • Vérification : curl -k -u elastic:pass https://localhost:9200/rsyslog-logs/_count
5. Création Data View et dashboards Kibana
  • Data View : pattern rsyslog-logs* avec timestamp field @timestamp
  • Dashboard Centralisation Logs : tableau des machines, camembert par programme, bar chart temporel
  • Dashboard Authentification SSH : compteur SSH, tableau sévérité, bar chart, compteur Failed password
  • Vue Discover : logs SSH en temps réel avec KQL filter program : "sshd"
6. Système d'alertes Kibana (détection brute force)
  • Rule type : Elasticsearch query
  • KQL : program : "sshd" and message : "Failed password"
  • Condition : WHEN count() IS ABOVE 5 FOR THE LAST 1 minute
  • Fréquence : Every 1 second
  • Status Active (rouge) quand alerte déclenchée
7. Sécurité réseau et pare-feu UFW
  • SSH : port 22/TCP (accès illimité)
  • rsyslog : port 514/TCP et 514/UDP (collecte logs)
  • Elasticsearch : port 9200/TCP (accès interne uniquement)
  • Kibana : port 5601/TCP → seulement depuis 192.168.10.0/24 et 192.168.209.0/24 (NAT)
8. Archivage et maintenance (rotation + backups)
  • Logrotate : /etc/logrotate.d/central-logs → rotation quotidienne, 180 jours rétention, compression .gz
  • Archive directory : /var/log/archives/ (chown syslog:adm)
  • Snapshots Elasticsearch : script /etc/cron.daily/elasticsearch-snapshot
  • Repository backup_logs configuré via API curl -X PUT _snapshot/backup_logs

Test de détection – Alerte Brute Force SSH

🔔 Simulation attack SSH → Alerte déclenchée
  • Commande : boucle for i in {1..20} avec logger -p auth.warning -t sshd "Failed password..."
  • Résultat : 20 log entries en < 5 secondes
  • Alerte Kibana : déclenchée en < 1 minute (count > 5 dans fenêtre 1min)
  • Vérification : Dashboard SSH affiche pic de 20 tentatives avec hostname/timestamp
  • Status rule : Active (rouge) dans Stack Management > Rules > Alerts
# Commande de simulation :
for i in {1..20}; do
  logger -p auth.warning -t sshd "Failed password for hacker from 10.0.0.1 port 22 ssh2"
done

# Résultat visible dans :
# - Kibana > Analytics > Discover (KQL: program:"sshd")
# - Dashboard SSH (compteur Failed password spike)
# - Stack Management > Rules > Alerts (status Active)

Incidents rencontrés et solutions

① omelasticsearch incompatible Elasticsearch 8.x (HTTPS)

Module rsyslog omelasticsearch v8.2112 ne supportait pas HTTPS → logs jamais envoyés, aucune erreur visible.

✅ Solution : remplacement par Filebeat (outil officiel Elastic supportant nativement ES 8.x + HTTPS)
② Guillemets typographiques corrompant config rsyslog

nano remplaçait guillemets droits par guillemets typographiques. rsyslog affichait : "invalid character"

✅ Solution : utilisation sudo tee avec heredoc (tee << 'EOF') pour écrire fichiers config
③ JSON multiline – plusieurs objets par ligne

Template rsyslog générait plusieurs objets JSON collés. Filebeat attendait 1 objet/ligne.

✅ Solution : ajout \n en fin template JsonFormat : constant(value="}"}\n")
④ Kibana crash – permissions certificats SSL Elasticsearch

Après réinstall Elasticsearch : FATAL Error: EACCES permission denied /etc/elasticsearch/certs/http_ca.crt

✅ Solution : chmod 755 /etc/elasticsearch/certs/ && chmod 644 http_ca.crt && usermod -aG elasticsearch kibana
⑤ Cluster Elasticsearch état RED (snapshot restore)

Après test restauration snapshot, index resté RED → unassigned_shards bloquait cluster entier.

✅ Solution : DELETE _data_stream/restored_rsyslog-logs via API curl
⑥ Kibana alertes – clé chiffrement xpack manquante

Impossible créer règles d'alerte : "You must configure an encryption key to use Alerting"

✅ Solution : 3 clés xpack 32chars dans kibana.yml + systemctl restart kibana
⑦ Alerte Brute Force SSH – KQL + fenêtre temporelle

Alerte exécutée (Succeeded) mais sans déclencher Active alerts. Erreurs : KQL incorrecte + fenêtre trop courte.

✅ Solution : KQL correcte program:"sshd" AND message:"Failed password" + fenêtre "FOR THE LAST 5 minutes"

Résultats obtenus

  • ✅ Stack ELK (rsyslog + Filebeat + Elasticsearch + Kibana) opérationnelle et intégrée AD
  • ✅ Logs Linux centralisés en JSON, indexés temps réel, consultables 24/7
  • ✅ 2 dashboards Kibana fonctionnels : Centralisation Logs + Authentification SSH
  • ✅ Système d'alertes brute force SSH actif (détection < 1 minute)
  • ✅ Archivage 180 jours + compression .gz dans /var/log/archives/
  • ✅ Snapshots Elasticsearch automatisés quotidiennement (cron)
  • ✅ Pare-feu UFW : collecte sécurisée + Kibana réseau interne uniquement
  • ✅ 7 incidents rencontrés → diagnostiqués et résolus