SSH Blamer

Vous partagez un utilisateur sur une machine avec des collègues (typiquement sur un serveur), et en tant que bon administrateur, vous avez besoin de savoir qui fait quoi et qui blâmer pour avoir modifié un fichier de conf ou stoppé un service.

C'est impossible de base de savoir ça. Vous n'avez à votre disposition que la commande history, qui est très limitée, car vous ne savez pas qui à fait quoi ni à quelle heure.

Pourtant, si vous utilisez des clés SSH pour que vos utilisateurs se connectent (ce que vous devriez, comme ça ils n'ont pas à connaître le mot de passe), il y a moyen de les tracer.

Pour cela, vous devez vous servir des variables d'environnement SSH. Vous obtiendrez de jolis logs comme ça :

Aug  1 10:50:33 myserver shareduser(john.doe)[/home/shareduser/myappli][25577]: cd myappli/master
Aug  1 10:50:34 myserver shareduser(john.doe)[/home/shareduser/myappli/master][25615]: ls
Aug  1 10:50:36 myserver shareduser(john.doe)[/home/shareduser/myappli/master/www][25648]: cd www
Aug  1 10:50:36 myserver shareduser(john.doe)[/home/shareduser/myappli/master/www][25686]: ls
Aug  1 12:00:03 myserver shareduser(damien.gustave)[/home/shareduser][42189]: cat .ssh/authorized_keys
Aug  1 12:05:31 myserver shareduser(damien.gustave)[/home/shareduser][47745]: grep REAL .ssh/authorized_keys
Aug  1 12:10:57 myserver shareduser(damien.gustave)[/home/shareduser][3925]: vi /etc/profile
Aug  1 12:11:04 myserver shareduser(damien.gustave)[/home/shareduser][4110]: echo $REALUSER

Sympa, hein ? Allez, on mets ça en place :

Editer le fichier /etc/profile

Ajouter à la fin la ligne :

readonly PROMPT_COMMAND='history -a >(logger -i -p local5.info -t "$USER($REALUSER)[$PWD]"); history -w;'

On aura donc dans les logs ce format :
DATE - SERVEUR - UTILISATEUR - (UTILISATEUR_REEL) - [WORKING_DIRECTORY] - [PID]: - COMMANDE

Ce format peut être personalisé en tweakant la commande logger ci-dessus pour entrer les infos que vous souhaitez.

Editer /etc/ssh/sshd_config

Ajouter PermitUserEnvironment yesau fichier de configuration afin d'autoriser les variable d'environnement, puis redémarrer le service :

sudo service ssh restart

Editer /home/user/.ssh/authorized_keys

Les clés SSH autorisés devraient se trouver là.

Préfixer chaque ligne avec la valeur voulue pour la variable d'environnement :

environment="REALUSER=damien.gustave" ssh-rsa AAAAB3[...]

Créer le fichier /etc/rsyslog.d/shell.conf

Avec pour contenu :

local5.*   /var/log/shell.log

Editer /etc/rsyslog.conf

Trouver la ligne :

*.*;auth,authpriv.none     -/var/log/syslog`

La remplacer par :

*.*;auth,authpriv.none,local5.none     -/var/log/syslog`

Puis redémarrer rsyslog :

service rsyslog restart

Créer /etc/logrotate.d/shell

Afin d'avoir de beau logs qui tournent tous les jours :

/var/log/shell.log {
    rotate 30
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
    invoke-rc.d rsyslog rotate > /dev/null
    endscript
    create 644 root adm
}

Et voilà, vous êtes maintenant Big Brother.

Damien Gustave

Read more posts by this author.