Table des matières

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 :

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

Quelques liens