Fliquer ses collègues avec SSH 😜

Mais faut avouer, lorsque l'on bosse à plusieurs sur un serveur GNU/Linux, c'est toujours chiant de devoir chercher qui blâmer quand une connerie est faite (un redémarrage de service qui ne fallait pas ou encore la modification d'une configuration).

Surtout quand on partage un compte commun, par exemple "admin" pour tous les admins... 😉️

Cet article va expliquer comment avoir un résultat similaire à celui-ci:

Jul 29 18:18:23 NOM_SERVEUR [ADRESSE_IP] admin (julien.briault):/home/admin[14932]: sudo tail -f /var/log/shell.log

De base, il est quasiment impossible de savoir exactement qui fait quoi, on n'a qu'à notre dispo la commande history, qui est très limitée car on ne sait pas qui fait quoi et ni à quelle heure de base (sauf si vous jouez avec la variable $HISTTIMEFORMAT).

Il faut absolument que vos utilisateurs utilisent des clés SSH et non pas de mot de passe, d'ailleurs si vous désactivez cette dernière option, ils n'auront pas besoin de connaître le mot de passe, ce qui simplifie la tâche lors du départ d'un collaborateur!

Générer la paire clé publique/privé et l'envoyer à notre serveur cible

A vrai dire, rien de bien compliqué, pour commencer, on va générer nos clés. Mais avant ça on va se pencher sur les différents types de clés.

Les clés proposées par OpenSSH, sont RSA, DSA, ECDSA et ED25519. Vous pouvez déjà commencer par oublier les clés types DSA, depuis la version 7 d'OpenSSH, ce type est déprécié par cause de faille de sécu... D'ailleurs sur les versions récentes, ce type n'est pas dispo.

Les clés RSA (4096 bits) sont compatibles avec tout, après, c'est un type breveté par le MIT donc la NSA n'est sûrement pas innocente derrière tout ça.

Source intéressante: ici.

À noter que les clés RSA doivent être de taille 2048 bits (par défaut) au minimum si vous souhaitez un minimum de sécu... Mais bon, ça reste faillible!

Et le plus strong est... ED25519, outre son nom imprononçable, il est le type le plus ŝur, celui que je vous conseille par ailleurs. Mais valable que sur les nouvelles bécanes!

On va lister les clés dispo pour notre utilisateur courant:

for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}"; done | uniq

On va maintenant donc pouvoir générer nos clés publique/privé:

# Pour la compatibilité
ssh-keygen -t rsa -b 4096 -C votre@email.com

# Pour la sécurité (machines récentes, celle que je préfère)
ssh-keygen -t ed25519 -C votre@email.com
Sur les clés type ED25519, la taille est fixe de 256 bits.

Ensuite on pousse notre clé vers notre serveur distant:

ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@NOM_SERVEUR

La conf du serveur SSH

Je pars du fait que vous n'êtes pas spécialement friand de l'authentification SSH avec mot de passe. Si ce n'est pas le cas, appliquez la configuration suivante:

sudo vi /etc/ssh/sshd_config

Puis, modifiez les valeurs suivante:

PasswordAuthentication no
ChallengeResponseAuthentication no
PermitUserEnvironment yes
UsePAM no

Sans oublier de redémarrer le service SSH!

sudo systemctl restart ssh

On attaque la conf!

Allez let's go, maintenant que tous les prérequis sont en place, on va attaquer la configuration.

On édite le fichier suivant:

sudo vi /etc/profile

Puis on y ajoute à la toute fin:

SSH_IP_CLIENT=$(printf "$SSH_CONNECTION" | awk '{print $1}')
readonly PROMPT_COMMAND='history -a >(logger -i -p local5.info -t "[via: $SSH_IP_CLIENT] $USER ($REALUSER):$PWD"); history -w;'

Lorsqu'on envoie notre clé au serveur distant, celle-ci est ajoutée au fichier ~/.ssh/authorized_keys. Donc pour ce faire, on va donc modifier ce fichier pour y ajouter une variable d'environnement.

environment="REALUSER=julien.briault" ssh-ed25519 AAAA[...] mon@email.com

Maintenant ça fait, on va modifier la configuration de syslog.

sudo echo "local5.*   /var/log/shell.log" > /etc/rsyslog.d/shell.conf

Puis dans le fichier /etc/rsyslog.conf ou /etc/rsyslog.d/50-default.conf, remplacer:

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

Par:

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

Une fois que c'est fait, il faut redémarrer le service syslog.

sudo systemctl restart syslog

Quand tout ça c'est fait, on va créer un logrotate pour avoir de beaux logs qui tournent tous les jours, c'est plutôt pas mal hein!

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

Il ne vous restera plus qu'à vos déconnecter et vous reconnecter. Puis utiliser la commande suivante pour admirer le travail!

sudo tail -f /var/log/shell.log

En complément

Vous pouvez tout d'abord ajouter ce fameux compte partagé en tant que sudoer, pour ce faire:

su -
usermod -aG sudo admin

Une fois qu'il l'est, on peut désactiver l'accès au compte root, pour ce faire il suffit de remplacer dans /etc/passwd:

root:x:0:0:root:/root:/bin/bash

Par:

root:x:0:0:root:/root:/usr/sbin/nologin

Comme ça, ça vous évitera d'obtenir des logs équivalent à:

Jul 30 14:30:50 NOM_SERVEUR [ADRESSE_IP] root ():/root[20200]: commande

Côté sudo, je vous conseille de journaliser ce qui est fait en plus.  Pour réaliser ça:

sudo visudo

# Ajouter
Defaults        logfile=/var/log/sudo/sudo.log

Et y'a plus qu'à ! 😎️