Centralisez vos logs avec Rsyslog

I. Présentation

La centralisation des logs de plusieurs serveurs sur un seul peut présenter un grand intérêt au niveau de la sécurité au sein d'un système d'information. En effet, il est plus facile pour des outils d'analyse de logs de comparer, lire et scanner des fichiers se situant sur un seul et unique serveur plutôt que de le faire à distance ou via des agents distants. De plus en cas de crash serveur, vous serez capable de récupérer les erreurs et actions menées sur votre serveur avant que celui-ci ne crash, facilitant ainsi la remise en activité de celui-ci et sa sécurisation future.

Par défaut sur la plupart des Linux modernes, l'outil de gestion des logs est Rsyslog, c'est celui-ci que nous allons utiliser dans ce tutoriel. Nous travaillerons sur deux machines sous Debian 7, l'un faisant office de serveur, l'autre de "client" qui enverra ses logs sur le serveur. Dans les deux cas, le fichier de configuration à modifier est toujours "/etc/rsyslog.conf". On peut néanmoins  en mettre dans "/etc/rsyslog.d/" puis faire un "include" dans le fichier de configuration principale pour importer.

II. Configuration du serveur

Pour le serveur, il faut simplement paramétrer le serveur pour qu'il accepte les logs venant de l'extérieur en ouvrant le port adéquate, on va pour l'instant par soucis de simplicité ouvrir le port UDP (514). Pour cela, on va décommenter les deux lignes suivantes :

$ModLoad imudp
$UDPServerRun 514

On pourra alors redémarrer le service rsyslog :

service rsyslog restart

Pour vérifier que notre serveur est bien à l'écoute, on peut effectuer la commande suivante :

netstat -npul

On verra alors notre port 514 ouvert en UDP :

serveur rsyslog linux
Port 514 ouvert en UDP sur notre serveur Rsyslog

III. Configuration du client

Au niveau du client, il faut aller dans ce même fichier puis, pour rediriger tous les logs sur le serveur, ajouter cette ligne à la fin du fichier :

*.* @IP_SERVER:514

Note : Le "@" doit figurer dans la ligne

On va alors redémarrer notre service rsyslog :

service rsyslog restart

Puis on pourra générer des logs (redémarrer un service quelconque par exemple) et aller voir s'ils figurent sur le serveur rsyslog. Par défaut comme nous l'avons fait, les logs des clients se situeront dans le même fichier que les logs du serveur donc par exemple dans le "/var/log/syslog" du serveur. Vous verrez simplement que le nom de l'hôte ayant généré la ligne de log n'est pas celui du serveur mais celui du client.

III TCP/UDP

Nous avons précédemment configuré notre client et notre serveur pour échanger en utilisant le protocole de transport (couche 4) UDP. Brièvement, UDP permet un échange unique pour transmettre un paquet, c'est un protocole qui ne cherche pas à se synchroniser, à suivre l'état des paquets ou des échanges entre deux éléments actifs. Au contraire, TCP va chercher à savoir pour chaque paquet si celui-ci a bien été reçu par le correspondant, ce qui engendre des paquets supplémentaires par rapport à UDP. TCP est ainsi capable de savoir si un échange ou une information n'a pas été reçu et de la retransmettre au besoin, ce que ne fait pas UDP.

Tout cela pour souligner que dans notre cas, les échanges TCP ont un désavantage qu'il faut prendre en compte par rapport à l'UDP. En effet, le TCP va générer plus d'échanges (et donc de consommation de ressource) par rapport à UDP mais va vous assurer que les informations reçu le sont dans le totalité. Il y a donc un choix à faire qui dépend de vos ressources disponibles et du nombre de client et d'informations gérées par votre serveur. Pour mettre les échanges en mode TCP, il faut recommenter ces lignes dans le fichier de configuration serveur, à noter que les deux méthodes peuvent cohabiter si on les met sur des ports différents, par exemple :

Serveur Rsyslog
Configuration du serveur Rsyslog pour recevoir les logs des clients en UDP sur le port 514 et en TCP sur le port 1514

Sinon, il faudra commenter les deux lignes supérieures. Côté client, il faut ajouter cette ligne dans la configuration pour que les échanges s'effectuent en TCP :

*.* @@IP_SERVEUR:1514

Note : Les @@ doivent figurer dans la ligne de commande, le fait qu'il y en ai deux indique que les échanges se feront en TCP.

On peut laisser également deux lignes pour indiquer que les logs seront envoyés une fois en TCP et une fois en UDP. Cela présente peu d’intérêt mais permet de comprendre que l'on peut également envoyer nos logs sur plusieurs serveurs différents si on change l'IP d'une des deux lignes. On va ensuite redémarrer le serveur ainsi que le client si besoin :

service rsyslog restart

 IV. Rediriger ou copier selon la facilitie ou la priorité

Sous Linux quand on parle de gestion de logs, les facilites sont des catégories dans lesquelles les logs vont se "ranger" afin de mieux les archiver et les trier. Parmi ces facilites, on retrouve par exemple :

  • auth : Utilisé pour des évènements concernant la sécurité ou l'authentification à travers des applications d'accès (type SSH)
  • authpriv : Utilisé pour les messages relatifs au contrôle d'accès
  • daemon : Utilisé par les différents processus systèmes et d'application
  • kern : Utilisé pour les messages concernant le kernel
  • mail :  Utilisé pour les évènements des services mail
  • user : Facilitie par défaut quand aucune n'est spécifiée
  • local7 : Utilisé pour les messages du boot
  • * : Désigne toutes les facilities, par soucis de simplicité c'est ce que nous avons spécifié lors de notre première règle de redirection des logs un peu plus haut
  • none : Désigne aucune facilites

En plus de ces facilites, nous retrouvons pour chaque facilities un niveau de gravité (appelé Priorité) qui va du plus grave à la simple information :

  • Emerg : Urgence, système inutilisable
  • Alert : Alerte. Intervention immédiate nécessaire
  • Crit : Erreur système critique
  • Err : Erreur de fonctionnement
  • Warning :  Avertissement
  • Notice : Évènement normaux devant être signalé
  • Info : Pour information
  • Debug : Message de debogage

On retrouve alors plusieurs façons de spécifier les logs qui nous intéressent et donc ceux que l'on va rediriger. Par exemple si l'on chercher à rediriger vers notre serveur de logs 192.168.19.145 uniquement les messages critiques et supérieurs concernant les mails sur le port UDP 514, on ajoutera la ligne suivante :

mail.err @192.168.19.145:514

On peut également rediriger tous les logs mails :

mail.* @192.168.19.145:514

On peut également saisir en une ligne plusieurs types de facilities et de priorité, on trouve pas exemple dans le fichier de configuration par défaut des lignes comme celles-ci :

*.=debug;\
       auth,authpriv.none;\
       news.none;mail.none     -/var/log/debug
*.=info;*.=notice;*.=warn;\
       auth,authpriv.none;\
       cron,daemon.none;\
       mail,news.none          -/var/log/messages

On voit ici que toutes les priorités debug sont redirigées vers le fichier "/var/log/debug" et que toutes les priorités info,notice et warn seront dans "/var/log/messages". Pour que ces filtres soient redirigés vers le serveur de logs, il suffit de spécifier l'IP du serveur ainsi que son port comme fait plus haut à la place du nom du fichier.

V. Rediriger les logs vers un dossier/fichier par host

On peut également, pour faciliter la hiérarchisation et l'archivage de nos logs lorsque l'on a un grand nombre de client Rsyslog utiliser une arborescence avec un dossier/fichier par hôte plutôt que de mettre tous les logs dans le même fichier que le serveur de logs. On va pour cela utiliser une template que nous mettrons après le bloc "RULES" dans le fichier de configuration du serveur :

$template syslog,"/var/log/clients/%fromhost%/syslog.log"

On va ensuite appliquer ce template à tous les logs entrants :

*.* ?syslog

Il nous suffira ensuite de redémarrer notre service rsyslog puis de générer des logs depuis les clients. On se retrouvera alors avec un dossier "/var/log/clients/" contenant un dossier par IP/nom client et contenant respectivement un fichier "syslog.log" avec les logs de chaque client respectif, ce qui simplifie la recherche d'information dans les logs d'un client précis

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.

Nombre de posts de cet auteur : 523.Voir tous les posts

27 thoughts on “Centralisez vos logs avec Rsyslog

  • On peut notamment rajouter le support pour RELP (alternative à TCP et UDP).
    Pour résumer, « imrelp fonctionne comme imtcp […], sauf qu’aucune perte de message ne peut se produire »

    Installer le paquet rsyslog-relp (sur les deux machines)

    Dans /etc/rsyslog.conf côté serveur rajouter les lignes :
    module(load= »imrelp »)
    input(type= »imrelp » port= »2514″)

    Toujours dans rsyslog.conf mais côté client :
    module(load= »omrelp ») #o pour output
    action(type=omrelp » target= »IP_SERVEUR » port= »2514″)

    Pour UDP il y a *.* @IP_SERVEUR:514
    Pour TCP il y a *.* @@IP_SERVEUR:514
    Pour RELP il y a(vait) *.* :omrelp:IP_SERVEUR:2514
    Cette dernière est désignée comme obsolète sur la doc officielle, la directive action() la remplace. Le tri des facilities et des priorités est à faire sur le serveur, le client se contentant de tout rapatrier sans réfléchir.

    Répondre
  • vos cours sont très intéressant.
    attention pour les débutants cela ne fonctionneras pas tant que vous n’ajouterez pas l’ouverture de flux udp ou tcp sur le firewall exemple des commandes:
    systemctl restart rsyslog
    # firewall-cmd –add-port=514/udp –permanent
    # firewall-cmd –add-port=514/tcp –permanent
    # firewall-cmd –reload

    Répondre
  • Merci pour le tuto

    Cependant j’ai pas de section « RULES » dans mon fichier /etc/rsyslog.conf ni même dans /etc/rsyslog.d/50-default.conf

    Comment on fait ensuite pour la création du fichier « $template syslog, »/var/log/clients/%fromhost%/syslog.log » car là ça me semble complexe….

    merci

    Répondre
  • Bonjour,
    je reçois les logs d’un fortigate qui est du format :
    Dec 5 12:14:02 _gateway date=2023-12-05 time=12:14:01 devname= »FGT_NAME » devid= »FGT_ID »
    J’essaye de faire le filtre en se basant sur le davename, ce qui donne:
    :fromhost, contains, « FGT_NAME » ?remote-fortigate-logs
    Mais le filtre ne s’applique pas. Est-ce qu’il y a une règle supplémentaire à rajouter?
    Merci

    Répondre
  • Bonsoir,
    Je souhaites stocker les logs d’un serveur windows vers un serveur Rsyslog j’aimerais savoir comment faire pour configurer Windows
    Merci

    Répondre

Répondre à Mostafa Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.