Qui enregistre : vous, un outil ou le serveur
SSH ne garde lui-même aucune copie de ce qui se passe dans une session. sshd journalise la connexion, comme le montre comment vérifier les tentatives de connexion SSH, et rien de plus. Pour conserver la session, il faut un enregistreur, et l'endroit où il tourne détermine ce qu'il peut faire.
| Outil | Tourne sur | Enregistre | Utile pour |
|---|---|---|---|
script | Votre ordinateur ou le serveur | La sortie, en option les entrées, avec le minutage | Un enregistrement personnel rapide, déjà installé |
asciinema | Votre ordinateur ou le serveur | La sortie avec le minutage, dans un seul fichier | Démos, partager une relecture |
tlog | Le serveur | Toutes les sessions des utilisateurs choisis | Enregistrer des sessions que vous ne contrôlez pas |
Journal d'E/S de sudo | Le serveur | Seulement les commandes lancées avec sudo | Les actions d'administration |
Un enregistreur de votre côté capture ce que vous voyez, sur tous les serveurs, sans les modifier. Un enregistreur sur le serveur capture tous ceux qui se connectent, et l'utilisateur ne peut pas simplement l'éviter.
Enregistrer avec script
script, fourni par util-linux, est présent sur presque tous les systèmes Linux. Lancez-le, puis connectez-vous depuis le shell qu'il ouvre :
script --log-io session.log --log-timing session.tm
ssh deploy@server
Travaillez normalement. Une fois terminé, déconnectez-vous du serveur et tapez exit pour arrêter l'enregistrement. Pour enregistrer une seule connexion et s'arrêter à sa fin :
script -q --log-io session.log --log-timing session.tm -c "ssh deploy@server"
Rejouez-la dans votre terminal. Espace met en pause, les flèches haut et bas changent la vitesse, et --divisor 4 lit quatre fois plus vite :
scriptreplay --log-io session.log --log-timing session.tm
scriptreplay --log-io session.log --log-timing session.tm --divisor 4
--log-io enregistre ce que vous tapez en plus de la sortie. Utilisez plutôt --log-out pour ne garder que la sortie. scriptreplay --summary indique le début de la session, le shell et la commande.
Sur macOS, script est la version BSD, avec d'autres options. -r enregistre avec le minutage et -p rejoue :
script -r session.rec ssh deploy@server
script -p session.rec
Enregistrer avec asciinema
asciinema enregistre la session dans un seul fichier .cast, des lignes JSON avec un horodatage pour chaque bloc de sortie. Installez-le avec votre gestionnaire de paquets (apt install asciinema, dnf install asciinema, brew install asciinema), puis :
asciinema rec -i 2 -c "ssh deploy@server" session.cast
asciinema play session.cast
asciinema play -s 4 session.cast
-i 2 raccourcit les pauses de plus de deux secondes, ce qui rend la relecture agréable. Donnez toujours un nom de fichier : il reste alors sur votre disque et rien n'est envoyé en ligne. Les frappes ne sont pas enregistrées, sauf si vous ajoutez --stdin.
Enregistrer toutes les sessions sur le serveur avec tlog
Quand les sessions à enregistrer sont celles d'autres personnes, l'enregistreur doit tourner sur le serveur. tlog est disponible en paquet sur RHEL, Rocky, AlmaLinux et Fedora. La configuration la plus simple en fait le shell de connexion des utilisateurs à enregistrer :
sudo dnf install tlog
sudo usermod -s /usr/bin/tlog-rec-session deploy
tlog-rec-session lance le vrai shell (bash par défaut, réglé dans /etc/tlog/tlog-rec-session.conf) et écrit la session dans le journal systemd. Sur un système avec SSSD, vous pouvez plutôt choisir les utilisateurs et les groupes à un seul endroit :
[session_recording]
scope = some
users = deploy
groups = admins
Mettez ces lignes dans /etc/sssd/conf.d/sssd-session-recording.conf, donnez au fichier le mode 600 et redémarrez sssd. Pour rejouer une session, cherchez son identifiant dans le journal et passez-le à tlog-play :
journalctl -o verbose | grep -m5 TLOG_REC=
tlog-play -r journal -M TLOG_REC=1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d-2f1-4d2e1
Par défaut, tlog n'enregistre pas les frappes (log.input vaut false), donc les mots de passe tapés à une invite ne sont pas conservés. N'activez l'enregistrement des entrées que si vous en avez vraiment besoin.
Enregistrer seulement les commandes sudo
Si ce qui compte est ce que les administrateurs lancent en root, sudo peut enregistrer la sortie de chaque commande qu'il exécute. Ajoutez un fichier avec sudo visudo -f /etc/sudoers.d/io-log :
Defaults log_output
Defaults!/usr/bin/sudoreplay !log_output
La deuxième ligne évite que sudo enregistre ses propres relectures. Ensuite, listez et rejouez les sessions :
sudo sudoreplay -l
sudo sudoreplay 000001
Les enregistrements vont dans /var/log/sudo-io. C'est une petite configuration qui complète bien utiliser sudo en SSH sans risque, mais elle ne voit rien de ce qui est fait sans sudo.
Garder les secrets hors des enregistrements
Un enregistrement contient tout ce qui est passé à l'écran : un jeton d'API affiché par env, une clé privée affichée avec cat, un mot de passe de base de données passé en ligne de commande. Quelques habitudes aident :
- N'enregistrez que la sortie, sauf si vous avez besoin des frappes. Les mots de passe tapés à une invite masquée n'atteignent alors jamais le fichier.
- N'affichez pas les secrets que vous n'avez pas besoin de voir. Lisez-les depuis un fichier ou une variable au lieu de les coller dans les commandes.
- Conservez les enregistrements comme des identifiants :
chmod 600, sur un disque chiffré, supprimés quand ils ne servent plus. - Les enregistrements faits sur un serveur peuvent être modifiés par root sur ce serveur. S'ils doivent faire foi plus tard, envoyez-les vers une autre machine au fur et à mesure.
L'enregistrement de sessions SSH chiffré sur votre appareil est utile quand les enregistrements se trouvent sur un portable qui peut se perdre.
Lequel choisir
- Une trace de votre propre travail, sur n'importe quel serveur :
script, ou l'enregistreur de votre client SSH. - Une relecture à montrer à quelqu'un :
asciinema. - Toutes les sessions de certains utilisateurs, quel que soit leur client :
tlogsur le serveur. - Seulement les commandes privilégiées : les journaux d'E/S de sudo.
Si le but est de garder le travail en vie après une déconnexion plutôt que de le revoir, c'est tmux qu'il vous faut : voir garder une session SSH active avec tmux.
Questions
Peut-on enregistrer une session SSH déjà ouverte ?
Pas avec ces outils. script, asciinema et tlog démarrent tous avant le shell. Dans tmux, vous pouvez sauvegarder ce qui reste dans l'historique avec tmux capture-pane -p -S -, mais ce n'est que du texte, sans le minutage.
SSH enregistre-t-il les sessions tout seul ?
Non. sshd journalise qui s'est connecté, quand et avec quelle clé, mais pas ce qui a été tapé ou affiché. Pour cela, il faut un enregistreur sur le client ou sur le serveur.
Les mots de passe sont-ils dans l'enregistrement ?
Un mot de passe tapé à une invite qui le masque n'apparaît pas dans la sortie, mais script --log-io et tlog avec l'enregistrement des entrées gardent aussi les frappes, donc ces mots de passe sont dans le journal des entrées. Tout ce qui s'affiche à l'écran, comme un jeton ou une clé, est toujours dans l'enregistrement.
Est-il légal d'enregistrer les sessions d'autres personnes ?
Cela dépend du pays et de l'entreprise. Il faut souvent prévenir les utilisateurs au préalable, et une bannière de connexion est le moyen habituel de le faire.
Sources
- script(1), util-linux
- scriptreplay(1), util-linux
- Documentation asciinema
- tlog, terminal I/O logger
- Recording sessions, Red Hat Enterprise Linux 9
- sudoers(5), I/O logging