Gestion avancée des logs
Table des matières
- Architecture de logging
- journald - Le journal systemd
- rsyslog - Configuration avancée
- Centralisation des logs
- Analyse et monitoring
- Exercices pratiques
1 - Architecture de logging
Vue d'ensemble
Fichiers de logs standards
| Fichier | Contenu |
|---|---|
/var/log/syslog | Messages système généraux (Debian) |
/var/log/messages | Messages système (RHEL) |
/var/log/auth.log | Authentification (Debian) |
/var/log/secure | Authentification (RHEL) |
/var/log/kern.log | Messages kernel |
/var/log/dmesg | Messages de boot |
/var/log/cron | Tâches cron |
/var/log/nginx/ | Logs Nginx |
/var/log/apache2/ | Logs Apache |
Niveaux de sévérité (syslog)
| Niveau | Code | Description |
|---|---|---|
| emerg | 0 | Système inutilisable |
| alert | 1 | Action immédiate requise |
| crit | 2 | Conditions critiques |
| err | 3 | Erreurs |
| warning | 4 | Avertissements |
| notice | 5 | Normal mais significatif |
| info | 6 | Informationnel |
| debug | 7 | Debug |
🔝 Retour à la table des matières
2 - journald - Le journal systemd
Commandes de base
# Voir tous les logs
journalctl
# Logs du boot actuel
journalctl -b
# Logs du boot précédent
journalctl -b -1
# Suivre en temps réel
journalctl -f
# Dernières entrées
journalctl -n 50
# Depuis une date
journalctl --since "2024-01-15 10:00:00"
journalctl --since "1 hour ago"
journalctl --since today
Filtres avancés
# Par unité systemd
journalctl -u nginx.service
journalctl -u nginx -u php-fpm
# Par priorité
journalctl -p err # Erreurs et plus grave
journalctl -p warning..err # De warning à err
# Par PID
journalctl _PID=1234
# Par utilisateur
journalctl _UID=1000
# Par exécutable
journalctl /usr/bin/sudo
# Kernel
journalctl -k
Format de sortie
# JSON
journalctl -o json-pretty
# Format court
journalctl -o short
# Avec tous les champs
journalctl -o verbose
# Export binaire
journalctl -o export > logs.export
Configuration journald
# /etc/systemd/journald.conf
[Journal]
# Stockage persistent (survive aux reboots)
Storage=persistent
# Taille maximum
SystemMaxUse=500M
RuntimeMaxUse=100M
# Rotation
MaxRetentionSec=1month
# Compression
Compress=yes
# Forward vers syslog
ForwardToSyslog=yes
# Appliquer
systemctl restart systemd-journald
# Vérifier l'espace utilisé
journalctl --disk-usage
# Nettoyer les anciens logs
journalctl --vacuum-size=200M
journalctl --vacuum-time=7d
🔝 Retour à la table des matières
3 - rsyslog - Configuration avancée
Structure de configuration
# /etc/rsyslog.conf
# /etc/rsyslog.d/*.conf
# Modules
module(load="imuxsock") # Socket local
module(load="imklog") # Kernel
module(load="imtcp") # Réception TCP
module(load="imudp") # Réception UDP
# Templates
template(name="CustomFormat" type="string"
string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg%\n")
# Règles
facility.priority destination
Syntaxe des règles
# Format: facility.priority action
# Exemples
*.info /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
# Opérateurs de priorité
*.=debug # Exactement debug
*.!crit # Tout sauf crit et plus
*.crit;*.!=info # crit et plus, sauf info
Filtres basés sur propriétés
# Filtrer par programme
:programname, isequal, "nginx" /var/log/nginx/nginx.log
# Filtrer par message
:msg, contains, "error" /var/log/errors.log
# Expression régulière
:msg, regex, "failed.*authentication" /var/log/auth-failures.log
Templates personnalisés
# Template JSON
template(name="JsonFormat" type="list") {
constant(value="{")
constant(value="\"timestamp\":\"") property(name="timestamp" dateFormat="rfc3339")
constant(value="\",\"host\":\"") property(name="hostname")
constant(value="\",\"severity\":\"")property(name="syslogseverity-text")
constant(value="\",\"facility\":\"")property(name="syslogfacility-text")
constant(value="\",\"tag\":\"") property(name="syslogtag")
constant(value="\",\"message\":\"") property(name="msg" format="json")
constant(value="\"}\n")
}
# Utiliser le template
*.* /var/log/all-json.log;JsonFormat
🔝 Retour à la table des matières
4 - Centralisation des logs
Architecture centralisée
Configuration du serveur central
# /etc/rsyslog.d/server.conf
# Charger les modules
module(load="imtcp")
module(load="imudp")
# Écouter sur TCP 514
input(type="imtcp" port="514")
# Écouter sur UDP 514
input(type="imudp" port="514")
# Template pour séparer par host
template(name="PerHostLog" type="string"
string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
# Stocker les logs distants
*.* ?PerHostLog
Configuration des clients
# /etc/rsyslog.d/remote.conf
# Envoyer tous les logs au serveur central
*.* @@logserver.example.com:514 # TCP (@@)
# *.* @logserver.example.com:514 # UDP (@)
# Queue pour fiabilité
$ActionQueueType LinkedList
$ActionQueueFileName remote
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionResumeRetryCount -1
Transport sécurisé (TLS)
# Serveur - /etc/rsyslog.d/tls-server.conf
module(load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.Authmode="x509/name")
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/pki/rsyslog/ca.pem"
DefaultNetstreamDriverCertFile="/etc/pki/rsyslog/server-cert.pem"
DefaultNetstreamDriverKeyFile="/etc/pki/rsyslog/server-key.pem"
)
input(type="imtcp" port="6514")
# Client - /etc/rsyslog.d/tls-client.conf
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/pki/rsyslog/ca.pem"
DefaultNetstreamDriverCertFile="/etc/pki/rsyslog/client-cert.pem"
DefaultNetstreamDriverKeyFile="/etc/pki/rsyslog/client-key.pem"
)
action(type="omfwd"
target="logserver.example.com"
port="6514"
protocol="tcp"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="x509/name")
🔝 Retour à la table des matières
5 - Analyse et monitoring
Outils CLI
# grep avec contexte
grep -B2 -A2 "error" /var/log/syslog
# Compter les occurrences
grep -c "Failed password" /var/log/auth.log
# Top des IPs qui échouent
grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
# Logs par heure
awk '{print $1, $2, $3}' /var/log/syslog | cut -d: -f1,2 | uniq -c
# Analyse avec awk
awk '/error/ {count++} END {print count}' /var/log/syslog
Logwatch - Rapports automatiques
# Installer
apt install logwatch
# Lancer un rapport
logwatch --detail High --mailto [email protected] --range today
# Configuration
# /etc/logwatch/conf/logwatch.conf
Output = mail
MailTo = [email protected]
Detail = Med
Range = yesterday
Fail2ban - Protection automatique
# Installer
apt install fail2ban
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
# Commandes
fail2ban-client status
fail2ban-client status sshd
fail2ban-client set sshd unbanip 192.168.1.100
Rotation avec logrotate
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 myapp myapp
sharedscripts
postrotate
systemctl reload myapp || true
endscript
}
# Tester
logrotate -d /etc/logrotate.d/myapp
logrotate -f /etc/logrotate.d/myapp
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Filtres journalctl
Trouvez tous les échecs d'authentification SSH depuis hier :
Solution
journalctl -u sshd --since yesterday | grep -i "failed\|invalid"
# Ou plus précis
journalctl -u sshd --since yesterday -p warning
Exercice 2 : Configuration rsyslog
Configurez rsyslog pour envoyer tous les logs auth vers un fichier séparé :
Solution
# /etc/rsyslog.d/10-auth.conf
authpriv.* /var/log/auth-custom.log
# Redémarrer
systemctl restart rsyslog
Quiz
Q1. Quelle commande affiche les logs du kernel en temps réel ?
Réponse
journalctl -kf ou dmesg -w
Q2. Quelle est la différence entre @ et @@ dans rsyslog ?
Réponse
@ = UDP, @@ = TCP
🔝 Retour à la table des matières
Points clés à retenir
- journald : journal systemd, requêtes puissantes avec
journalctl - rsyslog : traitement et routage flexible des logs
Storage=persistentpour conserver les logs après reboot- Centralisation avec TCP/TLS pour la fiabilité et la sécurité
- logrotate pour éviter de remplir le disque
- fail2ban pour la protection automatique