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ónrotate N: número de ficheros rotados a conservarsize N: rotar cuando supere un tamaño (ej.size 100M)compress: comprimir con gzipdateext: añadir fecha al nombre del fichero rotadopostrotate / 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