blog-image

Rsyslog dans ElasticSearch - Fluent-bit - RaspberryPI4 - Arm64

  • dHENRY
  • 08/09/2022
  • (Durée de lecture : 4 mn)

Update 24/11/2022 : Attention avant de procéder à la mise à jour de l’agent Fluent-bit v1.9 vers Fluent-bit v2.0 (consulter ce billet)

Cette opération va consister à paramétrer les serveurs du Datacenter, de telle sorte qu’ils envoient leurs traces “rsyslog” auprès d’un service ElasticSearch.

Source documentation :

Pré-requis

  • Une solution ElasticSearch/Kibana opérationnelle
  • Le nom du domaine et le port réseau permettant l’accès au service elasticSearch, ex: els.mondomain.com:443
  • Un compte et un mot de passe utilisateur permettant à “Fluent-bit” d’injecter ses données dans l’application ElasticSearch.

Configuration ElasticSearch

  • A partir de l’interface Kibana, connectez-vous avec le compte d’administration (“elastic”).
  • Créer le rôle : “servers_rsyslog”, indiquez l’indice “fluent-bit” et attribuer lui les privilèges “write” et “create_index”. elasticsearch - role servers_rsyslog
  • Créer le compte “servers_rsyslog” destiné à être utilisé par les serveurs du Datacenter, et attribuer lui le rôle “servers_rsyslog” PS : conservez bien le nouveau login et mot de passe (nécessaires pour configurer “Fluent-bit” sur les serveurs). elasticsearch - compte servers_rsyslog

Serveurs du Datacenter - Installation de “Fluent-bit”

Cette opération est à réaliser sur tous les serveurs du Datacenter :

Attention ne fonctionne pas sur des architectures armhf - Source

  • Se connecter “root” au serveur

  • Créer le fichier “/etc/apt/sources.list.d/fluenbit.list”

deb [signed-by=/usr/share/keyrings/fluentbit-keyring.gpg] https://packages.fluentbit.io/debian/bullseye bullseye main
  • Télécharger la clé GPG :
curl https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /usr/share/keyrings/fluentbit-keyring.gpg
  • Installer :
apt update
apt -y install fluent-bit
# Démarrage au boot
systemctl enable fluent-bit

Serveurs du Datacenter - Configurer “Fluent-bit”

Ces opérations sont à réaliser sur tous les serveurs du Datacenter :

Configuration globale

La configuration de “Fluent-bit” se trouve dans le fichier : "/etc/fluent-bit/fluent-bit.conf", ouvrir ce fichier puis :

  • Supprimer ces lignes :
[INPUT]
    name cpu
    tag  cpu.local

    # Read interval (sec) Default: 1
    interval_sec 1

[OUTPUT]
    name  stdout
    match *
  • et Ajouter
[INPUT]
    Name     syslog
    Parser   syslog-rfc5424
    Listen   0.0.0.0
    Port     5140
    Mode     tcp

# Voir documentation https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch
[OUTPUT]
  Name  es
  # if ElasticSearch Service listens on tls port
  tls   On
  Match *
  HTTP_User [utilisateur elastic]
  HTTP_Passwd [Mot de passe utilisateur elastic]
  Host  [domaine du service elasticsearch]
  Port  443
  #https://stackoverflow.com/questions/71902938/fluent-bit-giving-400-with-elastic-search-contains-an-unknown-parameter-type
  Suppress_Type_Name On
  retry_limit false

retry_limit permet au service “Fluent-bit” de conserver la trace “rsyslog” tant que l’enregistrement dans ElasticSearch n’a pas fonctionné. La rétention est gérée en mémoire (RAM) par défaut, il existe un paramètre permettant la retention sur fichiers…

Configurer le parser “Fluent-bit”

  • Ouvrir le fichier "/etc/fluent-bit/parsers.conf"

  • Rechercher la section :

[PARSER]
	Name syslog-rfc3164-local"
  • Remplacer les expressions RegExp et Time_Format par :
    Regex       ^(?<time>[^ ]*+) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$
    Time_Format %Y-%m-%dT%H:%M:%S.%L%z

Ceci permettra de “parser” les messages “rsyslog” avec un timestamp muni du Timezone.

PS : Outils pour déboguer la regexp : a Ruby regular expression editor : Rubular

Configurer le Timezone “rsyslog” pour “Fluent-bit”

Par défaut les traces systèmes ne présentent pas le timezone, le format courant d’une trace est :

Sep  1 10:45:46 rxxxx-159 systemd[1]: Started Time & Date Service.

Ici, le timestamp consigné (Sep 1 10:45:46) et fournit par “rsyslog” n’inclut pas de timezone. ElasticSearch affecte des timestamp en UTC et tient compte de son paramètre “Timezone” pour la présentation. Une fois ce type de donnée injecté, vous serez confronté à un problème de décalage de 2h00.

Cette image illustre bien le problème : Configuration timezone KO On a une trace système consignée le “1er Sept à 08:05:49” et ElasticSearch donne un timestamp à UTC+0200 (Europe/Paris)…

Le résultat attendu est celui-ci : Configuration timezone OK

Configurer le service “rsyslog”

  • Créer le fichier "/etc/rsyslog.d/60-fluent-bit.conf" :
action(type="omfwd" template="RSYSLOG_FileFormat" Target="127.0.0.1" Port="5140" Protocol="tcp")

Tous les évènements interceptés par “rsyslog” seront transférés sur le service réseau 5140/TCP de “Fluent-bit” et pas uniquement le contenu de “/var/log/syslog”. Il ne faut pas confondre le service “rsyslog” et le fichier /var/log/syslog. Le fichier “/var/log/syslog” est complété par le service “rsyslog”, fonction de règles définies par l’administrateur. Par conséquent, ne vous attendez à retrouver dans elasticsearch que les éléments contenus dans “"/var/log/syslog”. Vous disposerez de tous les événements reçus par le service par “rsyslog”.

Redémarrage des services

  • Redémarrer le service “Fluent-bit” : systemctl restart fluent-bit
  • Redémarrer le service “rsyslog” : systemctl restart rsyslog

“Dispatch” d’un message système par “rsyslog”

Erreurs rsyslogd

Une fois démarré, “rsyslog” se connecte au service fluent-bit. Si “Fluent-bit” n’est pas démarré vous retrouverez l’erreur suivante dans le fichier “/var/log/syslog” :

rsyslogd: cannot connect to 127.0.0.1:5140: Connection refused