Recopilar logs de Linux: tar, UAC y Velociraptor
Qué recopilar para investigar logs de Linux y cómo: un comando tar en un host en vivo, journalctl, ausearch, UAC, Velociraptor o una imagen de disco montada.
En resumen. Como root, archiva /var/log (logs de texto, journal, auditoría, wtmp/btmp/lastlog), el journal volátil de /run/log/journal y cuatro archivos de contexto: /etc/localtime, /etc/timezone, /etc/passwd y /etc/hostname. Conserva todas las rotaciones y todos los archivos .journal~, mantén la estructura de carpetas y calcula el hash del archivo. Basta con un comando tar; UAC y Velociraptor lo hacen a escala.
La lista de archivos
| Ruta | Contenido | Por qué |
|---|---|---|
/var/log/auth.log*, /var/log/syslog* | Logs de texto de Debian y Ubuntu | SSH, sudo, PAM, cron, servicios |
/var/log/secure*, /var/log/messages* | Logs de texto de RHEL, Rocky, Alma y Fedora | Lo mismo, con rotaciones fechadas (secure-20260913) |
/var/log/journal/<machine-id>/*.journal, *.journal~ | Journal de systemd persistente | Campos de confianza, microsegundos, números de secuencia |
/run/log/journal/<machine-id>/*.journal | Journal volátil | Se pierde al reiniciar; el único journal en algunos hosts |
/var/log/audit/audit.log* | auditd | Inicios de sesión, sesiones, programas ejecutados |
/var/log/wtmp*, /var/log/btmp*, /var/log/lastlog | Registros de inicio de sesión | Sesiones, inicios de sesión fallidos, último inicio de sesión por UID |
/run/utmp | Sesiones actuales | Solo en un host en vivo |
/var/lib/wtmpdb/wtmp.db, /var/log/wtmp.db | wtmpdb | openSUSE, Debian 13 |
/var/lib/lastlog/lastlog2.db | lastlog2 | util-linux 2.40+ |
/etc/localtime, /etc/timezone | Zona horaria | Para las líneas syslog sin desfase |
/etc/passwd, /etc/hostname | Correspondencia UID-nombre, nombre del host | Atribución |
Los archivos de zona horaria importan más de lo que parece. Una línea RFC 3164 tradicional como Sep 14 10:02:11 no tiene año ni zona: sin /etc/localtime, cada conversión a UTC es una suposición.
Host en vivo: un solo comando tar
Como root en el host:
sudo tar -C / -czf /tmp/linux-logs.tar.gz --ignore-failed-read --sparse \
var/log run/log/journal etc/localtime etc/timezone etc/passwd etc/hostname
Después copia el archivo a tu estación de trabajo:
scp user@host:/tmp/linux-logs.tar.gz .
Notas sobre las opciones:
--ignore-failed-readomite las rutas que no existen en esa distribución (no hay/etc/timezoneen RHEL ni/run/log/journalen hosts con almacenamiento persistente) con una advertencia en lugar de fallar.--sparseimporta paralastlog: es un archivo disperso indexado por UID y puede aparentar muchos gigabytes cuando ha iniciado sesión un UID alto.--sparseguarda solo los bloques usados.- Se necesita root:
auth.log,btmp,audit.logy el journal no son legibles por usuarios normales.
Escribir el archivo en /tmp modifica el disco del sistema objetivo. Si eso no es aceptable, escribe en un soporte externo montado o envía el archivo por SSH.
Si solo puedes ejecutar journalctl
El formato de exportación de journalctl no pierde información y conserva todos los campos:
sudo journalctl -o export > journal.export
sudo journalctl -D /mnt/evidence/var/log/journal -o export > journal.export # desde una imagen montada
-o json también sirve. Aun así, los archivos del journal en bruto son mejores: la exportación es lo que journalctl pudo leer, mientras que los archivos conservan los números de secuencia, las cabeceras y los finales dañados, que es donde aparecen las entradas borradas. Pasa siempre -D al leer evidencias: sin esa opción, journalctl lee el journal del propio equipo de análisis.
Todos los logs de auditoría en un archivo
sudo ausearch --input-logs --raw > audit.log
--input-logs lee la ubicación de los logs desde auditd.conf, incluidos los archivos rotados audit.log.N, y --raw conserva los registros originales, incluidos los campos ENRICHED que siguen al separador 0x1D. En un host en vivo, guarda también las reglas cargadas: auditctl -l y auditctl -s. Las reglas cargadas pueden diferir de /etc/audit/rules.d/.
UAC
UAC (Unix-like Artifacts Collector) es un script de shell que funciona en casi cualquier Unix. Solo con los artefactos de logs:
sudo ./uac -a files/logs/var_log.yaml,files/logs/run_log.yaml,files/system/etc.yaml,files/system/utmp.yaml /tmp
-a acepta una lista de archivos de artefactos separada por comas. La salida es uac-<host>-linux-<date>.tar.gz, que Linux Log Parser abre directamente. También puedes usar el perfil de triaje estándar, que incluye los mismos logs y mucho más:
sudo ./uac -p ir_triage /tmp
UAC incluye los perfiles ir_triage, full, offline y offline_ir_triage. Los perfiles offline están pensados para una imagen montada, no para un sistema en ejecución.
Velociraptor
Recopila los archivos en bruto con Generic.Collectors.File, con raíz en /, desde la interfaz gráfica, una búsqueda (hunt), un recolector offline o la línea de comandos:
velociraptor artifacts collect Generic.Collectors.File \
--args Root=/ --args collectionSpec=$'Glob\nvar/log/**\nrun/log/journal/**\netc/localtime\netc/timezone\netc/passwd\netc/hostname' \
--output linux-logs.zip
Arrastra el ZIP resultante a la herramienta tal cual. Velociraptor también tiene artefactos de análisis como Linux.Forensics.Journal, Linux.Sys.LastUserLogin, Linux.Syslog.SSHLogin y Linux.Ssh.AuthorizedKeys. Son útiles para buscar en toda una flota, pero devuelven filas, no archivos, así que no se pueden volver a analizar ni revisar después en busca de huecos de secuencia. Recopila también los archivos.
Equipo apagado o imagen de disco
Monta el sistema de archivos raíz en solo lectura (idealmente sin reproducir el journal de ext4) y archiva las mismas rutas:
sudo mount -o ro /dev/sdX1 /mnt/evidence # o una imagen montada en solo lectura
tar -C /mnt/evidence -czf ~/linux-logs.tar.gz --ignore-failed-read --sparse \
var/log etc/localtime etc/timezone etc/passwd etc/hostname
El journal volátil de /run/log/journal y /run/utmp solo existen en un sistema en ejecución. Si el host se apagó y journald era volátil, el journal ha desaparecido; la adquisición de memoria es la única otra vía.
Trampas habituales
- Recoge todas las rotaciones.
auth.log.1,auth.log.2.gz,secure-20260913,wtmp.1,audit.log.4: el historial más antiguo es donde suele estar el primer acceso. - Recoge los archivos
.journal~. Son journals renombrados tras una parada incorrecta o una corrupción detectada, y a menudo cubren el incidente. - Recopila los journals de usuario. journald numera las entradas en todos los archivos de una máquina, así que los archivos
user-<UID>.journalque se quedan fuera parecen entradas borradas. - Conserva las fechas de modificación. El año de las líneas syslog tradicionales se deduce de ellas.
tarlas conserva; una copia a través de algunas herramientas de compartición de archivos, no. - Anota la hora. logrotate puede ejecutarse mientras recopilas. Calcula el hash del archivo y registra cuándo se creó.
- Comprueba la arquitectura. Los registros de wtmp ocupan 384 bytes en x86_64 pero 400 bytes en aarch64; anota cuál era la del host.
Siguiente paso
Arrastra el archivo, el tarball de UAC, el ZIP de Velociraptor o la carpeta a Linux Log Parser. La guía principal explica qué aporta cada fuente, y el caso práctico muestra un análisis completo. La ficha del journal y la ficha de auth.log detallan las rutas de cada distribución.