====== 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 === 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