Envío de Logs a Servidor Centralizado con rsyslog

Introducción

La gestión de logs a través de múltiples servidores se vuelve cada vez más desafiante a medida que la infraestructura escala. El logging centralizado soluciona este problema agregando logs de todos los servidores en una ubicación única, permitiendo búsqueda unificada, análisis, correlación y almacenamiento a largo plazo. rsyslog es un sistema de logging potente y de alto rendimiento que sobresale en la recolección y reenvío de datos de logs en entornos distribuidos.

rsyslog ha sido el daemon de logging estándar en la mayoría de las distribuciones Linux durante más de una década, ofreciendo transmisión confiable de logs, filtrado flexible, transformación de formatos y soporte para varios protocolos incluyendo conexiones TCP, UDP y cifradas con TLS. A diferencia de los log shippers pesados, rsyslog es ligero, probado en batalla y ya está instalado en la mayoría de los sistemas.

Esta guía integral te enseña cómo configurar rsyslog para logging centralizado, cubriendo configuraciones tanto de cliente como de servidor. Aprenderás cómo configurar el reenvío seguro de logs, implementar filtrado y análisis de logs, configurar mecanismos de entrega confiable e integrar con stacks de logging modernos como Elasticsearch y Splunk. Ya sea que estés gestionando un puñado de servidores o miles, dominar la centralización de rsyslog es esencial para una gestión efectiva de logs.

Prerrequisitos

Antes de configurar logging centralizado con rsyslog, asegúrate de tener:

  • Múltiples servidores Linux (Ubuntu 20.04/22.04, Debian 10/11, CentOS 7/8, Rocky Linux 8/9)
  • Acceso root o sudo en todos los servidores
  • Conectividad de red entre servidores
  • Comprensión básica del protocolo syslog y formatos de logs
  • Un servidor designado como servidor de logs centralizado

Requisitos del Sistema:

  • Servidor de Logs: 8+ GB RAM, 100+ GB disco (escala con el volumen de logs)
  • Servidores Cliente: rsyslog instalado (usualmente por defecto)
  • Red: Conectividad estable, configuración de firewall

Entendiendo la Arquitectura de rsyslog

Componentes

rsyslog consiste de:

  • Módulos de entrada: Reciben logs de varias fuentes
  • Motor de filtrado: Procesan y enrutan logs basados en reglas
  • Módulos de salida: Envían logs a destinos
  • Sistema de colas: Buffer de logs para entrega confiable

Topología de Logging Centralizado

Cliente Servidor 1 (cliente rsyslog)
     |
     | TCP/UDP/TLS
     |
     v
Servidor Central de Logs (servidor rsyslog)
     |
     | (almacena localmente, reenvía a analytics)
     |
     v
Elasticsearch / Splunk / Almacenamiento de Archivos

Instalación y Verificación de rsyslog

rsyslog usualmente viene preinstalado en distribuciones Linux modernas.

Verificar Instalación

# Verificar si rsyslog está instalado
rsyslogd -v

# Verificar estado del servicio
sudo systemctl status rsyslog

# Ver configuración de rsyslog
ls -l /etc/rsyslog.conf
ls -l /etc/rsyslog.d/

Instalar si Falta

En Ubuntu/Debian:

sudo apt update
sudo apt install rsyslog -y

En CentOS/Rocky Linux:

sudo yum install rsyslog -y

Iniciar y habilitar rsyslog:

sudo systemctl enable rsyslog
sudo systemctl start rsyslog
sudo systemctl status rsyslog

Configuración del Servidor Central de Logs

El servidor central recibe logs de todos los servidores cliente y los almacena centralmente.

Configuración Básica del Servidor

Editar configuración de rsyslog:

sudo nano /etc/rsyslog.conf

Habilitar recepción UDP (puerto 514):

# Descomentar estas líneas para habilitar recepción syslog UDP
module(load="imudp")
input(type="imudp" port="514")

Habilitar recepción TCP (puerto 514) - Recomendado para confiabilidad:

# Descomentar estas líneas para habilitar recepción syslog TCP
module(load="imtcp")
input(type="imtcp" port="514")

Crear plantilla para organizar logs por hostname:

# Agregar al final de /etc/rsyslog.conf o crear /etc/rsyslog.d/30-remote.conf
sudo nano /etc/rsyslog.d/30-remote.conf
# Plantilla para organizar logs por hostname
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"

# Almacenar logs remotos usando plantilla
*.* ?RemoteLogs

# También detener procesamiento después de almacenar (comentar si quieres duplicar en /var/log/syslog)
& stop

Reiniciar rsyslog:

sudo systemctl restart rsyslog
sudo systemctl status rsyslog

Configuración Avanzada del Servidor

Organización de logs más sofisticada:

sudo nano /etc/rsyslog.d/30-remote.conf
# Plantilla de archivo dinámico con fecha
$template DailyPerHostLogs,"/var/log/remote/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%/%PROGRAMNAME%.log"

# Plantilla para logs de emergencia
$template EmergencyLogs,"/var/log/remote/%HOSTNAME%/emergency.log"

# Enrutar logs basados en severidad
if $fromsrv-ip startswith '192.168.1.' then {
    # Logs de emergencia y críticos a archivo separado
    if $syslogseverity <= 2 then {
        action(type="omfile" dynaFile="EmergencyLogs")
    }

    # Todos los logs a archivos organizados diariamente
    action(type="omfile" dynaFile="DailyPerHostLogs")

    # Detener procesamiento adicional para logs remotos
    stop
}

Filtrar por facility:

# Separar logs de autenticación
auth,authpriv.*   /var/log/remote/%HOSTNAME%/auth.log

# Separar logs de cron
cron.*            /var/log/remote/%HOSTNAME%/cron.log

# Separar logs de correo
mail.*            /var/log/remote/%HOSTNAME%/mail.log

Crear Directorios de Logs

# Crear directorio de logs remotos
sudo mkdir -p /var/log/remote

# Establecer permisos apropiados
sudo chmod 755 /var/log/remote

# Los subdirectorios serán creados automáticamente por rsyslog

Configuración de Firewall

Permitir tráfico syslog entrante:

UFW (Ubuntu/Debian):

# Permitir syslog UDP (si está habilitado)
sudo ufw allow 514/udp

# Permitir syslog TCP (recomendado)
sudo ufw allow 514/tcp

# Permitir solo desde subred específica
sudo ufw allow from 192.168.1.0/24 to any port 514 proto tcp

firewalld (CentOS/Rocky Linux):

# Permitir servicio syslog
sudo firewall-cmd --permanent --add-service=syslog

# O puertos específicos
sudo firewall-cmd --permanent --add-port=514/tcp
sudo firewall-cmd --permanent --add-port=514/udp

# Permitir desde origen específico
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="514" protocol="tcp" accept'

# Recargar firewall
sudo firewall-cmd --reload

iptables:

# Permitir syslog TCP
sudo iptables -A INPUT -p tcp --dport 514 -j ACCEPT

# Permitir syslog UDP
sudo iptables -A INPUT -p udp --dport 514 -j ACCEPT

# Guardar reglas
sudo netfilter-persistent save

Configuración de Servidores Cliente

Los servidores cliente reenvían sus logs al servidor central.

Configuración Básica del Cliente

Editar configuración de rsyslog:

sudo nano /etc/rsyslog.d/50-central-logging.conf

Reenviar todos los logs vía UDP:

# Reenviar todos los logs al servidor central (UDP)
*.* @192.168.1.100:514

Reenviar vía TCP (recomendado para confiabilidad):

# Reenviar todos los logs al servidor central (TCP)
*.* @@192.168.1.100:514

Reenviar con cola para confiabilidad:

# Reenviar logs con cola asistida por disco
*.* action(type="omfwd"
           target="192.168.1.100"
           port="514"
           protocol="tcp"
           queue.filename="fwdRule1"
           queue.maxdiskspace="1g"
           queue.saveonshutdown="on"
           queue.type="LinkedList"
           resumeRetryCount="-1")

Reiniciar rsyslog:

sudo systemctl restart rsyslog
sudo systemctl status rsyslog

Reenvío Selectivo de Logs

Reenviar solo facilities específicas:

# Reenviar solo logs de autenticación
auth,authpriv.* @@192.168.1.100:514

# Reenviar solo mensajes críticos
*.crit @@192.168.1.100:514

# Reenviar todo excepto debug
*.info;*.!debug @@192.168.1.100:514

Reenviar con copia local:

# Reenviar al servidor central
*.* @@192.168.1.100:514

# También mantener copia local
*.* /var/log/syslog

Excluir ciertos logs del reenvío:

# No reenviar mensajes debug
*.info;*.!debug @@192.168.1.100:514

# No reenviar mensajes cron
*.*;cron.none @@192.168.1.100:514

Reenvío Específico de Aplicaciones

Reenviar logs de Apache:

sudo nano /etc/rsyslog.d/apache-forward.conf
# Cargar módulo de entrada de archivos
module(load="imfile" PollingInterval="10")

# Log de acceso de Apache
input(type="imfile"
      File="/var/log/apache2/access.log"
      Tag="apache-access"
      Severity="info"
      Facility="local6")

# Log de errores de Apache
input(type="imfile"
      File="/var/log/apache2/error.log"
      Tag="apache-error"
      Severity="error"
      Facility="local6")

# Reenviar al servidor central
local6.* @@192.168.1.100:514

Reenviar logs de Nginx:

sudo nano /etc/rsyslog.d/nginx-forward.conf
module(load="imfile")

input(type="imfile"
      File="/var/log/nginx/access.log"
      Tag="nginx-access"
      Severity="info"
      Facility="local7")

input(type="imfile"
      File="/var/log/nginx/error.log"
      Tag="nginx-error"
      Severity="error"
      Facility="local7")

local7.* @@192.168.1.100:514

Reenviar logs de aplicaciones:

sudo nano /etc/rsyslog.d/app-forward.conf
module(load="imfile")

input(type="imfile"
      File="/var/log/myapp/app.log"
      Tag="myapp"
      Severity="info"
      Facility="local5"
      reopenOnTruncate="on")

local5.* action(type="omfwd"
                target="192.168.1.100"
                port="514"
                protocol="tcp")

Transmisión Segura de Logs con TLS

Para entornos de producción, cifra la transmisión de logs para proteger datos sensibles.

Configuración TLS del Servidor

Generar certificados TLS:

# Crear directorio para certificados
sudo mkdir -p /etc/rsyslog.d/certs

# Generar certificado CA
sudo openssl genrsa -out /etc/rsyslog.d/certs/ca-key.pem 2048
sudo openssl req -new -x509 -key /etc/rsyslog.d/certs/ca-key.pem \
    -out /etc/rsyslog.d/certs/ca-cert.pem -days 3650 \
    -subj "/CN=RSyslog-CA"

# Generar certificado del servidor
sudo openssl genrsa -out /etc/rsyslog.d/certs/server-key.pem 2048
sudo openssl req -new -key /etc/rsyslog.d/certs/server-key.pem \
    -out /etc/rsyslog.d/certs/server-req.pem \
    -subj "/CN=log-server.example.com"

# Firmar certificado del servidor
sudo openssl x509 -req -in /etc/rsyslog.d/certs/server-req.pem \
    -CA /etc/rsyslog.d/certs/ca-cert.pem \
    -CAkey /etc/rsyslog.d/certs/ca-key.pem \
    -CAcreateserial \
    -out /etc/rsyslog.d/certs/server-cert.pem -days 3650

# Establecer permisos
sudo chmod 600 /etc/rsyslog.d/certs/*key.pem

Configurar rsyslog para TLS:

sudo nano /etc/rsyslog.d/30-remote-tls.conf
# Cargar driver de flujo de red
module(load="imtcp"
       StreamDriver.Name="gtls"
       StreamDriver.Mode="1"
       StreamDriver.Authmode="x509/name"
       PermittedPeer=["*.example.com"])

# Establecer archivos de certificados
global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/ca-cert.pem"
    DefaultNetstreamDriverCertFile="/etc/rsyslog.d/certs/server-cert.pem"
    DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/certs/server-key.pem"
)

# Entrada TLS en puerto 6514
input(type="imtcp" port="6514")

# Plantilla de logs
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop

Reiniciar rsyslog:

sudo systemctl restart rsyslog

Configuración TLS del Cliente

Copiar certificado CA a los clientes:

# En el servidor
sudo cat /etc/rsyslog.d/certs/ca-cert.pem

# En el cliente, crear directorio y guardar certificado
sudo mkdir -p /etc/rsyslog.d/certs
sudo nano /etc/rsyslog.d/certs/ca-cert.pem
# Pegar contenido del certificado

Configurar cliente para TLS:

sudo nano /etc/rsyslog.d/50-central-logging-tls.conf
# Cargar driver de flujo de red
module(load="omfwd")

# Configuración TLS global
global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/rsyslog.d/certs/ca-cert.pem"
)

# Reenviar logs vía TLS
*.* action(type="omfwd"
           target="log-server.example.com"
           port="6514"
           protocol="tcp"
           StreamDriver="gtls"
           StreamDriverMode="1"
           StreamDriverAuthMode="x509/name"
           StreamDriverPermittedPeers="log-server.example.com"
           queue.filename="fwdRule1"
           queue.maxdiskspace="1g"
           queue.saveonshutdown="on"
           queue.type="LinkedList"
           resumeRetryCount="-1")

Reiniciar rsyslog:

sudo systemctl restart rsyslog

Prueba del Reenvío de Logs

Generar Logs de Prueba

En el servidor cliente:

# Generar mensaje syslog de prueba
logger -t test-app "This is a test message from $(hostname)"

# Generar con prioridad específica
logger -p local0.info "Test message with facility local0"

# Generar múltiples mensajes de prueba
for i in {1..10}; do
    logger -t test-app "Test message $i from $(hostname)"
    sleep 1
done

Verificar en el Servidor Central

# Verificar si los logs están llegando
sudo tail -f /var/log/remote/client-hostname/test-app.log

# Verificar todos los logs remotos
sudo tail -f /var/log/remote/*/*.log

# Buscar mensaje específico
sudo grep "test message" /var/log/remote/*/*

Monitorear Estado de rsyslog

En el cliente:

# Verificar estado de rsyslog
sudo systemctl status rsyslog

# Ver estadísticas de rsyslog
sudo rsyslogd -i /var/run/rsyslogd.pid -x

# Verificar errores
sudo journalctl -u rsyslog | grep -i error

# Ver estado de la cola
sudo ls -lh /var/spool/rsyslog/

En el servidor:

# Monitorear conexiones entrantes
sudo netstat -an | grep :514

# O usando ss
sudo ss -tln | grep :514

# Verificar uso de disco
du -sh /var/log/remote/

# Contar logs entrantes
sudo tail -f /var/log/remote/*/*.log | wc -l

Rotación de Logs para Servidor Central

Con logging centralizado, implementa rotación adecuada de logs para gestionar espacio en disco.

Configurar logrotate

sudo nano /etc/logrotate.d/rsyslog-remote
/var/log/remote/*/*.log
{
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /bin/kill -HUP $(cat /var/run/rsyslogd.pid 2> /dev/null) 2> /dev/null || true
    endscript
}

# Logs de emergencia - mantener más tiempo
/var/log/remote/*/emergency.log
{
    weekly
    rotate 52
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
}

Script de Limpieza Automatizada

sudo nano /usr/local/bin/cleanup-old-logs.sh
#!/bin/bash
# cleanup-old-logs.sh - Eliminar logs más antiguos de 90 días

LOG_DIR="/var/log/remote"
RETENTION_DAYS=90

echo "Cleaning up logs older than $RETENTION_DAYS days in $LOG_DIR"

# Encontrar y eliminar archivos de logs antiguos
find "$LOG_DIR" -type f -name "*.log.gz" -mtime +$RETENTION_DAYS -delete

# Encontrar y eliminar archivos de logs antiguos
find "$LOG_DIR" -type f -name "*.log" -mtime +$RETENTION_DAYS -delete

# Eliminar directorios vacíos
find "$LOG_DIR" -type d -empty -delete

echo "Cleanup completed"
# Hacer ejecutable
sudo chmod +x /usr/local/bin/cleanup-old-logs.sh

# Agregar a cron (ejecutar semanalmente)
sudo crontab -e
# Agregar: 0 2 * * 0 /usr/local/bin/cleanup-old-logs.sh

Integración con Otros Sistemas

Reenviar a Elasticsearch

sudo nano /etc/rsyslog.d/elasticsearch.conf
# Cargar módulo de salida de Elasticsearch
module(load="omelasticsearch")

# Plantilla para Elasticsearch
template(name="elasticsearch-template"
         type="list") {
    constant(value="{\"timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
    constant(value="\",\"host\":\"")        property(name="hostname")
    constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
    constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
    constant(value="\",\"program\":\"")     property(name="programname")
    constant(value="\",\"message\":\"")     property(name="msg" format="json")
    constant(value="\"}")
}

# Enviar a Elasticsearch
*.* action(type="omelasticsearch"
           server="localhost"
           serverport="9200"
           template="elasticsearch-template"
           searchIndex="syslog-index"
           searchType="events"
           bulkmode="on"
           queue.type="linkedlist"
           queue.size="5000"
           queue.dequeuebatchsize="300"
           action.resumeretrycount="-1")

Reenviar a Servidor Syslog Remoto (Relay)

# El servidor central también puede reenviar a otro servidor
sudo nano /etc/rsyslog.d/relay.conf
# Reenviar a servidor de respaldo
*.* @@backup-log-server.example.com:514

# O reenviar a servicio cloud
*.* @@logs.papertrailapp.com:12345

Ajuste de Rendimiento

Optimizar Rendimiento del Servidor

sudo nano /etc/rsyslog.d/tuning.conf
# Aumentar tamaño de cola de mensajes
$MainMsgQueueSize 100000

# Usar cola asistida por disco
$MainMsgQueueType LinkedList
$MainMsgQueueFileName mainqueue
$WorkDirectory /var/spool/rsyslog

# Aumentar número de hilos
$MainMsgQueueWorkerThreads 4

# Escritura por lotes para mejor rendimiento
$OMFileAsyncWriting on
$OMFileFlushInterval 10

Rendimiento del Cliente

# Usar envío con buffer
*.* action(type="omfwd"
           target="192.168.1.100"
           port="514"
           protocol="tcp"
           queue.type="LinkedList"
           queue.filename="remote"
           queue.maxdiskspace="1g"
           queue.size="10000"
           queue.dequeuebatchsize="100")

Solución de Problemas

Modo Debug

# Ejecutar rsyslog en modo debug
sudo rsyslogd -N1 -d

# O editar config para habilitar debug
sudo nano /etc/rsyslog.conf
# Agregar: $DebugLevel 2
# Agregar: $DebugFile /var/log/rsyslog-debug.log

Problemas Comunes

Problema 1: Los logs no se reenvían

# Verificar si rsyslog está ejecutándose
sudo systemctl status rsyslog

# Probar conectividad de red
telnet 192.168.1.100 514

# Verificar firewall
sudo iptables -L -n | grep 514

# Verificar sintaxis de configuración
sudo rsyslogd -N1

# Verificar errores
sudo journalctl -u rsyslog | grep -i error

Problema 2: Los logs no aparecen en el servidor

# Verificar que el servidor está escuchando
sudo ss -tln | grep 514

# Verificar si existe el directorio de logs
ls -ld /var/log/remote

# Verificar permisos
ls -l /var/log/remote

# Verificar SELinux (si aplica)
sudo sestatus
sudo setenforce 0  # Deshabilitar temporalmente para probar

Problema 3: Fallos de conexión TLS

# Verificar certificados
openssl x509 -in /etc/rsyslog.d/certs/server-cert.pem -text -noout

# Probar conexión TLS
openssl s_client -connect log-server.example.com:6514

# Verificar permisos de certificados
ls -l /etc/rsyslog.d/certs/

# Ver errores detallados
sudo rsyslogd -N1 -d 2>&1 | grep -i tls

Conclusión

El logging centralizado con rsyslog proporciona una solución robusta y escalable para la agregación de logs a través de infraestructura distribuida. Al implementar las configuraciones en esta guía, has creado un sistema de logging confiable que asegura que todos los logs de servidores sean recolectados, asegurados y accesibles desde una ubicación central.

Conclusiones clave:

  1. Centralización - Agregar logs de múltiples servidores para análisis unificado
  2. Confiabilidad - Usar TCP con colas para entrega garantizada de logs
  3. Seguridad - Implementar cifrado TLS para datos sensibles de logs
  4. Flexibilidad - Filtrar y enrutar logs basados en facility, severidad y contenido
  5. Integración - Reenviar logs a plataformas de analytics modernas

Mejores prácticas:

  • Usar TCP con colas para entornos de producción
  • Implementar TLS para seguridad de transmisión de logs
  • Configurar rotación y retención adecuadas de logs
  • Monitorear espacio en disco en el servidor central de logs
  • Probar escenarios de failover y recuperación de colas
  • Documentar tu infraestructura de logging
  • Implementar controles de acceso en archivos de logs
  • Respaldo regular de logs críticos

El footprint ligero de rsyslog, confiabilidad probada y conjunto extenso de características lo hacen ideal para logging centralizado. Ya sea que estés reenviando a almacenamiento local, Elasticsearch, Splunk o servicios de logging en la nube, rsyslog proporciona la base flexible necesaria para la gestión integral de logs en infraestructura moderna.