====== 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**
[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 ===
#!/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 ===
#!/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 ===
* https://www.malekal.com/comment-utiliser-journalctl-pour-voir-lire-journaux-linux-systemd/
* https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs-fr
* https://www.linuxtricks.fr/wiki/systemd-utiliser-journalctl-les-logs-de-systemd