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
Herramientas
Comparar todas las herramientas- Linux Log ParserNavegador
- last / lastbCLI · incluido en Linux
- utmpdumpCLI · incluido en Linux
- wtmpdbCLI · código abierto
- PlasoCLI · código abierto
- VelociraptorPlataforma · código abierto
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
| Archivo | Ruta | Lector | Notas |
|---|---|---|---|
| wtmp | /var/log/wtmp, /var/log/wtmp.1 | last | Historial de sesiones, reinicios, apagados |
| btmp | /var/log/btmp, /var/log/btmp.1 | lastb | Inicios de sesión fallidos, modo 0600/0660 |
| utmp | /run/utmp (/var/run/utmp) | who, w | tmpfs: solo sesiones actuales, desaparece tras el reinicio |
| lastlog | /var/log/lastlog | lastlog | Archivo disperso indexado por UID |
| wtmpdb (openSUSE, valor por defecto de upstream) | /var/lib/wtmpdb/wtmp.db | wtmpdb last | SQLite, a salvo del problema de 2038 |
| wtmpdb (Debian 13) | /var/log/wtmp.db | wtmpdb last | Debian mantiene un enlace en /var/lib/wtmpdb/wtmp.db |
| lastlog2 | /var/lib/lastlog/lastlog2.db | lastlog2 | SQLite, 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
rebootyshutdownen el terminal~), incluidos los finales abruptos en los que una sesión no tiene cierre (crashogone - no logoutenlast). - 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):
| Campo | Significado |
|---|---|
ut_type | 1 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_pid | PID del proceso de inicio de sesión |
ut_line | Terminal (pts/0), máximo 32 bytes |
ut_id | Sufijo del terminal o ID de inittab |
ut_user | Nombre de usuario, máximo 32 bytes; vacío en los registros de cierre de sesión de wtmp |
ut_host | Host remoto, o versión del kernel en los registros de arranque, máximo 256 bytes |
ut_session | ID de sesión |
ut_tv | tv_sec y tv_usec, ambos de 32 bits en plataformas biarch |
ut_addr_v6 | IP 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
lastcoincida con la estructura de registro (glibc de 64 bits). Debian 13 ya no incluyelast; 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 -rconvierte 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 losUSER_LOGINde 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
lastlogmá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_hosten los registrosrebootcon 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).