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:
- Centralización - Agregar logs de múltiples servidores para análisis unificado
- Confiabilidad - Usar TCP con colas para entrega garantizada de logs
- Seguridad - Implementar cifrado TLS para datos sensibles de logs
- Flexibilidad - Filtrar y enrutar logs basados en facility, severidad y contenido
- 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.


