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”.
- 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).
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 :
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 :
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