Bien que cette question ait été posée par une personne souhaitant enregistrer ses propres sessions, un autre cas d'utilisation pourrait être un administrateur système qui souhaite garder une trace de ce que font les différents utilisateurs.
J'ai peur de courir script
à l'intérieur du système bashrc
ne soit pas adapté dans le cas où les utilisateurs de la machine hésitent à faire enregistrer leurs sessions.
Les utilisateurs qui souhaitent rester incognito pourraient contourner la journalisation en demandant à sshd d'ouvrir un autre shell (par exemple zsh
) ou d'exécuter bash --rcfile ___
pour empêcher/etc/bash.bashrc
d'être chargé.
Une approche alternative
Ce guide de 2008 ( archivé ) utilise une méthode différente pour forcerscript
son exécution lorsqu'un utilisateur se connecte avec ssh, ce qui oblige les utilisateurs à se connecter avec une clé publique / privée.
Cela se fait en ajoutant un script au .ssh/authorized_keys
fichier de l'utilisateur , devant la clé:
command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....
Le script log-session
( archivé ) décide ensuite s'il doit s'exécuter ou non /usr/bin/script
pour enregistrer la session de cet utilisateur.
exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE
Pour empêcher l'utilisateur de supprimer la commande ajoutée, l'administrateur devra assumer la propriété du authorized_keys
fichier de l'utilisateur .
chown root:root ~user/.ssh/authorized_keys
Malheureusement, cela signifie que l'utilisateur ne pourra pas ajouter lui-même de clés supplémentaires ou, plus important encore, révoquer la clé existante si elle est compromise, ce qui est loin d'être idéal.
Avertissements
Il est courant que la configuration par défaut de sshd permette aux utilisateurs d'exécuter SFTP via leur connexion ssh. Cela permet aux utilisateurs de modifier des fichiers sans que les modifications soient enregistrées. Si l'administrateur ne souhaite pas que les utilisateurs soient en mesure de le faire, il doit activer la journalisation pour SFTP ou désactiver le service. Bien que même dans ce cas, les utilisateurs puissent toujours apporter des modifications invisibles aux fichiers en exécutant quelque chose comme ceci dans leur terminal:
curl "http://users.own.server/server/new_data" > existing_file
Il peut être possible de surveiller des modifications comme celle-ci en utilisant un système de fichiers de copie sur écriture qui enregistre tout l'historique des fichiers.
Mais une astuce similaire permettrait à un utilisateur d'exécuter des commandes sans qu'il soit connecté:
curl "http://users.own.server/server/secret_commands_824" | sh
Je ne connais aucune solution simple à cela. Les possibilités peuvent être:
- Consigner toutes les données du réseau (et les démêler plus tard).
- Enregistrement de tous les appels système.
Ce genre de chose pourrait être possible avec auditd .
Mais peu importe...
Il est peu probable que la journalisation des sessions utilisateur offre une réelle sécurité aux administrateurs. Par défaut, un utilisateur ne peut manipuler que ses propres fichiers et ne peut pas endommager le système. Si un utilisateur malveillant parvient à augmenter les privilèges, il peut désactiver la journalisation et supprimer les journaux (sauf si l'administrateur a configuré les journaux pour qu'ils soient stockés sur une machine distincte, en ajoutant uniquement).
Les administrateurs qui enregistrent automatiquement les sessions utilisateur devraient probablement informer les utilisateurs que cela est en cours . Dans certaines juridictions, cette forme de collecte de données peut violer les lois sur les données ou la confidentialité . Et à tout le moins, il serait respectueux des utilisateurs de les informer.
Il est plus probable qu'un administrateur serait intéressé par la journalisation des sessions des sudo
utilisateurs. Cela pourrait peut-être être abordé dans une réponse différente, voire une question différente.
exec
au début de la ligne. il doit démarrer lescript -f
dans le même shell PID.