Centralisation et analyse des journaux système – rsyslog + Filebeat + Elasticsearch + Kibana
Stack technique
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
↓
Templates JSON → /var/log/central/**/all-json/*.json
↓
Filebeat → Elasticsearch (index rsyslog-logs)
↓
Kibana (dashboards + alertes)
Travaux réalisés
- 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)
- 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
- 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)
- 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
- 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"
- 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
- 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)
- 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
- 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
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
Module rsyslog omelasticsearch v8.2112 ne supportait pas HTTPS → logs jamais envoyés, aucune erreur visible.
nano remplaçait guillemets droits par guillemets typographiques. rsyslog affichait : "invalid character"
Template rsyslog générait plusieurs objets JSON collés. Filebeat attendait 1 objet/ligne.
Après réinstall Elasticsearch : FATAL Error: EACCES permission denied /etc/elasticsearch/certs/http_ca.crt
Après test restauration snapshot, index resté RED → unassigned_shards bloquait cluster entier.
Impossible créer règles d'alerte : "You must configure an encryption key to use Alerting"
Alerte exécutée (Succeeded) mais sans déclencher Active alerts. Erreurs : KQL incorrecte + fenêtre trop courte.
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