EjecuciónRegistrosActividad del usuario
Logs de sudo: uso de privilegios en Linux
Cómo registra sudo quién ejecutó qué como root en Linux: líneas de syslog y del journal, archivos de log opcionales, grabaciones de E/S y archivos sudoers.
- Ubicación
- /var/log/auth.log, /var/log/secure
- Prueba
- Qué cuenta ejecutó qué comando como qué usuario de destino, desde qué terminal y directorio, y los intentos fallidos
- Marcas de tiempo
- Hora de syslog/journal del host (ver formatos de syslog); los logs de E/S guardan tiempos relativos por sesión
- Acceso
- root (o grupo adm para auth.log en Debian/Ubuntu)
- Retención
- Sigue la rotación de auth.log/secure y los límites del journal; logs de E/S hasta su borrado
- Adquisición
- UAC, Velociraptor, cp -a, journalctl
Herramientas
Comparar todas las herramientas- Linux Log ParserNavegador
- grep / zgrepCLI · incluido en Linux
- journalctlCLI · incluido en Linux
- sudoreplayCLI · incluido en Linux
- ausearchCLI · incluido en Linux
- PlasoCLI · código abierto
Qué es
El plugin de política sudoers de sudo registra cada petición aceptada y rechazada. Por defecto envía una línea por evento a syslog, con la facility authpriv cuando está disponible (prioridad notice para las permitidas, alert para las denegadas). Esas líneas acaban en el log de texto de autenticación y en el journal. Ajustes opcionales añaden un archivo de log dedicado, salida JSON, el código de salida, el registro de subcomandos y grabaciones completas de las pulsaciones y la pantalla de las sesiones.
La propia política (/etc/sudoers y sus directorios de inclusión) también es evidencia: un atacante que añade una regla NOPASSWD ha creado persistencia y ha eliminado la petición de contraseña que, de otro modo, aparecería como evento de autenticación.
Dónde se encuentra
| Elemento | Debian / Ubuntu | RHEL / Fedora | Notas |
|---|---|---|---|
| Líneas de syslog | /var/log/auth.log | /var/log/secure | Más el journal (SYSLOG_IDENTIFIER=sudo) |
| Política | /etc/sudoers, /etc/sudoers.d/* | igual | @includedir/#includedir; se omiten los archivos que contienen . o terminan en ~ |
| Archivo de log opcional | Defaults logfile=... (desactivado por defecto) | igual | Cualquier ruta, por ejemplo /var/log/sudo.log |
| Logs de sesión de E/S | /var/log/sudo-io/ | igual | Solo con log_input/log_output |
| Caché de credenciales | /run/sudo/ts/<user> | /run/sudo/ts/ o /var/run/sudo/ts/ | Se vacía en el arranque |
| Estado del aviso (lecture) | /var/lib/sudo/lectured/<user> | /var/db/sudo/lectured/ o /var/lib/sudo/lectured/ | Archivo vacío por usuario, según la compilación |
| Registros de auditoría | USER_CMD en audit.log | igual | Cuando sudo está compilado con soporte de auditoría de Linux y auditd se ejecuta |
| Marcador de primer uso | ~/.sudo_as_admin_successful (Ubuntu) | ninguno | Se crea con el primer sudo correcto |
Qué prueba
- La cuenta que invoca, el usuario de destino (
USER=), el terminal, el directorio de trabajo y la línea de comandos completa de cada comando permitido. - Las denegaciones:
user NOT in sudoers,user NOT authorized on host,command not allowed,N incorrect password attempts,a password is required. - El contexto PAM que lo rodea:
pam_unix(sudo:session): session opened for user root(uid=0) by deploy(uid=1001)ypam_unix(sudo:auth): authentication failure. - Con registro de E/S: exactamente lo que se tecleó y se mostró, reproducible.
- No muestra lo que ocurrió dentro de
sudo -i,sudo -sosudo bash: el log solo registra la shell. Para eso, use auditd (auid), el historial de la shell,log_subcmdso los logs de E/S. - Un usuario con root puede editar estos logs, y cualquiera puede inyectar líneas de aspecto similar con
logger.
Campos clave
Comando aceptado, formato de log de sudo:
Sep 20 03:15:30 web-prod-03 sudo: deploy : TTY=pts/0 ; PWD=/home/deploy ; USER=root ; COMMAND=/usr/bin/bash
Sep 20 03:16:02 web-prod-03 sudo: deploy : TTY=pts/0 ; PWD=/tmp ; USER=root ; TSID=000001 ; COMMAND=/usr/bin/tar -xf /tmp/x.tar
Sep 20 03:17:44 web-prod-03 sudo: intern : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/intern ; USER=root ; COMMAND=/usr/bin/id
| Campo | Significado |
|---|---|
usuario antes de : | Nombre de inicio de sesión del usuario que ejecutó sudo |
| motivo de la denegación | Solo presente en las peticiones rechazadas |
TTY= | Terminal, o unknown sin tty (scripts, algunos comandos remotos) |
PWD= | Directorio de trabajo cuando se ejecutó sudo |
USER= / GROUP= | Usuario de destino y grupo opcional |
CHROOT= | Directorio raíz si se solicitó uno |
TSID= | ID del log de E/S, solo presente cuando el registro de E/S está activado |
ENV= | Variables de entorno definidas en la línea de comandos |
COMMAND= | Ruta resuelta del comando y argumentos |
Los caracteres de control se registran en octal precedidos de # (#011 para el tabulador), y los espacios en la ruta del comando aparecen como #040. Con log_format=json, el archivo de log contiene objetos JSON con todos los detalles del usuario y el entorno.
Registro de auditoría de la misma acción (familia RHEL):
type=USER_CMD msg=audit(1789874130.201:8830): pid=4302 uid=1001 auid=1001 ses=12 msg='cwd="/home/deploy" cmd="/usr/bin/bash" terminal=pts/0 res=success'
cmd y cwd se codifican en hexadecimal cuando contienen espacios; ausearch -i los decodifica.
Marcas de tiempo
Las líneas de syslog heredan el formato del demonio syslog: hora local tradicional sin año con la configuración por defecto de RHEL, RFC 3339 con desfase en Debian 12+ y Ubuntu 24.04 (ver auth.log). La copia del journal tiene una marca de tiempo UTC en microsegundos y es el punto de referencia más sencillo. El archivo de log propio de sudo usa una fecha de estilo Mmm dd HH:MM:SS y solo añade el año con log_year. Los logs de E/S registran el inicio de la sesión en el archivo log/log.json y los retardos relativos en timing.
Retención
La copia de syslog dura lo mismo que auth.log/secure (unas cuatro generaciones semanales por defecto) y la copia del journal lo que permitan sus límites de tamaño. sudo nunca rota los logs de E/S; el ID de sesión de seis caracteres en base 36 (00/00/01) vuelve a empezar al llegar a maxseq, y a partir de ahí se sobrescriben las sesiones antiguas. Los archivos de aviso y ~/.sudo_as_admin_successful persisten hasta que se borran.
Adquisición
E=/mnt/evidence
tar -C "$E" -cpf /cases/2026-017/sudo.tar \
etc/sudoers etc/sudoers.d var/log/sudo-io var/lib/sudo var/db/sudo 2>/dev/null
journalctl -D "$E/var/log/journal" SYSLOG_IDENTIFIER=sudo -o json --utc > sudo-journal.json
zgrep -h 'sudo:' "$E"/var/log/auth.log* "$E"/var/log/secure* 2>/dev/null > sudo-lines.txt
UAC recoge /var/log, /etc y las marcas de tiempo de aviso de sudo (artefacto sudo_lectured). En un sistema en vivo, sudo -l -U <user> muestra los derechos efectivos de una cuenta sin modificar nada.
Análisis
# Allowed commands per invoking user
zgrep -h 'COMMAND=' auth.log* | sed -E 's/.*sudo: +([^ ]+) : .*USER=([^ ]+) ; .*COMMAND=(.*)/\1 -> \2 : \3/' | sort | uniq -c
# Failures
zgrep -hE 'sudo:.*(NOT in sudoers|not allowed|incorrect password)' auth.log*
# Replay a recorded session (read-only)
sudoreplay -d /cases/2026-017/var/log/sudo-io -l
sudoreplay -d /cases/2026-017/var/log/sudo-io 000001
# Audit copy
ausearch -if audit.log -m USER_CMD -i
Cada directorio de sesión de E/S contiene log, log.json, timing, ttyin, ttyout, stdin, stdout y stderr. Plaso recoge las líneas de sudo mediante sus parsers de syslog. 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
- Revise cada archivo de
/etc/sudoers.d/y su mtime/ctime. Las entradas nuevasNOPASSWD: ALL,Defaults !syslog,!log_allowedosyslog_goodpri=nonesilencian el registro y son indicadores sólidos. COMMAND=/usr/bin/bash,/bin/su, editores,find,less,vio intérpretes indican que la actividad real ocurrió en un proceso hijo; siga elauiden audit.log y el historial de la shell de la cuenta.- Un sudo correcto sin una petición
pam_unix(sudo:auth)previa es normal dentro detimestamp_timeout(5 minutos por defecto) o conNOPASSWD; los archivos de/run/sudo/ts/solo existen en un sistema en vivo. - El archivo de aviso se crea la primera vez que sudo muestra su aviso junto con la petición de contraseña (por defecto
lecture=once). Sus marcas de tiempo y el~/.sudo_as_admin_successfulde Ubuntu dan una fecha de primer uso de sudo por cuenta, útil para cuentas recién creadas por un atacante (ver cuentas). - Las líneas con
TTY=unknownproceden de scripts, cron o SSH no interactivo; correlacione con cron y con las líneas de sshd. - Compare las copias del log de texto, del journal y de auditoría: un evento de sudo en el journal pero no en auth.log apunta a una edición del archivo de texto.