Linux, les logs et journald (remote)
Avant-propos
Le vénérable syslog, né en 2001, joue toujours un rôle important dans le suivi et l'administration des infrastructures.
Sa simplicité de conception et d'utilisation, sa rusticité, sa liaison naturelle avec logrotate en ont fait le standard en matière des gestion centralisée des logs.
Toutefois, certaines limites sont apparues au fil des années : le format syslog est limité et peu adapté aux informations produites au format JSON par de nombreuses applications.
Par ailleurs, l'exploitation et la recherche des logs nécessite une familiarité certaine avec les outils unix standard comme grep, awk, zcat, et les expressions régulières … Les dates et les intervalles temporels ne sont pas non plus faciles à gérer.
journalctl offre sur ces points des améliorations sensibles.
Syslog rappel
Emetteur : fichier /etc/rsyslog.conf
... *.* @192.168.1.100 # exporte tous les logs de toute gravité et de toute origine vers l'adresse 192.168.100 port UDP 514
Récepteur : fichier /etc/rsyslog.conf
... module(load="imudp") # on charge le module imudp input(type="imudp" port="514") # on accepte les entrées sur le port UDP 514 ...
journald et systemd
Le développement de systemd a permis le développement de journald et journalctl permettant une exploitation plus efficace des logs.
journal-remote permet d'exporter les logs journald et de les intégrer sur une machine distante.
journal-remote : le récepteur ou serveur de collecte
On doit spécifier 3 paramètres situés dans 2 fichiers de configuration :
- le port TCP d'écoute
- le protocole utilisé : http ou https
- le répertoire de destination des logs en entrée
On doit installer le paquet systemd-journal-remote et activer l'écoute sur le port :
sudo apt-get install systemd-journal-remote sudo systemctl enable systemd-journal-remote.socket
Journal-remote peut fonctionner en mode passif ou actif, le mode passif nous intéressera seul ici.
Le fichier de configuration /etc/systemd/system/sockets.target.wants/systemd-journal-remote.socket décrit le port d'écoute avec la rubrique ListenStream.
[Unit] Description=Journal Remote Sink Socket [Socket] ListenStream=19532 [Install] WantedBy=sockets.target
Protocole(http/https) et emplacement du journal/log
Pour changer le protocole utilisé (http/https) pour le transfert, et la destination, copier /lib/systemd/system/systemd-journal-remote.service dans le répertoire /etc/systemd/system/,
puis éditer le fichier /etc/systemd/system/systemd-journal-remote.service
- systemd-journal-remote.service
[Unit] Description=Journal Remote Sink Service Documentation=man:systemd-journal-remote(8) man:journal-remote.conf(5) Requires=systemd-journal-remote.socket [Service] ExecStart=/etc/systemd/systemd-journal-remote \ --listen-http=-3 \ --output=/var/log/journal/remote/ User=systemd-journal-remote Group=systemd-journal-remote PrivateTmp=yes PrivateDevices=yes PrivateNetwork=yes WatchdogSec=3min [Install] Also=systemd-journal-remote.socket
La clause –listen-http=-3 indique que le journal utilise http. On peut le changer pour https avec –listen-https=-3.
La clause –output=/var/log/journal/remote/ indique le répertoire de stockage du journal. Il doit être créé s'il n'existe pas et doit être possédé par l'utilisateur systemd-journal-remote.
sudo mkdir /var/log/journal/remote sudo chown systemd-journal-remote /var/log/journal/remote
Relancer journal-remote.socket après la configuration avec :
sudo systemctl daemon-reload
Que dire du fichier /etc/systemd/journal-remote.conf ?
[Remote] # Seal=false # SplitMode=host # ServerKeyFile=/etc/ssl/private/journal-remote.pem # ServerCertificateFile=/etc/ssl/certs/journal-remote.pem # TrustedCertificateFile=/etc/ssl/ca/trusted.pem
La rubrique SplitMode=host sépare les logs entrants dans un fichier par source, SplitMode=false les regroupe en un seul fichier
journal-remote : l'émetteur
L'application à installer est également systemd-journal-remote
sudo apt install -y systemd-journal-remote
La configuration ne concerne qu'un seul fichier : /etc/systemd/journal-upload.conf, dans lequel on doit indiquer l'URL de destination (écoute sur le port 19532). Il est possible d'utiliser une liaison sécurisée par TLS en gérant les certificats.
Fichier /etc/systemd/journal-upload.conf
[Upload] URL=http://10.0.0.1:19532 # ServerKeyFile=/etc/ssl/private/journal-upload.pem # ServerCertificateFile=/etc/ssl/certs/journal-upload.pem # TrustedCertificateFile=/etc/ssl/ca/trusted.pem
Pour lancer automatiquement systemd-journal-upload.service au démarrage :
sudo systemctl enable systemd-journal-upload.service
On peut alors relancer le service systemd-journal-upload.service pour prendre en charge le changement de configuration :
sudo systemctl restart systemd-journal-upload.service
Exploitation et examen des logs
journalctl permet d'examiner et d'effectuer des recherches sur les logs
journalctl affiche par défaut les logs de la machine locale.
Pour afficher les logs issus de machines distantes, on doit spécifier le répertoire de stockage des logs distants
journalctl -D /var/log/journal/remote
On peut également spécifier un fichier avec journalctl –file=ficher
journalctl -D /var/log/journal/remote # affiche tous les logs hébergés dans le répertoire /var/log/journal/remote Jan 06 21:17:01 journald-snd-1 CRON[833]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0) -- Boot fed69de4b7ca4d1fb0146227197b67b4 -- Jan 06 21:17:01 journald-snd-2 CRON[833]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly) -- Boot 6e692b3ce23b4e47992a2856c4536262 -- Jan 06 21:17:01 journald-snd-1 CRON[834]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly) -- Boot fed69de4b7ca4d1fb0146227197b67b4 -- Jan 06 21:17:01 journald-snd-2 CRON[832]: pam_unix(cron:session): session closed for user root -- Boot 6e692b3ce23b4e47992a2856c4536262 -- Jan 06 21:17:01 journald-snd-1 CRON[833]: pam_unix(cron:session): session closed for user root ...
vagrant@journald-rcv:~$ ls -lh /var/log/journal/remote total 17M -rw-r----- 1 systemd-journal-remote systemd-journal-remote 8.0M Jan 6 21:17 remote-192.168.56.11.journal -rw-r----- 1 systemd-journal-remote systemd-journal-remote 8.0M Jan 6 21:17 remote-192.168.56.12.journal
La commande journalctl offre de très nombreuses options décrites dans la manpage.
Scripts bash
Ces scripts permettent d'installer et configurer systemd-journal-remote aux deux extrémités (récepteur et émetteur) en mode HTTP sur le port TCP 19532.
Ils ont été testés sur Debian Bullseye 11.6 et Bookworm 12.1
Script configuration récepteur : journald-rcv.sh
- journald-rcv.sh
#!/bin/bash sudo timedatectl set-timezone Europe/Paris sudo apt-get update sudo apt-get install -y systemd-journal-remote sudo systemctl enable --now systemd-journal-remote.socket sudo cp /lib/systemd/system/systemd-journal-remote.service /etc/systemd/system sudo sed -i 's/--listen-https=-3/--listen-http=-3/' /etc/systemd/system/systemd-journal-remote.service [[ -d /var/log/journal/remote ]] || sudo mkdir /var/log/journal/remote sudo chown systemd-journal-remote /var/log/journal/remote sudo systemctl daemon-reload sudo systemctl restart systemd-journal-remote.service ss -lnt
Script configuration émetteur : journald-snd.sh
- journald-snd.sh
#!/bin/bash # usage : ./journald-snd.sh 192.168.1.100 sudo timedatectl set-timezone Europe/Paris sudo apt-get update sudo apt-get install -y systemd-journal-remote rpl="s/^# URL=/URL=http:\/\/${1}:19532/" # $1 represente l'adresse du recepteur sudo sed -i "$rpl" /etc/systemd/journal-upload.conf sudo systemctl enable --now systemd-journal-upload.service sudo systemctl restart systemd-journal-upload.service