Chi registra: tu, uno strumento o il server
SSH da solo non conserva nulla di quello che succede in una sessione. sshd registra l'accesso, come spiegato in come controllare i tentativi di accesso SSH, e niente dopo. Per tenere la sessione serve un registratore, e il posto in cui gira decide cosa può fare.
| Strumento | Gira su | Registra | Adatto a |
|---|---|---|---|
script | Il tuo computer o il server | Output, a scelta anche input, con i tempi | Una traccia personale veloce, già installato |
asciinema | Il tuo computer o il server | Output con i tempi, un solo file | Demo, condividere una riproduzione |
tlog | Il server | Ogni sessione degli utenti scelti | Registrare sessioni che non controlli |
Log I/O di sudo | Il server | Solo i comandi eseguiti con sudo | Operazioni da amministratore |
Un registratore dal tuo lato cattura quello che vedi, su ogni server, senza toccarli. Un registratore sul server cattura chiunque entri, e l'utente non può semplicemente saltarlo.
Registrare con script
script di util-linux c'è su quasi tutti i sistemi Linux. Avvialo, poi collegati dalla shell che apre:
script --log-io session.log --log-timing session.tm
ssh deploy@server
Lavora come sempre. Quando hai finito, esci dal server e scrivi exit per fermare la registrazione. Per registrare una sola connessione e fermarti quando finisce:
script -q --log-io session.log --log-timing session.tm -c "ssh deploy@server"
Riguardala nel terminale. Lo spazio mette in pausa, le frecce su e giù cambiano la velocità, e --divisor 4 riproduce a velocità quadrupla:
scriptreplay --log-io session.log --log-timing session.tm
scriptreplay --log-io session.log --log-timing session.tm --divisor 4
--log-io salva quello che scrivi oltre all'output. Usa invece --log-out per tenere solo l'output. scriptreplay --summary mostra quando è iniziata la sessione, la shell e il comando.
Su macOS script è la versione BSD, con opzioni diverse. -r registra con i tempi e -p riproduce:
script -r session.rec ssh deploy@server
script -p session.rec
Registrare con asciinema
asciinema salva la sessione in un unico file .cast: righe JSON semplici, con un tempo per ogni pezzo di output. Installalo dal gestore di pacchetti (apt install asciinema, dnf install asciinema, brew install asciinema), poi:
asciinema rec -i 2 -c "ssh deploy@server" session.cast
asciinema play session.cast
asciinema play -s 4 session.cast
-i 2 accorcia le pause più lunghe di due secondi, così la riproduzione si guarda volentieri. Dai sempre un nome al file: resta sul tuo disco e non viene caricato nulla. I tasti premuti non vengono salvati, a meno che tu non aggiunga --stdin.
Registrare ogni sessione sul server con tlog
Quando le sessioni da registrare sono di altre persone, il registratore deve girare sul server. tlog è nei pacchetti di RHEL, Rocky, AlmaLinux e Fedora. La configurazione più semplice lo rende la shell di accesso degli utenti da registrare:
sudo dnf install tlog
sudo usermod -s /usr/bin/tlog-rec-session deploy
tlog-rec-session avvia la shell vera (bash di base, impostata in /etc/tlog/tlog-rec-session.conf) e scrive la sessione nel journal di systemd. Su un sistema con SSSD puoi invece scegliere utenti e gruppi in un unico posto:
[session_recording]
scope = some
users = deploy
groups = admins
Metti queste righe in /etc/sssd/conf.d/sssd-session-recording.conf, dai al file i permessi 600 e riavvia sssd. Per riguardare una sessione, trova il suo ID di registrazione nel journal e passalo a tlog-play:
journalctl -o verbose | grep -m5 TLOG_REC=
tlog-play -r journal -M TLOG_REC=1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d-2f1-4d2e1
Di base tlog non salva i tasti (log.input è false), quindi le password scritte a un prompt non vengono conservate. Attiva la registrazione dell'input solo se ti serve davvero.
Registrare solo i comandi sudo
Se conta quello che gli amministratori eseguono come root, sudo può registrare l'output di ogni comando che lancia. Aggiungi un file con sudo visudo -f /etc/sudoers.d/io-log:
Defaults log_output
Defaults!/usr/bin/sudoreplay !log_output
La seconda riga evita che sudo registri le sue stesse riproduzioni. Poi elenca e riguarda le sessioni:
sudo sudoreplay -l
sudo sudoreplay 000001
Le registrazioni finiscono in /var/log/sudo-io. È una configurazione piccola che si abbina bene a usare sudo via SSH in sicurezza, ma non vede nulla di ciò che si fa senza sudo.
Tenere i segreti fuori dalle registrazioni
Una registrazione contiene tutto quello che è passato sullo schermo: un token API stampato da env, una chiave privata mostrata con cat, una password di database passata sulla riga di comando. Qualche abitudine aiuta:
- Registra solo l'output, a meno che non ti servano i tasti. Le password scritte a un prompt nascosto non arrivano mai al file.
- Non stampare segreti che non ti serve vedere. Leggili da un file o da una variabile invece di incollarli nei comandi.
- Conserva le registrazioni come credenziali:
chmod 600, su un disco cifrato, cancellate quando non servono più. - Le registrazioni fatte su un server possono essere modificate da root su quel server. Se devono valere anche dopo, inviale a un'altra macchina mentre vengono scritte.
La registrazione delle sessioni SSH cifrata sul dispositivo aiuta quando le registrazioni stanno su un portatile che potresti perdere.
Quale usare
- Una traccia del tuo lavoro, su qualsiasi server:
script, o il registratore del tuo client SSH. - Una riproduzione da mostrare a qualcuno:
asciinema. - Ogni sessione di certi utenti, con qualsiasi client:
tlogsul server. - Solo i comandi con privilegi: i log I/O di sudo.
Se l'obiettivo è tenere vivo il lavoro dopo una disconnessione invece di rivederlo, ti serve tmux, vedi tenere aperte le sessioni SSH con tmux.
Domande
Posso registrare una sessione SSH già aperta?
Non con questi strumenti. script, asciinema e tlog partono prima della shell. Dentro tmux puoi salvare quello che è ancora nello storico con tmux capture-pane -p -S -, ma è solo testo, senza tempi.
SSH registra le sessioni da solo?
No. sshd registra chi si è collegato, quando e con quale chiave, ma non cosa è stato scritto o mostrato. Per quello serve un registratore sul client o sul server.
Le password finiscono nella registrazione?
Le password scritte a un prompt che le nasconde non compaiono nell'output, ma script --log-io e tlog con la registrazione dell'input salvano anche i tasti, quindi quelle password sono nel log dell'input. Tutto ciò che viene stampato a schermo, come un token o una chiave, è sempre nella registrazione.
È legale registrare le sessioni di altre persone?
Dipende da dove lavori. In molti casi bisogna avvisare prima gli utenti, e un banner al login è il modo più comune.
Fonti
- script(1), util-linux
- scriptreplay(1), util-linux
- Documentazione di asciinema
- tlog, terminal I/O logger
- Recording sessions, Red Hat Enterprise Linux 9
- sudoers(5), I/O logging