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.
| Herramienta | Se ejecuta en | Graba | Útil para |
|---|---|---|---|
script | Tu ordenador o el servidor | La salida, opcionalmente la entrada, con tiempos | Un registro personal rápido, ya instalado |
asciinema | Tu ordenador o el servidor | La salida con tiempos, en un solo archivo | Demos, compartir una reproducción |
tlog | El servidor | Todas las sesiones de los usuarios elegidos | Grabar sesiones que no controlas |
Registro de E/S de sudo | El servidor | Solo los comandos ejecutados con sudo | Acciones 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:
tlogen 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
- script(1), util-linux
- scriptreplay(1), util-linux
- Documentación de asciinema
- tlog, terminal I/O logger
- Recording sessions, Red Hat Enterprise Linux 9
- sudoers(5), I/O logging