Rotación de logs

Introducción

Los logs son esenciales para detectar problemas y analizar incidentes de seguridad, pero sin control pueden llenar el disco y hacer que el sistema deje de funcionar. La rotación de logs comprime y archiva los logs antiguos automáticamente, manteniendo solo los más recientes y liberando espacio.

logrotate

logrotate es la herramienta estándar para rotar los ficheros de log en /var/log/. Se ejecuta diariamente mediante cron o systemd timer.


# Ver la configuración global
cat /etc/logrotate.conf

# Las configuraciones por servicio están en:
ls /etc/logrotate.d/

# Ejecutar logrotate manualmente (modo prueba, sin rotar)
logrotate --debug /etc/logrotate.conf

# Forzar rotación ahora
logrotate --force /etc/logrotate.conf
          

Configuración de logrotate

Ejemplo de fichero en /etc/logrotate.d/mi-aplicacion:


/var/log/mi-aplicacion/*.log {
    daily              # rotar cada día
    missingok          # no dar error si el fichero no existe
    rotate 14          # conservar 14 rotaciones (14 días)
    compress           # comprimir con gzip
    delaycompress      # comprimir a partir de la segunda rotación
    notifempty         # no rotar si el fichero está vacío
    create 0640 www-data adm   # permisos del nuevo fichero de log
    sharedscripts      # ejecutar postrotate una sola vez para todos los ficheros
    postrotate
        systemctl reload mi-aplicacion 2>/dev/null || true
    endscript
}
          

Directivas más usadas:

  • daily / weekly / monthly: frecuencia de rotación
  • rotate N: número de ficheros rotados a conservar
  • size N: rotar cuando supere un tamaño (ej. size 100M)
  • compress: comprimir con gzip
  • dateext: añadir fecha al nombre del fichero rotado
  • postrotate / endscript: comandos a ejecutar tras rotar

Retención en systemd-journald

El journal de systemd almacena logs en /var/log/journal/ (o en memoria si no existe ese directorio). Su tamaño se controla en /etc/systemd/journald.conf:


# /etc/systemd/journald.conf

[Journal]
# Tamaño máximo del journal en disco
SystemMaxUse=500M

# Tamaño máximo de cada fichero del journal
SystemMaxFileSize=50M

# Conservar logs de los últimos N días
MaxRetentionSec=30day

# Guardar en disco de forma persistente (sobrevive a reinicios)
Storage=persistent
          

# Aplicar cambios
systemctl restart systemd-journald

# Ver el espacio que ocupa el journal
journalctl --disk-usage

# Limpiar logs más antiguos de 30 días
journalctl --vacuum-time=30d

# Limpiar hasta dejar el journal en 200 MB
journalctl --vacuum-size=200M
          

Monitorizar el espacio de logs


# Ver el tamaño de /var/log por subdirectorio
du -sh /var/log/* | sort -rh | head -20

# Ver los ficheros de log más grandes
find /var/log -type f -name "*.log" -exec du -sh {} \; | sort -rh | head -10

# Espacio total en disco
df -h /var/log
          

Logs importantes para la seguridad

  • /var/log/auth.log: intentos de login, sudo, SSH (Debian/Ubuntu)
  • /var/log/syslog: log general del sistema
  • /var/log/ufw.log: conexiones bloqueadas por UFW
  • /var/log/fail2ban.log: IPs baneadas por fail2ban
  • /var/log/dpkg.log: instalaciones y actualizaciones de paquetes

# Ver intentos de login fallidos
grep "Failed password" /var/log/auth.log | tail -20

# Ver IPs con más intentos fallidos
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head

# Seguir auth.log en tiempo real
tail -f /var/log/auth.log
          

Una política de retención bien configurada garantiza tener logs suficientes para auditar incidentes (mínimo 30 días recomendado) sin comprometer el espacio en disco.

Actualizaciones automáticas

Índice de la sección

Índice del curso