Saltar a contenido

Recolección centralizada de logs de sistema, mediante journald.

Implementa en tu escenario de trabajo de Openstack, un sistema de recolección de log mediante journald. Para ello debes, implementar un sistema de recolección de log mediante el paquete systemd-journal-remote, o similares.


En mi caso, estaré realizando esta práctica mediante un escenario en Vagrant, ya que el escenario en OpenStack daba problemas con los contenedores LXC. Contaré con un servidor y tres clientes (2 Debian y 1 Rocky Linux) para realizar la práctica, el Vagrantfile es el siguiente.

Vagrant.configure("2") do |config|
  config.vm.provider :libvirt do |libvirt|
    libvirt.memory = 1024
  end

  config.vm.define :servidor do |servidor|
    servidor.vm.box = "debian/bullseye64"
    servidor.vm.hostname = "servidor"
    servidor.vm.synced_folder ".", "/vagrant", disabled: true
  end

  config.vm.define :cliente_debian1 do |cliente_debian1|
    cliente_debian1.vm.box = "debian/bullseye64"
    cliente_debian1.vm.hostname = "cliente-debian1"
    cliente_debian1.vm.synced_folder ".", "/vagrant", disabled: true
  end

  config.vm.define :cliente_rocky do |cliente_rocky|
    cliente_rocky.vm.box = "rockylinux/9"
    cliente_rocky.vm.hostname = "cliente-rocky"
    cliente_rocky.vm.synced_folder ".", "/vagrant", disabled: true
  end

  config.vm.define :cliente_debian2 do |cliente_debian2|
    cliente_debian2.vm.box = "debian/bullseye64"
    cliente_debian2.vm.hostname = "cliente-debian2"
    cliente_debian2.vm.synced_folder ".", "/vagrant", disabled: true
  end
end

Instalación de paquetes en todas las máquinas

En primer lugar, instalaremos los paquetes necesarios en todas las máquinas del escenario.

  • Debian
apt update
apt install systemd-journal-remote
  • Rocky
dnf check-update
dnf install systemd-journal-remote

Hecho esto, podemos seguir con los siguientes pasos.

Configuración de la máquina servidor

Una vez hemos instalado los paquetes en las máquinas, podemos empezar configurando el servidor el cual va a recibir los logs de los clientes.

Iniciamos el socket para el funcionamiento del servicio.

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

Lo siguiente, será hacer algunas configuraciones en el fichero /lib/systemd/system/systemd-journal-remote.service.

sudo nano /lib/systemd/system/systemd-journal-remote.service

Aquí modificaremos el parámetro https por http.

Untitled

Esto lo hacemos, ya que por defecto Journald trabaja por el protocolo https mediante certificados TLS, en nuestro caso, al encontrarnos en un entorno aislado, lo haremos mediante http sin necesidad de certificados.

Podemos observar que en esa misma línea se encuentra el parámetro output seguido de una ruta, esta será la ruta en la que se almacenen los logs de los clientes, en caso de que no exista debemos crearla y definir como propietarios al usuario systemd-journal-remote.

chown systemd-journal-remote /var/log/journal/remote

Una vez terminada la configuración, podemos reiniciar los servicios y comprobar su estado.

sudo systemctl restart systemd-journal-remote.service
systemctl restart systemd-journal-upload.service

Untitled

Untitled

Configuración de los clientes

Esta configuración la replicaremos en cada uno de los clientes, el proceso es similar en todos ellos.

Tendremos que configurar el componente que se encarga de transmitir los mensajes de registro al servidor, este componente es el systemd-journal-upload. Para esto, tenenemos que crear un usuario de la siguiente manera.

adduser --system --home /run/systemd --no-create-home --disabled-login --group systemd-journal-upload
  1. -system:
    • Este parámetro indica que se está creando un usuario de sistema en lugar de un usuario regular.
  2. -home /run/systemd:
    • Establece el directorio de inicio del usuario en /run/systemd. El directorio de inicio es donde se colocan los archivos y directorios personales de un usuario. En este caso, /run/systemd es el directorio de inicio asignado para este usuario.
  3. -no-create-home:
    • Este parámetro indica que no se debe crear automáticamente el directorio de inicio del usuario. En otras palabras, si el directorio de inicio especificado no existe, no se creará.
  4. -disabled-login:
    • Deshabilita el inicio de sesión para este usuario. Esto significa que el usuario no podrá iniciar sesión en el sistema, ya sea de forma local o remota.
  5. -group:
    • Crea un grupo con el mismo nombre que el usuario y agrega al usuario a ese grupo. Esto asegura que el usuario tenga su propio grupo primario asociado a él.
  6. systemd-journal-upload:
    • Es el nombre del usuario que se está creando. En este caso, el usuario se llamará systemd-journal-upload.

Una vez creado el usuario, debemos modificar el fichero de configuración /etc/systemd/journal-upload.conf indicando el protocolo, IP de la máquina remota y puerto de comunicación.

sudo nano /etc/systemd/journal-upload.conf

Untitled

Finalmente, podemos reiniciar el servicio y comprobar el funcionamiento.

systemctl restart systemd-journal-upload.service

Untitled

Pruebas de funcionamiento

Podemos comprobar que el servicio está funcionando, listando el fichero donde hemos configurado el almacenamiento de los logs, aqúi deberán aparecer 3 ficheros, uno para cada máquina cliente.

ls -lh /var/log/journal/remote/

Untitled

Como podemos comprobar, aparecen los 3 ficheros de los clientes, estos indican la IP de cada uno de ellos, ver los logs de las máquinas, podemos ejecutar el siguiente comando.

journalctl --file=/var/log/journal/remote/remote-X.X.X.X.journal

Untitled

Podemos filtrar con less, para hacer una búsqueda mas detallada.

journalctl --file=/var/log/journal/remote/remote-X.X.X.X.journal | less

Untitled