Envío de journal a otra máquina: systemd-journal-remote

per Victor Carceler darrera modificació 2023-11-03T12:39:48+01:00

El servicio systemd-journal-remote.service nos permitirá enviar journal a una máquina remota utilizando para ello los protocolos https o http.

En este ejemplo se transmitirán los datos utilizando http en aras de la simplicidad, para evitar tener que utilizar certificados. Si la red no es de confianza se debería utilizar https.

El primer paso consistirá en instalar el paquete systemd-journal-remote en los dos equipos.

En la máquina que va a enviar el journal podremos editar el fichero /etc/systemd/journal-upload.conf para indicar la URL del servidor de destino. El puerto por defecto es el 19532.

[Upload]
URL=http://192.168.0.23:19532
# ServerKeyFile=/etc/ssl/private/journal-upload.pem
# ServerCertificateFile=/etc/ssl/certs/journal-upload.pem
# TrustedCertificateFile=/etc/ssl/ca/trusted.pem

En la máquina que va a recibir los datos deberemos editar el fichero /lib/systemd/system/systemd-journal-remote.service para cambiar el parámetro --listen-https por --listen-http.

[Unit]
Description=Journal Remote Sink Service
Documentation=man:systemd-journal-remote(8) man:journal-remote.conf(5)
Requires=systemd-journal-remote.socket

[Service]
ExecStart=/lib/systemd/systemd-journal-remote --listen-http=-3 --output=/var/log/journal/remote/
LockPersonality=yes
LogsDirectory=journal/remote
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateNetwork=yes
PrivateTmp=yes
ProtectProc=invisible
ProtectClock=yes
ProtectControlGroups=yes
ProtectHome=yes
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectSystem=strict
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
SystemCallArchitectures=native
User=systemd-journal-remote
WatchdogSec=3min

# If there are many split up journal files we need a lot of fds to access them
# all in parallel.
LimitNOFILE=524288

[Install]
Also=systemd-journal-remote.socket

Finalmente en el servidor que recibe los datos tendremos que activar:

systemctl enable --now systemd-journal-remote.socket
systemctl enable --now systemd-journal-remote.service

Y en el ordenador que envía journal

systemctl enable --now systemd-journal-upload.service

Podremos comprobar que en el servidor de destino tendremos los datos recibidos en /var/log/journal/remote. Y será posible utilizar el parámetro --file de journalctl para consultar los datos recibidos.

Por ejemplo:

journalctl -f --file=/var/log/journal/remote/remote-192.168.0.10.journal

Si systemd-journal-upload.service se encuentra con un problema al transmitir datos (por ejemplo el receptor está apagado) falla. Por eso es importante añadir los parámetros (Restart=on-failure y RestartSec=2min) al fichero /lib/systemd/system/systemd-journal-upload.service para reiniciar el servicio cuando falle.

[Unit]
Description=Journal Remote Upload Service
Documentation=man:systemd-journal-upload(8)
Wants=network-online.target
After=network-online.target

[Service]
DynamicUser=yes
ExecStart=/lib/systemd/systemd-journal-upload --save-state
LockPersonality=yes
MemoryDenyWriteExecute=yes
PrivateDevices=yes
ProtectProc=invisible
ProtectControlGroups=yes
ProtectHome=yes
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
RestrictNamespaces=yes
RestrictRealtime=yes
StateDirectory=systemd/journal-upload
SupplementaryGroups=systemd-journal
SystemCallArchitectures=native
User=systemd-journal-upload
WatchdogSec=3min
# Queremos reiniciar si falla el destino
Restart=on-failure
RestartSec=2min


# If there are many split up journal files we need a lot of fds to access them
# all in parallel.
LimitNOFILE=524288

[Install]
WantedBy=multi-user.target

Más información: