Translation(s): 中文普通话 - English - Français - Italiano


Rsyslog

Rsyslog est un programme open source qui permet de transférer les messages de journalisation sur un réseau IP pour les systèmes UNIX et de type Unix. Il implémente le protocole syslog de base, et l'étend avec un filtrage basé sur le contenu, des fonctionnalités de filtrage avancées, des options de configuration flexibles et ajoute des fonctionnalités tel que l’utilisation de TCP, SSL et RELP pour le transport. Rsyslog est un remplaçant direct de syslogd. Rsyslog offre de hautes performances, des fonctionnalités de sécurité et une conception modulaire. Rsyslog peut nous permettre de stocker les messages de journalisation dans une base de données MySQL, MariaDB, MongoDB ou PostgreSQL pouvat être configurée avec dbconfig-common pour une configuration facile via debconf. Les données des logs pourront être exploitées par un programme complémentaire, comme par exemple, l'interface Web de ?LogAnalyzer. La rotation des messages de journalisation est automatisée.

Déprécition à partir de Bookworm

A partir de Bookworm, le "journal" persistant de Systemd a été activé et la plupart des messages se retrouvaient écrits deux fois sur le disque. Il a été alors décidé que le paquet rsyslog verrait sa priorité baissée de Important à Optionnal, ce qui signifie qu'il n'est plus installé par défaut dans un système de base Debian (voir https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1018788).

Il est toujours possible d'installer le paquet rsyslog et il fonctionnera comme auparavant (notez que les messages envoyés à /dev/log transiteront toujours par systemd-journald, vous voudrez probablement désactiver la persistance de journald en supprimant le répertoire /var/log/journal).

Historique du passage de Sysklogd vers Rsyslog

Le service rsyslogd a été intégré avec le paquet Rsyslog à partir de Debian Lenny (https://wiki.debian.org/DebianLenny) pour remplacer l'ancien syslog : sysklogd. Les règles de journalisation existantes dans syslog.conf peuvent être simplement copiées dans /etc/rsyslog.conf ou dans le dossier /etc/rsyslog.conf.d. Sysklogd qui était installé par défaut n’est pas mauvais mais le paquet n’a presque pas été entretenu ses dernières années. Voir la note d'information partagée de Debian Lenny release notes : https://www.debian.org/releases/lenny/i386/release-notes/ch-whats-new#system-changes

Quelques arguments en faveur de Rsyslog dans les discussions suivantes :

Installation

Installer Rsyslog permet notamment de stocker les logs de syslog dans une base de données. Si aucune base de données n'est configurée, l'interface Web de ?LogAnalyzer pourra utiliser les données de logs fournies par syslog depuis le disque. Si une base de données est configurée, l'interface Web de ?LogAnalyzer pourra utiliser les données de logs fournies par la base de données.

Prérequis : apache.

Installer la version 8.39.0 de Rsyslog depuis les dépôts officiels pour Debian

Installer la clé PGP dans votre système apt :

Dépôt Adiscon pour v8-stable sur Debian (7) Wheezy. Éditer votre /etc/apt/sources.list et ajouter ces lignes à la fin :

Installer la documentation de Rsyslog

Documentation installée, par défaut sur Debian, avec le service rsyslogd :

Installer la documentation complète de Rsyslog au format HTML :

Installer rsyslog-mysql pour configurer la base de données MySQL qui va stocker les logs de syslog

Les bases MySQL, MariaDB, MongoDB ou PostgreSQL sont correctement supportées.

La configuration de rsyslog-mysql se fait automatiquement avec dbconfig-common. Une base MySQL nommée Syslog contenant deux tables ?SystemEvents et ?SystemEventsProperties est créée. Un utilisateur rsyslog@localhost est ajouté, il possède le contrôle total sur la base de données Syslog. La configuration de la connexion à la base de données MySQL est disponible depuis le fichier /etc/rsyslog.d/mysql.conf.

Configurer le fichier de connexion mysql.conf

Éditer mysql.conf, le fichier de configuration de MySQL. Permet de se connecter à la base de données Syslog pour stocker les logs de syslog.

Remarque : Il semble important d’utiliser les espaces de tabulation entre les entrées de la configuration.

# Charger le module et enregistrer tous les messages de syslog en base de données :

# Cette commande filtre le niveau d'alertes des messages a enregistrer en base de données :

Créer la base de données Syslog pour stocker les données de syslog avec Rsyslog et MySQL

Si le paquet rsyslog-mysql n'a pas été utilisé pour créer la base de données, la base de données peut être créée manuellement.

Première méthode

Créer la structure de base de données avec le script officiel pour stocker les messages de journalisation dans MySQL : La définition du schéma de base de données donnée est disponible depuis le fichier createDB.sql depuis l’archive de Rsyslog 8.39.0. Le chemin d'accès au fichier est ./rsyslog-8.39.0/plugins/ommysql/createDB.sql. Lancer l'import de la base :

Deuxième méthode

Se connecter à MySQL :

Si besoin, renseigner le mot de passe de l'utilisateur pour la base de données. Continuer avec la touche entrée. Créer la structure de base de données manuellement pour stocker les messages de journalisation dans MySQL :

Créer un utilisateur rsyslog pour utiliser la base de données Syslog

Se connecter à MySQL en ligne de commande. Le mot de passe est vide sur le système local, valider avec la touche entrée pour se connecter. Il faudra sécuriser MySQL avec un mot de passe pour un système en production.

Si l'utilisateur rsyslog n'existe pas encore, créer l'utilisateur rsyslog pour gérer la base de données.

Optimiser la base de données Syslog

La table MySQL ?SystemEvents peut se remplir rapidement et devenir très volumineuse. Un script d’archivage placé dans une tâche Cron permettra d’éviter les mauvaises surprises.

Proposition script Cron 1

Proposition script Cron 2

Utiliser InnoDB et des tables compressées

Indexer les champs qui serviront souvent dans les requêtes

Vérifier que la table MySQL est bien alimentée avec les logs

# Créer une entrée de journal avec la commande suivante :

# Tester si il existe des enregistrements depuis le terminal avec la commande suivante :

# Tester si il existe des enregistrements depuis l'interface en ligne de commande de MySQL avec les commandes suivantes :

# Saisir votre mot de passe utilisateur pour root ou appuyer directement sur entrée si le mot de passe est vide. # Sélectionner la base de données Syslog sur laquelle la requête va être lancée.

# Cette commande fonctionne également et devrait être plus rapide en sélectionnant moins d'informations.

Configurer l'écoute du réseau dans la configuration de Rsyslog

# Paramétrer le fichier de configuration de Rsyslog.

Exemple de configuration par défaut

#  /etc/rsyslog.conf    Fichier de configuration pour Rsyslog.
$EscapeControlCharactersOnReceive off

#### MODULES ####
# $ModLoad imuxsock
module(load="imuxsock")

# UDP syslog reception
# module(load="imudp")
# input(type="imudp" port="1514")
# ou
# $Modload imudp
# $UDPServerRun 1514

# TCP syslog reception
# module(load="imtcp")
# input(type="imtcp" port="1514")
# ou
# $ModLoad imtcp
# $InputTCPServerRun 1514

# Support de connexion Kernel et activation des non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")

# Règles de connexion par défaut : /etc/rsyslog.d/50-default.conf
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          /var/log/syslog
syslog.*                        /var/log/rsyslog.log
cron.*                          /var/log/cron.log
kern.*                          /var/log/kern.log
#daemon.*                       /var/log/daemon.log
#lpr.*                          /var/log/lpr.log
#user.*                         /var/log/user.log
#mail.*                         /var/log/mail.log
#mail.info                      /var/log/mail.info
#mail.warn                      /var/log/mail.warn
#mail.err                       /var/log/mail.err
#news.crit                      /var/log/news/news.crit
#news.err                       /var/log/news/news.err
#news.notice                    /var/log/news/news.notice

# Propriétaires du fichier cron.log passé a syslog:logadmin

# Ajouter une ligne pour faire gérer d'autres logs par Rsyslog (Apache2, Mysql, ...) :
syslog.*                        /var/log/apache2/error.log

#### GLOBAL DIRECTIVES ####
# Semble être obsolète :
# $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filtre les messages dupliqués :
$RepeatedMsgReduction on

$WorkDirectory /var/spool/rsyslog

# Include all config files in /etc/rsyslog.d/
# $IncludeConfig /etc/rsyslog.d/*.conf
$IncludeConfig /etc/rsyslog.d/mysql.conf

Redémarrer Rsyslog pour appliquer la nouvelle configuration

Redémarrer le démon Rsyslog pour appliquer la nouvelle configuration :

# Anciennes commandes :
sudo service rsyslog restart
sudo /etc/init.d/rsyslog restart

# Nouvelle commande :
sudo systemctl restart rsyslog

Centraliser les logs sur un serveur de logs avec Rsyslog

Complète la configuration proposée précédemment pour utiliser Rsyslog comme serveur de logs centralisé.

Créer un fichier modèle dans lequel nous créerons un nouveau format de journal personnalisé depuis /etc/rsyslog.d/tmpl.conf Je n'ai pas testé cette possibilité.

Autoriser le port par défaut de Rsyslog UDP 514 sur votre pare-feu. Autoriser le port modifié de Rsyslog TCP 1514 sur votre pare-feu. Les commandes suivantes ouvriront ce port via UFW :

sudo ufw allow 514/udp
sudo ufw allow 1514/tcp

Redémarrer le service UFW pour prendre en compte les modifications :

sudo ufw reload

Recharger le service Rsyslog en utilisant la commande suivante :

systemctl restart rsyslog

Dans le cas ou le serveur de logs se trouve derrière un routeur : Penser a activer les règles NAT adaptées aux ports sélectionnés dans la configuration. Rediriger le trafic UDP 514->514 vers le serveur de logs. Rediriger le trafic TCP 1514->1514 vers le serveur de logs.

Ajouter de nouveaux clients Rsyslog

Configurer les machines clients pour qu’elles puissent envoyer leurs logs à la machine qui aura le rôle de serveur de logs. Fonctionne avec syslog ou syslog-ng, avec un paramétrage différent pour syslog-ng. Cette fonctionnalité n'a pas été testée lors de la rédaction de ce tutoriel.

Étape 1 : Installer le paquet rsyslog sur chaque client :

apt-get install rsyslog

Étape 2 : Créer un répertoire de travail :

mkdir /var/spool/rsyslog

Étape 3 : Ouvrir le fichier de configuration de Rsyslog :

nano /etc/rsyslog.conf

Modifier la configuration qui permet l'envoi des logs au serveur de logs : Emplacement par défaut pour les fichiers de travail (spool).

$WorkDirectory /var/spool/rsyslog

Commencer la règle de transfert 1 :
$ActionQueueType LinkedList # Exécuter le traitement de façon asynchrone.
$ActionQueueFileName srvrfwd1 # Préfixe de nom unique pour les fichiers spool. Active également le mode disque.
$ActionQueueMaxDiskSpace 1g # Limite d'espace de 1 Go.
$ActionQueueSaveOnShutdown on # Enregistrer les données sur le disque si Rsyslog est arrêté.
$ActionResumeRetryCount -1 # Tentatives infinies en cas d'échec de connexion avec l'hôte.
# jouter les lignes suivantes dans la section RULES :
# Envoyer tous les messages sur le serveur de journalisation distant avec la commande suivante :
*.* @@Cible_IP_serveur_1_LogAnalayzer:514 # Ou 514 est le port d'écoute qui a été défini dans la configuration.

Commencer la règle de transfert 2 :
$ActionQueueType LinkedList # Exécuter le traitement de façon asynchrone.
$ActionQueueFileName srvrfwd2 # Préfixe de nom unique pour les fichiers spool. Active également le mode disque.
$ActionQueueMaxDiskSpace 1g # Limite d'espace de 1 Go.
$ActionQueueSaveOnShutdown on # Enregistrer les données sur le disque si Rsyslog est arrêté.
$ActionResumeRetryCount -1 # Tentatives infinies en cas d'échec de connexion avec l'hôte.
# jouter les lignes suivantes dans la section RULES :
# Envoyer tous les messages sur le serveur de journalisation distant avec la commande suivante :
*.* @@Cible_IP_serveur_1_LogAnalayzer:514 # Ou 514 est le port d'écoute qui a été défini dans la configuration.

Étape 4 : Redémarrer le service RSyslog

sudo /etc/init.d/rsyslog restart

Consigner le message en erreur standard (écran), ainsi que le journal système à l’aide de la commande suivante :

logger -s " Ceci est un client Rsyslog "

Aller sur le serveur Rsyslog sous le répertoire /var/log/client_logs. Un nouveau dossier nommé avec le nom d’hôte de votre client Rsyslog devrait être disponible.

/var/log/client_logs/Client01/

Rsyslog et SSL

Le cryptage SSL pour l'échange entre Syslog et Rsyslog.

Déboguer Rsyslogd et obtenir ses logs

Méthode DebugFile et DebugLevel

Ouvrir le fichier de configuration de Rsyslog :

sudo nano /etc/rsyslog.conf

# Ajouter les deux lignes suivantes :
$DebugFile /home/USER/Bureau/debug.txt
$DebugLevel 2
# <0|1|2> - Définir le niveau de débogage :
# 0 correspond au mode débogage désactivé.
# 1 au mode débogage à la demande activé mais le mode débogage désactivé.
# 2 correspond au mode débogage complet.

# Redémarrer Rsyslog :

sudo service rsyslog restart

Méthode trace

La méthode trace peut fonctionner, mais, la première méthode est plus adaptée.

Dans une première console, lancer la commande suivante :

sudo strace -p $(pgrep rsyslogd) -o fichier.trace

Ouvrir une deuxième console, et, redémarrer par exemple Rsyslog :

sudo /etc/init.d/rsyslog restart

Voir également

Ressources utilisées pour rédiger cette synthèse

Ressources complémentaires