Saltar al contenido
sudoquest@root
Blue Team

Volver a la normalidad

Dejar un servidor como antes del incidente: qué no casa con su lista de sumas, qué copia está limpia, restaurar, parchear y cambiar contraseñas.

40 min de lectura

Son las cinco y media de la madrugada en el SOC. Ayer saltó una alerta en Radio Onda Norte: srv-emisora, su servidor, tenía la instalación cambiada. Se cortó el acceso de fuera y ya no hay nadie dentro: el incidente está contenido. Lo que queda es lo que hoy toca: dejar el servidor como estaba antes de que la emisora salga al aire, a las siete, con su programa de la mañana.

Contener no es arreglar. Mientras lo de dentro siga cambiado, el servidor no es de fiar: puede volver a hacer lo que no debe, y la próxima comprobación saltará otra vez. Volver a la normalidad es saber qué cambió, sacar lo de antes de una copia que esté limpia (sin perder lo bueno que ha pasado desde entonces), cerrar lo que dejó entrar y cambiar lo que pudo verse: contraseñas y claves. La nota del SOC de ayer lo resume:

tecnico@srv-emisora:~$ cat ~/nota-de-ayer.txt
Nota del SOC, de ayer (21/10 a las 09:40)

Saltó la comprobación de integridad de srv-emisora: la instalación no casa con su
lista de sumas. Se cortó el acceso de fuera; no hay nadie dentro.

Pendiente, antes de que la emisora salga al aire a las 07:00:
- dejar la instalación como antes, de una copia limpia (sin perder los programas);
- subir lo pendiente de apt (libssl3 y openssl);
- contraseñas nuevas para locutor y produccion;
- quitar las claves que no sean de nadie de la ficha;
- el informe.

Y la ficha dice qué es cada cosa:

tecnico@srv-emisora:~$ cat ~/ficha-emisora.txt
Radio Onda Norte · srv-emisora (192.168.60.10)
Ficha del SOC

La emisión: onda-emision.service (el programa, /opt/onda/emitir, con la cuenta onda).
En el aire cada día a las 07:00, con el programa de la mañana.
La instalación: /opt/onda y su web, /var/www/onda.
Su lista de sumas, la de cuando se instaló: /var/backups/onda/SHA256SUMS.
Los programas: /srv/onda/programas (el de cada mañana se sube la noche antes).
Las copias: cada noche a las 03:00, en /var/backups/onda (la instalación y los programas).

Las cuentas:
tecnico     el SOC (por la VPN)
locutor     el estudio; su clave: locutor@estudio
produccion  la mesa de producción; su clave: produccion@mesa

La lista de sumas

Cuando se instaló la emisora se hizo una lista de sumas: una línea por archivo, con su SHA-256 y su ruta. La suma cambia en cuanto cambia un solo byte del archivo, y no hay forma práctica de cambiar un archivo y que su suma siga siendo la misma.

tecnico@srv-emisora:~$ cat /var/backups/onda/SHA256SUMS
fe1a41acfe747a5ac11ee2b5376899b7d4a923957bfa93019391e31356caa9f6  opt/onda/emitir
d09665abe15a13965553b651fe4d8136c665419cd899e6829efb2ed9a9e8e89f  opt/onda/onda.conf
82af8fa0cf6774be6da6324f2b988031a42709c47ff4c7240e7ca8d3fd46528d  opt/onda/parrilla.txt
f1d0e7723906b4ac645cf3b4ce3b997a2ef1d1e127df9ea51b0472668700ac5c  var/www/onda/index.html
f510c5d90311604c34567b884ef1abbba740460ce28af72e0fafcbba3ef0ead9  var/www/onda/programas.html

sha256sum saca la suma de un archivo:

tecnico@srv-emisora:~$ sha256sum /opt/onda/onda.conf
d09665abe15a13965553b651fe4d8136c665419cd899e6829efb2ed9a9e8e89f  /opt/onda/onda.conf

Y con -c comprueba una lista entera: lee cada línea, saca la suma del archivo y dice OK o FAILED. Las rutas de esta lista van sin la / del principio, así que se comprueba desde /:

tecnico@srv-emisora:~$ cd / && sha256sum -c /var/backups/onda/SHA256SUMS
opt/onda/emitir: OK
opt/onda/onda.conf: OK
opt/onda/parrilla.txt: OK
var/www/onda/index.html: OK
var/www/onda/programas.html: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
tecnico@srv-emisora:/$ cd /tmp && sha256sum -c --quiet /var/backups/onda/SHA256SUMS
sha256sum: opt/onda/emitir: No such file or directory
opt/onda/emitir: FAILED open or read
sha256sum: opt/onda/onda.conf: No such file or directory
opt/onda/onda.conf: FAILED open or read
sha256sum: opt/onda/parrilla.txt: No such file or directory
opt/onda/parrilla.txt: FAILED open or read
sha256sum: var/www/onda/index.html: No such file or directory
var/www/onda/index.html: FAILED open or read
sha256sum: var/www/onda/programas.html: No such file or directory
var/www/onda/programas.html: FAILED open or read
sha256sum: WARNING: 5 listed files could not be read
tecnico@srv-emisora:/tmp$ cd

La lista solo ve lo que tiene apuntado: un archivo de más no sale. Para eso, lo que ha cambiado desde una fecha: find -newer (más nuevo que otro archivo, aquí la primera copia) o -newermt (más nuevo que una fecha).

tecnico@srv-emisora:~$ find /opt/onda /var/www/onda -newer /var/backups/onda/onda-2026-10-19.tar.gz
/opt/onda
/opt/onda/plantillas
/opt/onda/plantillas/aviso.sh
/var/www/onda
/var/www/onda/programas.html

Ejercicio

Qué no casa: sha256sum -c contra la lista

En srv-emisora, comprueba la instalación contra su lista de sumas (/var/backups/onda/SHA256SUMS, con las rutas desde /) y busca lo que hay de más, que la lista no ve.

Preparando la máquina…

Qué copia está limpia

Hay una copia por noche, a las tres:

tecnico@srv-emisora:~$ ls -l /var/backups/onda
total 14716
-rw-r--r-- 1 root root     439 Sep 20 11:00 SHA256SUMS
-rw-r--r-- 1 root root 2704943 Oct 19 03:00 onda-2026-10-19.tar.gz
-rw-r--r-- 1 root root 3417394 Oct 20 03:00 onda-2026-10-20.tar.gz
-rw-r--r-- 1 root root 4155337 Oct 21 03:00 onda-2026-10-21.tar.gz
-rw-r--r-- 1 root root 4779724 Oct 22 03:00 onda-2026-10-22.tar.gz

tar -tvzf enseña lo que lleva una copia, con la fecha de cada archivo. La de esta madrugada ya lleva el archivo de más:

tecnico@srv-emisora:~$ tar -tvzf /var/backups/onda/onda-2026-10-22.tar.gz opt/onda
drwxr-xr-x root/root         0 2026-10-19 22:15 opt/onda/
-rwxr-xr-x root/root        90 2026-09-20 11:00 opt/onda/emitir
-rw-r--r-- root/root       129 2026-09-20 11:00 opt/onda/onda.conf
-rw-r--r-- root/root        58 2026-09-20 11:00 opt/onda/parrilla.txt
drwxr-xr-x root/root         0 2026-10-19 22:15 opt/onda/plantillas/
-rwxr-xr-x root/root        45 2026-10-19 22:15 opt/onda/plantillas/aviso.sh

La forma segura de saber si una copia está limpia es la misma lista: se saca la copia a una carpeta aparte (nunca encima de /) y se comprueba allí.

tecnico@srv-emisora:~$ mkdir -p /tmp/c22 && tar -xzf /var/backups/onda/onda-2026-10-22.tar.gz -C /tmp/c22
tecnico@srv-emisora:~$ cd /tmp/c22 && sha256sum -c /var/backups/onda/SHA256SUMS
opt/onda/emitir: OK
opt/onda/onda.conf: OK
opt/onda/parrilla.txt: OK
var/www/onda/index.html: OK
var/www/onda/programas.html: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
tecnico@srv-emisora:/tmp/c22$ mkdir -p /tmp/c19 && tar -xzf /var/backups/onda/onda-2026-10-19.tar.gz -C /tmp/c19
tecnico@srv-emisora:/tmp/c22$ cd /tmp/c19 && sha256sum -c /var/backups/onda/SHA256SUMS
opt/onda/emitir: OK
opt/onda/onda.conf: OK
opt/onda/parrilla.txt: OK
var/www/onda/index.html: OK
var/www/onda/programas.html: OK

Esa sí casa entera. Y diff -rq dice, carpeta contra carpeta, lo que hay distinto o solo en una:

tecnico@srv-emisora:/tmp/c19$ cd
tecnico@srv-emisora:~$ diff -rq /tmp/c19/opt/onda /opt/onda
Only in /opt/onda: plantillas

Ejercicio

Qué copia está limpia: tar -t, tar -x en otra carpeta y sha256sum -c

Hay una copia por noche en /var/backups/onda. Mira qué lleva cada una y encuentra la última que casa entera con la lista, sacándola a una carpeta aparte (nunca encima de /).

Preparando la máquina…

Dejarla como antes

tar -d (o --diff) compara una copia con lo que hay ahora: la hora, el tamaño y el contenido de cada archivo de la copia.

tecnico@srv-emisora:~$ sudo tar -dzf /var/backups/onda/onda-2026-10-19.tar.gz -C / opt/onda var/www/onda
var/www/onda/programas.html: Mod time differs
var/www/onda/programas.html: Size differs

Se saca solo lo de la instalación (opt/onda y var/www/onda): los programas de la emisora están en la misma copia, pero los de después de esa noche no, y sacar la copia entera encima no los quita… salvo que alguien borre antes la carpeta para «dejarlo limpio». Las copias de cada noche se hacen al revés, con -c (crear): cd / && sudo tar -czf <archivo> opt/onda var/www/onda guarda lo que haya en ese momento, así que una copia de referencia se hace cuando la lista ya da todo OK.

tecnico@srv-emisora:~$ sudo mv /opt/onda /root/onda-incidente
tecnico@srv-emisora:~$ sudo tar -xzvf /var/backups/onda/onda-2026-10-19.tar.gz -C / opt/onda var/www/onda
opt/onda/
opt/onda/emitir
opt/onda/onda.conf
opt/onda/parrilla.txt
var/www/onda/
var/www/onda/index.html
var/www/onda/programas.html
tecnico@srv-emisora:~$ cd / && sha256sum -c /var/backups/onda/SHA256SUMS
opt/onda/emitir: OK
opt/onda/onda.conf: OK
opt/onda/parrilla.txt: OK
var/www/onda/index.html: OK
var/www/onda/programas.html: OK
tecnico@srv-emisora:/$ ls /srv/onda/programas
2026-10-16-manana.mp3  2026-10-19-manana.mp3  2026-10-22-manana.mp3
2026-10-17-manana.mp3  2026-10-20-manana.mp3
2026-10-18-manana.mp3  2026-10-21-manana.mp3

La emisión sigue con el programa de antes cargado: se arranca de nuevo con lo restaurado.

tecnico@srv-emisora:/$ sudo systemctl restart onda-emision
tecnico@srv-emisora:/$ systemctl status onda-emision --no-pager -n 0
● onda-emision.service - Radio Onda Norte: la emision
   Loaded: loaded (/etc/systemd/system/onda-emision.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2026-10-22 05:30:22 UTC; 1s ago
 Main PID: 403 (emitir)
    Tasks: 2 (limit: 4556)
   Memory: 4.8M
      CPU: 1us
   CGroup: /system.slice/onda-emision.service
           ├─403 /bin/bash /opt/onda/emitir
           └─404 sleep 60
tecnico@srv-emisora:~$ sudo mv /opt/onda /root/onda-incidente
tecnico@srv-emisora:~$ sudo systemctl restart onda-emision
tecnico@srv-emisora:~$ systemctl status onda-emision --no-pager -n 3
× onda-emision.service - Radio Onda Norte: la emision
   Loaded: loaded (/etc/systemd/system/onda-emision.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2026-10-22 05:30:02 UTC; 1s ago
  Process: 407 ExecStart=/opt/onda/emitir (code=exited, status=203/EXEC)
 Main PID: 407 (code=exited, status=203/EXEC)
      CPU: 1ms

Oct 22 05:30:02 srv-emisora systemd[1]: onda-emision.service: Start request…kly.
Oct 22 05:30:02 srv-emisora systemd[1]: onda-emision.service: Failed with r…de'.
Oct 22 05:30:02 srv-emisora systemd[1]: Failed to start Radio Onda Norte: l…ion.
Hint: Some lines were ellipsized, use -l to show in full.

Ejercicio

Dejarla como antes: apartar, tar -x de lo de la instalación y systemctl

Deja la instalación (/opt/onda y /var/www/onda) como en la copia limpia, sin perder los programas subidos desde entonces, y con la emisión en marcha con lo restaurado. Lo de ahora, apártalo (no lo borres): es lo que mirará quien investigue.

Preparando la máquina…

Cerrar lo que quedó abierto

Restaurar deja los archivos como antes, pero no arregla por dónde pudo cambiar nada. La nota de ayer dice que hay paquetes pendientes:

tecnico@srv-emisora:/$ apt list --upgradable
Listing... Done
libssl3/jammy-updates,jammy-security 3.0.2-0ubuntu1.30 amd64 [upgradable from: 3.0.2-0ubuntu1.29]
openssl/jammy-updates,jammy-security 3.0.2-0ubuntu1.30 amd64 [upgradable from: 3.0.2-0ubuntu1.29]

apt install --only-upgrade sube esos paquetes y nada más (si alguno no está instalado, no lo instala):

tecnico@srv-emisora:/$ sudo apt install --only-upgrade -y libssl3 openssl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be upgraded:
libssl3 openssl
2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 3093 kB of archives.
After this operation, 4096 B of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libssl3 amd64 3.0.2-0ubuntu1.30 [1907 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 openssl amd64 3.0.2-0ubuntu1.30 [1186 kB]
Fetched 3093 kB in 1s (2474 kB/s)
(Reading database ... 71634 files and directories currently installed.)
Preparing to unpack .../libssl3_3.0.2-0ubuntu1.30_amd64.deb ...
Unpacking libssl3:amd64 (3.0.2-0ubuntu1.30) over (3.0.2-0ubuntu1.29) ...
Preparing to unpack .../openssl_3.0.2-0ubuntu1.30_amd64.deb ...
Unpacking openssl (3.0.2-0ubuntu1.30) over (3.0.2-0ubuntu1.29) ...
Setting up libssl3:amd64 (3.0.2-0ubuntu1.30) ...
Setting up openssl (3.0.2-0ubuntu1.30) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
Scanning processes...
Scanning linux images...

Running kernel seems to be up-to-date.

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.

Ejercicio

Lo pendiente de apt: apt list --upgradable y --only-upgrade

La nota de ayer dice que hay paquetes por subir. Mira cuáles y súbelos sin instalar nada nuevo.

Preparando la máquina…

Contraseñas y claves

Lo que se pudo ver desde dentro hay que darlo por visto. Las claves de cada cuenta, con su huella y su comentario:

tecnico@srv-emisora:/$ sudo ssh-keygen -lf /home/locutor/.ssh/authorized_keys
256 SHA256:FGKYGmgevoWP4aZsgtFsrrAyvhVIcMBv/LFw5TCvwzc locutor@estudio (ED25519)
256 SHA256:TmPMFGhXlcMnexWKVVo7fKPLUFumTom2UZGyx5h5//E admin@equipo-2 (ED25519)

La del locutor está en la ficha; la otra no es de nadie. Se quita esa línea (solo esa: si se va la de la ficha, o se bloquea la cuenta, quien tiene que entrar se queda fuera; cat su-clave.pub | sudo tee -a <su authorized_keys> la vuelve a poner y sudo usermod -U <cuenta> la desbloquea) y se comprueba:

tecnico@srv-emisora:/$ sudo sed -i '/admin@equipo-2$/d' /home/locutor/.ssh/authorized_keys
tecnico@srv-emisora:/$ sudo ssh-keygen -lf /home/locutor/.ssh/authorized_keys
256 SHA256:FGKYGmgevoWP4aZsgtFsrrAyvhVIcMBv/LFw5TCvwzc locutor@estudio (ED25519)

Y contraseñas nuevas: chpasswd las lee de la entrada, usuario:contraseña por línea.

tecnico@srv-emisora:/$ printf 'locutor:Onda-Norte-2210\nproduccion:Mesa-Norte-2210\n' | sudo chpasswd
tecnico@srv-emisora:/$ sudo passwd -S locutor
locutor P 10/22/2026 0 99999 7 -1

Si la contraseña nueva la tiene que poner la persona, chage -d 0 hace que la cambie al entrar:

tecnico@srv-emisora:/$ sudo chage -d 0 produccion
tecnico@srv-emisora:/$ sudo chage -l produccion
Last password change					: password must be changed
Password expires					: password must be changed
Password inactive					: password must be changed
Account expires						: never
Minimum number of days between password change		: 0
Maximum number of days between password change		: 99999
Number of days of warning before password expires	: 7

Ejercicio

Las cuentas: claves de más (ssh-keygen -lf) y contraseñas nuevas (chpasswd)

La ficha (~/ficha-emisora.txt) dice de quién es cada clave. Quita de las authorized_keys la que no es de nadie y pon contraseñas nuevas a locutor y produccion.

Preparando la máquina…

En la sala: antes de las siete

En la sala estás en el SOC a las cinco y media, con srv-emisora en tu puesto y la emisión a las siete. Cada orden gasta su tiempo en el reloj. Si restauras de una copia que no está limpia, o dejas algo de más, la comprobación de integridad vuelve a saltar. Si borras los programas de después de la copia, la emisora no tiene su programa de la mañana. Y si a las siete la emisión no está en marcha, es servicio caído. La nota mira además el paquete, las claves y las contraseñas, y el informe cuenta qué cambió, desde cuándo y de qué copia volviste.