Dynamic file name rsyslog

Bonjour à tous, allez je dépile mon backlog. Aujourd’hui je vous partage une configuration de dynamic file name rsyslog. Elle m’a bien servis y’a 1 an et demi pour diminuer le volume de log dans mon SIEM et configurer une plateforme de relais syslogs devant ce dernier. En effet, pour ceux qui auront écouté mon podcast No Limit Sécu sur les dix commandements du SIEM se rappelerons que le 1er commandements est de mettre en place une infrastructure de relais syslog .Celle ci permet le retraitement des logs, la diffusion et la conservation d’un buffer local.

En gros si on parle Splunk, le schéma retenu pour l’arrivée des logs n’est pas d’utiliser l’universal forwarder en reception « directe » des syslog. Mais bien de configurer un serveur RSYSLOG (ou Syslog-ng) intermédiaire qui écrit les logs dans des fichiers sur le serveur et l’universal forwarder surveille alors ces dossiers. Cette pratique présente de nombreux avantage :

  1. Les serveurs de collecte syslog « frontaux » avec les clients sont indépendant de la technologie de SIEM utilisé derrière. En cas de changement de SIEM, ces serveurs peuvent être maintenu.
  2. L’utilisation de fichier permet de conserver un cache local sur le serveur qui permet d’avoir un tampon de quelques jours en cas de panne sur le SIEM.
  3. L’universal forwarder discute avec l’indexeur et conserve un pointeur sur les données indexées par ce dernier. Cela évite toute perte de données à l’indexation en cas de saturation des ressources.

Ce serveur doit être sous le contrôle de l’organisation, si vous déléguer sa gestion à un intégrateur ou à l’éditeur ca ne sert strictement à rien.

Dynamic file name rsyslog

RSYSLOG

Rsyslog est installé en standard sur les serveurs, vous pouvez contrôler sa présence avec :

rsyslogd -v
rsyslogd 8.24.0-41.el7_7.2, compiled with

        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes
        GSSAPI Kerberos 5 support:              Yes
        FEATURE_DEBUG (debug build, slow code): No
        32bit Atomic operations supported:      Yes
        64bit Atomic operations supported:      Yes
        memory allocator:                       system default
        Runtime Instrumentation (slow code):    No
        uuid support:                           Yes
        Number of Bits in RainerScript integers: 64

Pour configurer rsyslog, rendez vous dans le fichier rsyslog.conf

Vim /etc/rsyslog.conf

Et ajouter les lignes suivantes en fonction de la reception voulue. ici pour une écoute sur le tcp/514 en syslog « classique » :

# Provides UDP syslog receptio
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception

$ModLoad imtcp
$InputTCPServerRun 514

# rsyslog Input Modules
input(type="imtcp port="514")
[…]

A partir de là je souhaite créer une abrorescence de fichier (1 par heure) en fonction des produits et source qui envoie les logs. ON commence donc par définir un format de fichier dynamique :

template (name="DynFileXXXX" type="list"){
  constant(value="/var/log/<PRODUIT>/")
  property(name="hostname")
  constant(value="/")
  property(name="timestamp" dateFormat="year" date.inUTC="on")
  constant(value="-")
  property(name="timestamp" dateFormat="month" date.inUTC="on")
  constant(value="-")
  property(name="timestamp" dateFormat="day" date.inUTC="on")
  constant(value="T")
  property(name="timestamp" dateFormat="hour" date.inUTC="on")
  constant(value="+")
  property(name="timestamp" dateFormat="tzoffshour")
  constant(value="-<CUSTOM_MSG>.log")
}

Enfin, définir les actions associé à l’arrivé de vos logs, avec la partie action sur la réception des logs, par exemple ici via la source IP :

if ($fromhost-ip == '10.0.0.1' or $fromhost-ip ==  '10.0.0.2')
then {
  # reforward to SIEM1 
  action(type="omfwd"
         Target="10.0.0.3"
         Port="514"
         Protocol="tcp")
  # reforward to SIEM2
  action(type="omfwd"
         Target="10.0.0.4"
         Port="514"
         Protocol="tcp")
  # écriture dans l’arbo local
  action(type="omfile"
         dynaFile="DynFileXXXX" # template
         dynaFileCacheSize="100" #nombre de descipteurs ouvert en simultanés
         closeTimeout="10" #on ferme le fichier si 10 minutes sans rien
         flushInterval="1" # flush du cache dans le fichier tout les x seconds
         ioBufferSize="64k" # cache mémoire disponible
  )
}

Les dernières lignes de configuration créé par exemple les fichiers selon l’arborescence suivante:

/var/log/PROXY/server1/2021-06-25T10+02-proxy.log
/var/log/PROXY/server2/2021-06-25T11+02-proxy.log
/var/log/PROXY/server2/2021-06-25T12+02-proxy.log

Et voilà, vous avez une jolie configuration « Dynamic file name rsyslog » qui vous permet de splitter vos logs dans des fichiers séparés par heure et par source . Je vous garde la partie modification de format pour plus tard dans la mesure ou elle n’est pas bien compliqué à mettre en place. That’s all folks, geekez bien !

Laisser un commentaire

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.