Saltar al contenido
sudoquest@root
Blue Team

Leer los registros

Quién intenta entrar en un servidor y quién lo consigue. auth.log, journalctl, last y lastb; contar con grep y uniq; cerrar con ufw y passwd -l.

25 min de lectura

Son las tres menos veinte de la madrugada y estás de guardia en el SOC, el centro de operaciones de seguridad que vigila los servidores de sus clientes. En la pared de pantallas salta un aviso: el servidor de la Gestoría Prado lleva horas recibiendo intentos de entrar por SSH desde fuera. Entras en él por la VPN del SOC para ver qué pasa.

Todo servidor apunta quién intenta entrar, quién lo consigue y quién está dentro ahora. Saber leerlo es lo primero que se aprende en un equipo que defiende (un Blue Team): antes de tocar nada, se mira. En este tema aprendes dónde están esos registros, a contar lo que dicen y a cerrar la puerta a tiempo, sin cerrártela a ti.

Dónde se apunta: auth.log y el diario

En Ubuntu, cada vez que alguien entra (o lo intenta) por SSH, sshd lo cuenta al diario de systemd. De ahí, rsyslog copia lo que tiene que ver con entrar (sshd, sudo, cron) a /var/log/auth.log, un archivo de texto de toda la vida. Es del grupo adm: lo leen root y quien esté en ese grupo.

tecnico@srv-gestoria:~$ sudo tail -n 6 /var/log/auth.log
Oct  7 00:37:06 srv-gestoria sshd[3715]: Invalid user oracle from 203.0.113.41 port 49907
Oct  7 00:37:06 srv-gestoria sshd[3715]: Failed password for invalid user oracle from 203.0.113.41 port 49907 ssh2
Oct  7 00:37:40 srv-gestoria sshd[3722]: Invalid user user from 198.51.100.5 port 39726
Oct  7 00:37:40 srv-gestoria sshd[3722]: Failed password for invalid user user from 198.51.100.5 port 39726 ssh2
Oct  7 00:38:13 srv-gestoria sshd[3726]: Invalid user guest from 203.0.113.196 port 57569
Oct  7 00:38:13 srv-gestoria sshd[3726]: Failed password for invalid user guest from 203.0.113.196 port 57569 ssh2

Cada línea dice cuándo, en qué máquina, qué programa (con su PID entre corchetes) y el mensaje. Las que más importan:

  • Invalid user oracle from …: alguien probó con un usuario que no existe en la máquina.
  • Failed password for … from …: una contraseña mal. Si dice invalid user, ni siquiera existía el usuario; si no lo dice, el usuario sí existe, y eso preocupa más.
  • Accepted password o Accepted publickey for … from …: alguien entró. Con contraseña o con su clave.
  • session opened y session closed: el principio y el final de una sesión.

El diario cuenta lo mismo. Su unidad, en Ubuntu, se llama ssh (no sshd): journalctl -u ssh. Sirve para filtrar por fechas (--since "2 hours ago") y por prioridad, cosa que el archivo de texto no hace.

tecnico@srv-gestoria:~$ sudo journalctl -u ssh --no-pager | tail -n 2
Oct 07 00:38:13 srv-gestoria sshd[3726]: Invalid user guest from 203.0.113.196 port 57569
Oct 07 00:38:13 srv-gestoria sshd[3726]: Failed password for invalid user guest from 203.0.113.196 port 57569 ssh2

Ejercicio

Dónde queda quién intenta entrar: auth.log y el diario

Desde el SOC, entras en srv-gestoria por la VPN. Antes de nada, mira dónde apunta el servidor cada intento de entrar por SSH.

Preparando la máquina…

Contar: grep, sort y uniq

Cientos de líneas no se leen una a una: se cuentan. grep -c dice cuántas líneas casan:

tecnico@srv-gestoria:~$ sudo grep -c "Failed password" /var/log/auth.log
127

Para saber desde dónde, se saca la IP de cada línea con grep -o (solo el trozo que casa), se ordena con sort y uniq -c cuenta cuántas veces sale cada una. Un sort -rn final las deja de más a menos:

tecnico@srv-gestoria:~$ sudo grep "Failed password" /var/log/auth.log | grep -o "from [0-9.]*" | sort | uniq -c | sort -rn
     58 from 198.51.100.5
   24 from 203.0.113.41
   23 from 203.0.113.61
   12 from 198.51.100.7
   10 from 203.0.113.196

Una IP con 58 intentos en tres horas no es casualidad: insiste. Las demás, también de fuera, son el ruido de siempre. uniq solo junta líneas iguales seguidas: por eso va siempre después de un sort.

Ejercicio

Contar los intentos: grep, sort y uniq

Hay cientos de líneas. Cuenta cuántos intentos fallaron y descubre desde qué IP llegaron más.

Preparando la máquina…

Quién entró, quién falló, quién sigue: last, lastb y who

Además del texto, Linux guarda las sesiones en tres archivos binarios, que se leen con su orden:

  • /var/log/wtmp, cada entrada y cada salida: last.
  • /var/log/btmp, cada intento fallido: lastb. Solo lo lee root, porque a veces alguien escribe su contraseña en el campo del usuario.
  • /run/utmp, quién está dentro ahora: who.
tecnico@srv-gestoria:~$ last -n 4
tecnico  pts/1        10.99.0.5        Wed Oct  7 02:40   still logged in
tecnico  pts/1        10.20.4.113      Wed Oct  7 00:34 - 00:39  (00:05)
tecnico  pts/1        10.20.1.113      Wed Oct  7 00:23 - 00:28  (00:05)
tecnico  pts/2        10.20.4.48       Wed Oct  7 00:23 - 00:31  (00:08)

wtmp begins Thu Oct  1 02:40:00 2026

La primera eres tú, desde la VPN del SOC (still logged in: sigues dentro). Las demás son del técnico de la gestoría: cuándo entró, cuándo salió y cuánto estuvo. Si una sesión no tiene salida y ya no está, last dice gone - no logout.

tecnico@srv-gestoria:~$ sudo lastb -n 4
guest    ssh:notty    203.0.113.196    Wed Oct  7 00:38 - 00:38  (00:00)
user     ssh:notty    198.51.100.5     Wed Oct  7 00:37 - 00:37  (00:00)
oracle   ssh:notty    203.0.113.41     Wed Oct  7 00:37 - 00:37  (00:00)
guest    ssh:notty    198.51.100.5     Wed Oct  7 00:36 - 00:36  (00:00)

btmp begins Tue Oct  6 23:40:31 2026

Ejercicio

Quién entró, quién falló y quién sigue: last, lastb y who

Los registros de sesiones dicen lo mismo de otra forma: quién entró y cuánto estuvo, quién falló y quién está dentro ahora.

Preparando la máquina…

Cerrar la puerta a una IP: ufw

Con la IP que insiste localizada, se le cierra el paso en el cortafuegos. Antes, mira cómo está con los números de cada regla:

tecnico@srv-gestoria:~$ sudo ufw status numbered
Status: active

   To                         Action      From
   --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 443/tcp                    ALLOW IN    Anywhere
[ 3] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 4] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Lo primero que se le ocurre a cualquiera es sudo ufw deny from 198.51.100.5. Y ufw contesta Rule added… pero la regla se añade al final:

tecnico@srv-gestoria:~$ sudo ufw status numbered
Status: active

   To                         Action      From
   --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 443/tcp                    ALLOW IN    Anywhere
[ 3] Anywhere                   DENY IN     198.51.100.5
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 5] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Se borra la que no sirve (con su número) y se pone en su sitio:

tecnico@srv-gestoria:~$ sudo ufw --force delete 3
Rule deleted
tecnico@srv-gestoria:~$ sudo ufw insert 1 deny from 198.51.100.5
Rule inserted
tecnico@srv-gestoria:~$ sudo ufw status numbered
Status: active

   To                         Action      From
   --                         ------      ----
[ 1] Anywhere                   DENY IN     198.51.100.5
[ 2] OpenSSH                    ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 5] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Bloquear una IP es un parche: quien insiste puede cambiar de dirección. Lo que de verdad cierra la puerta está en las cuentas.

Ejercicio

Cerrar la puerta a una IP: ufw, y el orden de las reglas

Bloquea la IP que más insiste, sin cerrarte la puerta a ti mismo (entras desde el SOC por SSH).

Preparando la máquina…

La cuenta que sobra: passwd -l

Muchos incidentes empiezan por una cuenta que nadie vigila: la de un escáner que ya no existe, la de unas prácticas que acabaron, la de pruebas. Si sigue con contraseña (y es floja), es una puerta abierta. Bloquearla deja la cuenta como está (sus archivos, su historia) pero impide entrar con contraseña:

tecnico@srv-gestoria:~$ sudo passwd -S escaner
escaner P 04/21/2023 0 99999 7 -1
tecnico@srv-gestoria:~$ sudo passwd -l escaner
passwd: password expiry information changed.
tecnico@srv-gestoria:~$ sudo passwd -S escaner
escaner L 04/21/2023 0 99999 7 -1

La segunda columna es el estado: P tiene contraseña, L bloqueada (locked), NP sin contraseña. Por dentro, passwd -l pone un ! delante de la contraseña en /etc/shadow, así que ninguna coincide. usermod -L hace lo mismo; passwd -u la desbloquea.

Si lo que hace falta no es cerrar la cuenta, sino que su dueño cambie la contraseña (porque alguien ha podido verla), sudo passwd -e luis la deja caducada: la de siempre vale para entrar una vez, y en ese momento el sistema le pide una nueva.

Ejercicio

La cuenta que sobra: passwd -l

La cuenta escaner era la del escáner de la oficina, que ya no existe, y sigue con su contraseña de siempre. Bloquéala sin tocar las de las personas.

Preparando la máquina…

En la sala: el turno de noche

En la sala del tema estás en el SOC, y los intentos siguen llegando mientras miras. Es la primera sala con reloj: cada orden que escribes gasta minutos de juego (leer un registro, uno; reiniciar un servicio, dos; instalar algo, diez), y puedes esperar a propósito para ver qué pasa. Mientras investigas, fijas en el tablero lo que encuentres (una IP, una cuenta, una línea del registro). Al final escribes el informe y te llevas una nota en estrellas: cuánto tardaste en verlo, cuánto en cerrar la puerta y si la gestoría siguió funcionando.