Cómo grabar una sesión SSH en Linux

Para grabar una sesión desde tu lado, ejecuta script --log-io session.log --log-timing session.tm antes de conectarte y reprodúcela con scriptreplay. asciinema rec hace lo mismo en un solo archivo fácil de compartir. Para grabar todas las sesiones de un usuario en el servidor, use el cliente que use, configura tlog. Una grabación guarda todo lo que aparece en pantalla, así que trátala como un secreto.

Actualizada el . script y scriptreplay de util-linux 2.41 y asciinema 2.4 se ejecutaron en Debian 13 en un contenedor desechable; script -r y -p se ejecutaron en macOS.

Quién graba: tú, una herramienta o el servidor

SSH no guarda ninguna copia de lo que pasa en una sesión. sshd registra el inicio de sesión, como se ve en cómo ver los intentos de acceso SSH, y nada más. Para conservar la sesión necesitas un grabador, y el lugar donde se ejecuta decide lo que puede hacer.

HerramientaSe ejecuta enGrabaÚtil para
scriptTu ordenador o el servidorLa salida, opcionalmente la entrada, con tiemposUn registro personal rápido, ya instalado
asciinemaTu ordenador o el servidorLa salida con tiempos, en un solo archivoDemos, compartir una reproducción
tlogEl servidorTodas las sesiones de los usuarios elegidosGrabar sesiones que no controlas
Registro de E/S de sudoEl servidorSolo los comandos ejecutados con sudoAcciones de administración

Un grabador en tu lado captura lo que ves, en todos los servidores, sin tocarlos. Un grabador en el servidor captura a todos los que entran, y el usuario no puede saltárselo sin más.

Grabar con script

script, de util-linux, está en casi todos los sistemas Linux. Ejecútalo y conéctate desde la shell que abre:

script --log-io session.log --log-timing session.tm
ssh deploy@server

Trabaja como siempre. Cuando termines, sal del servidor y escribe exit para parar la grabación. Para grabar una sola conexión y parar cuando acabe:

script -q --log-io session.log --log-timing session.tm -c "ssh deploy@server"

Reprodúcela en tu terminal. Espacio pausa, las flechas arriba y abajo cambian la velocidad y --divisor 4 reproduce a cuatro veces la velocidad:

scriptreplay --log-io session.log --log-timing session.tm
scriptreplay --log-io session.log --log-timing session.tm --divisor 4

--log-io guarda lo que escribes además de la salida. Usa --log-out en su lugar para quedarte solo con la salida. scriptreplay --summary muestra cuándo empezó la sesión, la shell y el comando.

En macOS, script es la versión BSD, con otras opciones. -r graba con tiempos y -p reproduce:

script -r session.rec ssh deploy@server
script -p session.rec

Grabar con asciinema

asciinema guarda la sesión en un solo archivo .cast, líneas JSON con un tiempo para cada trozo de salida. Instálalo con tu gestor de paquetes (apt install asciinema, dnf install asciinema, brew install asciinema) y luego:

asciinema rec -i 2 -c "ssh deploy@server" session.cast
asciinema play session.cast
asciinema play -s 4 session.cast

-i 2 acorta las pausas de más de dos segundos, y así la reproducción se ve mejor. Indica siempre un nombre de archivo: el archivo se queda en tu disco y no se sube nada. Las pulsaciones no se guardan salvo que añadas --stdin.

Grabar todas las sesiones en el servidor con tlog

Cuando las sesiones que hay que grabar son de otras personas, el grabador tiene que estar en el servidor. tlog tiene paquete en RHEL, Rocky, AlmaLinux y Fedora. La configuración más sencilla lo convierte en la shell de inicio de los usuarios que quieres grabar:

sudo dnf install tlog
sudo usermod -s /usr/bin/tlog-rec-session deploy

tlog-rec-session arranca la shell real (bash por defecto, se cambia en /etc/tlog/tlog-rec-session.conf) y escribe la sesión en el journal de systemd. En un sistema con SSSD puedes elegir usuarios y grupos en un solo sitio:

[session_recording]
scope = some
users = deploy
groups = admins

Pon esas líneas en /etc/sssd/conf.d/sssd-session-recording.conf, dale al archivo el modo 600 y reinicia sssd. Para reproducir una sesión, busca su identificador en el journal y pásalo a tlog-play:

journalctl -o verbose | grep -m5 TLOG_REC=
tlog-play -r journal -M TLOG_REC=1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d-2f1-4d2e1

Por defecto tlog no guarda las pulsaciones (log.input es false), así que las contraseñas escritas en un aviso no se conservan. Activa el registro de entrada solo si de verdad lo necesitas.

Grabar solo los comandos con sudo

Si lo que importa es lo que los administradores ejecutan como root, sudo puede grabar la salida de cada comando que lanza. Añade un archivo con sudo visudo -f /etc/sudoers.d/io-log:

Defaults log_output
Defaults!/usr/bin/sudoreplay !log_output

La segunda línea evita que sudo grabe sus propias reproducciones. Luego lista y reproduce las sesiones:

sudo sudoreplay -l
sudo sudoreplay 000001

Las grabaciones van a /var/log/sudo-io. Es una configuración pequeña que encaja bien con usar sudo por SSH de forma segura, pero no ve nada de lo que se hace sin sudo.

Mantener los secretos fuera de las grabaciones

Una grabación contiene todo lo que pasó por la pantalla: un token de API impreso por env, una clave privada mostrada con cat, una contraseña de base de datos pasada en la línea de comandos. Algunos hábitos ayudan:

  • Graba solo la salida salvo que necesites las pulsaciones. Así las contraseñas escritas en un aviso oculto nunca llegan al archivo.
  • No imprimas secretos que no necesitas ver. Léelos de un archivo o de una variable en lugar de pegarlos en los comandos.
  • Guarda las grabaciones como credenciales: chmod 600, en un disco cifrado, y bórralas cuando ya no sirvan.
  • Root puede modificar las grabaciones hechas en ese mismo servidor. Si deben servir como prueba más adelante, envíalas a otra máquina a medida que se escriben.

La grabación de sesiones SSH cifrada en tu dispositivo ayuda cuando las grabaciones están en un portátil que se puede perder.

Cuál usar

  • Un registro de tu propio trabajo, en cualquier servidor: script, o el grabador de tu cliente SSH.
  • Una reproducción para enseñar a alguien: asciinema.
  • Todas las sesiones de ciertos usuarios, usen el cliente que usen: tlog en el servidor.
  • Solo los comandos con privilegios: los registros de E/S de sudo.

Si lo que buscas es que el trabajo siga vivo tras una desconexión, y no revisarlo, lo que necesitas es tmux: consulta mantener sesiones SSH abiertas con tmux.

Preguntas

¿Puedo grabar una sesión SSH que ya está abierta?

No con estas herramientas. script, asciinema y tlog arrancan antes que la shell. Dentro de tmux puedes guardar lo que queda en el historial con tmux capture-pane -p -S -, pero es solo texto, sin tiempos.

¿SSH graba las sesiones por sí solo?

No. sshd registra quién se conectó, cuándo y con qué clave, pero no lo que se escribió ni lo que se mostró. Para eso necesitas un grabador en el cliente o en el servidor.

¿Las contraseñas quedan en la grabación?

Una contraseña escrita en un aviso que la oculta no aparece en la salida, pero script --log-io y tlog con registro de entrada también guardan las pulsaciones, así que esas contraseñas están en el registro de entrada. Todo lo que se imprime en pantalla, como un token o una clave, queda siempre grabado.

¿Es legal grabar las sesiones de otras personas?

Depende del país y de la empresa. Muchas veces hay que avisar antes a los usuarios, y un banner de inicio de sesión es la forma habitual de hacerlo.

Fuentes

Más en Sesiones y tmux

Todas las guías