Ir al contenido

Actividad del usuarioRegistrosRed

wtmp, btmp, utmp y lastlog: registros de login en Linux

Registros binarios de login en Linux: historial wtmp, logins fallidos en btmp, sesiones activas en utmp, lastlog por UID y sus sucesores wtmpdb/lastlog2.

Ubicación
/var/log/wtmp
Prueba
Quién inició sesión, en qué terminal, desde qué host, cuándo terminó la sesión y cuándo se reinició el sistema
Marcas de tiempo
Registros utmp: segundos de época Unix + microsegundos (campos de 32 bits), UTC. wtmpdb: microsegundos desde la época
Acceso
Legibles por todos para wtmp/utmp/lastlog; root (o grupo utmp) para btmp
Retención
logrotate: mensual, 1 generación antigua para wtmp y btmp; lastlog hasta que se sobrescribe
Adquisición
UAC, Velociraptor, cp -a

Qué es

Linux lleva la contabilidad de los inicios de sesión en una familia de archivos binarios que comparten una misma estructura de registro, struct utmp (ver wtmp y btmp). wtmp es un historial de solo anexado de inicios y cierres de sesión, arranques y apagados; btmp registra los inicios de sesión fallidos; utmp contiene solo las sesiones abiertas en este momento. lastlog tiene otro formato: una ranura de tamaño fijo por UID con el inicio de sesión más reciente de esa cuenta.

Estos archivos los escriben login, sshd, los gestores de pantalla y los módulos PAM, con independencia de syslog. Esa independencia es su valor forense: a menudo sobreviven cuando se editan los logs de texto, y los contradicen cuando solo se manipuló una de las fuentes.

Como el registro clásico usa campos de tiempo de 32 bits, las distribuciones recientes los sustituyen por bases de datos SQLite: wtmpdb para wtmp y lastlog2 (parte de util-linux desde la 2.40) para lastlog.

Dónde se encuentra

ArchivoRutaLectorNotas
wtmp/var/log/wtmp, /var/log/wtmp.1lastHistorial de sesiones, reinicios, apagados
btmp/var/log/btmp, /var/log/btmp.1lastbInicios de sesión fallidos, modo 0600/0660
utmp/run/utmp (/var/run/utmp)who, wtmpfs: solo sesiones actuales, desaparece tras el reinicio
lastlog/var/log/lastloglastlogArchivo disperso indexado por UID
wtmpdb (openSUSE, valor por defecto de upstream)/var/lib/wtmpdb/wtmp.dbwtmpdb lastSQLite, a salvo del problema de 2038
wtmpdb (Debian 13)/var/log/wtmp.dbwtmpdb lastDebian mantiene un enlace en /var/lib/wtmpdb/wtmp.db
lastlog2/var/lib/lastlog/lastlog2.dblastlog2SQLite, a salvo del problema de 2038

Notas por distribución: openSUSE Tumbleweed y MicroOS abandonaron /run/utmp, /var/log/wtmp y /var/log/lastlog en favor de systemd-logind, wtmpdb y lastlog2. Debian 13 (trixie) eliminó last, lastb y lastlog; sus sustitutos wtmpdb y lastlog2 (con sus módulos PAM) deben instalarse por separado tras la actualización (lslogins sigue incluido en util-linux), así que un host trixie puede no tener ninguna base de datos de inicios de sesión. RHEL/Fedora y las versiones LTS de Ubuntu siguen usando habitualmente los archivos clásicos; compruebe qué existe en la imagen.

Qué prueba

  • Inicios de sesión interactivos con usuario, terminal (pts/N, tty1, :0), host o IP remotos, hora de inicio y de fin.
  • Reinicios y apagados (pseudousuarios reboot y shutdown en el terminal ~), incluidos los finales abruptos en los que una sesión no tiene cierre (crash o gone - no logout en last).
  • Inicios de sesión fallidos con el nombre de usuario intentado, que puede incluir contraseñas tecleadas por error en el campo de usuario. Trate btmp como información sensible.
  • El último inicio de sesión de cada cuenta según lastlog, incluso cuando wtmp ya se ha rotado.
  • No muestra la actividad no interactiva: ssh host command, scp/sftp y muchos inicios de sesión automatizados no asignan tty y a menudo no aparecen. Para ellos, use auth.log/secure y el journal.

Campos clave

struct utmp (384 bytes por registro en los sistemas glibc de 64 bits habituales):

CampoSignificado
ut_type1 RUN_LVL, 2 BOOT_TIME, 5 INIT_PROCESS, 6 LOGIN_PROCESS, 7 USER_PROCESS (inicio de sesión), 8 DEAD_PROCESS (cierre de sesión)
ut_pidPID del proceso de inicio de sesión
ut_lineTerminal (pts/0), máximo 32 bytes
ut_idSufijo del terminal o ID de inittab
ut_userNombre de usuario, máximo 32 bytes; vacío en los registros de cierre de sesión de wtmp
ut_hostHost remoto, o versión del kernel en los registros de arranque, máximo 256 bytes
ut_sessionID de sesión
ut_tvtv_sec y tv_usec, ambos de 32 bits en plataformas biarch
ut_addr_v6IP remota (IPv4 en la primera palabra)

struct lastlog: ll_time (época de 32 bits), ll_line (32 bytes), ll_host (256 bytes), 292 bytes por ranura en el desplazamiento UID x 292. wtmpdb guarda por fila Type, User, Login, Logout, TTY, RemoteHost y Service (el servicio PAM).

Marcas de tiempo

Los registros clásicos guardan segundos de época Unix más microsegundos, en UTC. last muestra las horas en la zona local del equipo de análisis, así que fije TZ=UTC. Los campos de 32 bits se desbordan en enero de 2038. wtmpdb guarda Login y Logout como microsegundos desde la época.

TZ=UTC last -F -i -x -f /mnt/evidence/var/log/wtmp
sqlite3 wtmp.db "SELECT User, TTY, RemoteHost, Service,
  datetime(Login/1000000,'unixepoch'), datetime(Logout/1000000,'unixepoch') FROM wtmp;"

Retención

Las secciones estándar de logrotate rotan wtmp y btmp mensualmente y conservan una generación antigua (wtmp.1, btmp.1), así que cuente con uno o dos meses de historial. Estas secciones están en /etc/logrotate.conf o en /etc/logrotate.d/wtmp y btmp, según la distribución. utmp se vacía en cada arranque. lastlog conserva indefinidamente un registro por UID, sobrescrito en cada inicio de sesión. wtmpdb rotate mueve las entradas antiguas a archivos fechados wtmp_<date>.db junto a la base de datos (/var/lib/wtmpdb/ en upstream, /var/log/ en Debian).

Adquisición

Copie los archivos con sus metadatos. El tamaño importa: un wtmp que no es múltiplo del tamaño de registro, o mucho más pequeño de lo esperado, es un hallazgo.

cp -a /mnt/evidence/var/log/{wtmp,wtmp.1,btmp,btmp.1,lastlog} /cases/2026-017/ 2>/dev/null
cp -a /mnt/evidence/var/lib/wtmpdb /mnt/evidence/var/lib/lastlog /cases/2026-017/ 2>/dev/null
cp -a /mnt/evidence/var/log/wtmp.db /cases/2026-017/ 2>/dev/null
# Live only: current sessions
cp -a /run/utmp /media/ir/ && who -a > /media/ir/who.txt

UAC recoge /var/log y /var/run/utmp y ejecuta last, lastb, lastlog y utmpdump en respuesta en vivo. El artefacto Linux.Sys.LastUserLogin de Velociraptor analiza los archivos wtmp* en el endpoint.

Análisis

last -F -i -x -f wtmp            # full dates, IPs, system events
lastb -F -i -f btmp              # failed logins
utmpdump wtmp > wtmp.txt         # every record and field, text
wtmpdb last -F -f wtmp.db        # wtmpdb databases
lastlog2 -d lastlog2.db          # lastlog2 databases

El comando clásico lastlog lee el archivo del sistema en vivo, así que para una copia de la imagen lea las ranuras de 292 bytes con un pequeño script (número de ranura = UID, omita las ranuras llenas de ceros). El parser utmp de Plaso maneja wtmp, btmp y utmp para las super timelines. Linux Log Parser lee en el navegador auth.log / secure, syslog, los archivos del journal, audit.log y wtmp / btmp / lastlog, y los combina en una sola cronología con las sesiones de inicio reconstruidas; no se sube nada.

Consejos para la investigación

  • Trabaje en un equipo de análisis cuyo last coincida con la estructura de registro (glibc de 64 bits). Debian 13 ya no incluye last; use una compilación de util-linux de otra distribución, o Plaso.
  • En la salida de utmpdump, busque registros puestos a cero, marcas de tiempo que retroceden e inicios de sesión sin cierre. utmpdump -r convierte de nuevo a binario un texto editado, así que la manipulación es sencilla para root: demuéstrela por las discrepancias con auth.log, el journal y los USER_LOGIN de audit.log.
  • Una ráfaga de entradas btmp desde una IP seguida de un inicio de sesión en wtmp desde la misma IP es el patrón clásico de fuerza bruta con éxito.
  • Una hora de lastlog más reciente que el último registro wtmp correspondiente significa que wtmp perdió entradas (rotación o borrado).
  • Compare la versión del kernel de ut_host en los registros reboot con los kernels instalados para detectar arranques con un kernel inesperado.
  • Un wtmp o btmp de cero bytes con un mtime antiguo en un servidor activo es una señal antiforense habitual (> /var/log/wtmp).

Ver también