Skip to content

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.

Publicado el 5 min de lectura

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

RutaContenidoPor qué
/var/log/auth.log*, /var/log/syslog*Logs de texto de Debian y UbuntuSSH, sudo, PAM, cron, servicios
/var/log/secure*, /var/log/messages*Logs de texto de RHEL, Rocky, Alma y FedoraLo mismo, con rotaciones fechadas (secure-20260913)
/var/log/journal/<machine-id>/*.journal, *.journal~Journal de systemd persistenteCampos de confianza, microsegundos, números de secuencia
/run/log/journal/<machine-id>/*.journalJournal volátilSe pierde al reiniciar; el único journal en algunos hosts
/var/log/audit/audit.log*auditdInicios de sesión, sesiones, programas ejecutados
/var/log/wtmp*, /var/log/btmp*, /var/log/lastlogRegistros de inicio de sesiónSesiones, inicios de sesión fallidos, último inicio de sesión por UID
/run/utmpSesiones actualesSolo en un host en vivo
/var/lib/wtmpdb/wtmp.db, /var/log/wtmp.dbwtmpdbopenSUSE, Debian 13
/var/lib/lastlog/lastlog2.dblastlog2util-linux 2.40+
/etc/localtime, /etc/timezoneZona horariaPara las líneas syslog sin desfase
/etc/passwd, /etc/hostnameCorrespondencia UID-nombre, nombre del hostAtribució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-read omite las rutas que no existen en esa distribución (no hay /etc/timezone en RHEL ni /run/log/journal en hosts con almacenamiento persistente) con una advertencia en lugar de fallar.
  • --sparse importa para lastlog: es un archivo disperso indexado por UID y puede aparentar muchos gigabytes cuando ha iniciado sesión un UID alto. --sparse guarda solo los bloques usados.
  • Se necesita root: auth.log, btmp, audit.log y 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>.journal que 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. tar las 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.

Artículos relacionados

Cómo probar que se editaron o borraron logs de Linux: huecos de seqnum, líneas ausentes de auth.log, registros wtmp a cero, daemons detenidos y borrados.
Cómo encajan las cuatro familias de logs de Linux en una investigación, qué prueba cada una, dónde discrepan y cómo unirlas en una sola línea de tiempo.
Análisis forense del journal de systemd sin journalctl: formato, campos de confianza, compresión, huecos de seqnum, archivos .journal~ y campos de hora.