Aller au contenu principal

Gestion avancée des logs


Table des matières

  1. Architecture de logging
  2. journald - Le journal systemd
  3. rsyslog - Configuration avancée
  4. Centralisation des logs
  5. Analyse et monitoring
  6. Exercices pratiques


1 - Architecture de logging

Vue d'ensemble

Fichiers de logs standards

FichierContenu
/var/log/syslogMessages système généraux (Debian)
/var/log/messagesMessages système (RHEL)
/var/log/auth.logAuthentification (Debian)
/var/log/secureAuthentification (RHEL)
/var/log/kern.logMessages kernel
/var/log/dmesgMessages de boot
/var/log/cronTâches cron
/var/log/nginx/Logs Nginx
/var/log/apache2/Logs Apache

Niveaux de sévérité (syslog)

NiveauCodeDescription
emerg0Système inutilisable
alert1Action immédiate requise
crit2Conditions critiques
err3Erreurs
warning4Avertissements
notice5Normal mais significatif
info6Informationnel
debug7Debug

🔝 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=persistent pour 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

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Performance →