Chapitre 514 minIntermédiaire
Utilisateurs, groupes et sudo sous Linux
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- lire
/etc/passwd,/etc/shadowet/etc/group; - créer, modifier, faire expirer et supprimer des comptes et des groupes ;
- expliquer pourquoi on administre avec
sudoplutôt qu'avecsu; - écrire une règle
sudorestreinte avecvisudo, sans faille.
4 exercices corrigés
Un compte utilisateur Linux est une identité, repérée par un numéro (UID), qui possède des fichiers et lance des processus ; un groupe (GID) réunit des comptes pour leur donner les mêmes droits ; sudo permet à un compte autorisé d'exécuter une commande en administrateur. Ce chapitre décrit les fichiers qui stockent les comptes, les commandes pour les créer, les modifier et les supprimer, et la façon de configurer sudo pour que chacun n'ait que les privilèges dont il a besoin.
Les trois sortes de comptes
| Sorte | UID | Exemples | Usage |
|---|---|---|---|
| Superutilisateur | 0 | root | Tous les droits, aucune vérification. Verrouillé sur une installation Debian faite sans mot de passe root |
| Comptes système | 1 à 999 | www-data (nginx), sshd, systemd-network, _apt | Font tourner les services, sans mot de passe, souvent sans shell (/usr/sbin/nologin) |
| Comptes ordinaires | 1000 à 59999 | clambert, mdiallo, dev-igarnier | Des personnes. Debian les numérote à partir de 1000 (FIRST_UID dans /etc/adduser.conf) |
Un service qui tourne sous son propre compte système (nginx sous www-data) ne peut toucher que les fichiers de ce compte : si une faille permet de le détourner, l'attaquant n'obtient pas les droits de root. C'est le moindre privilège appliqué aux programmes.
Les fichiers des comptes
/etc/passwd, lisible par tous, décrit chaque compte sur une ligne de sept champs séparés par : :
clambert:x:1000:1000:Chloé Lambert,,,:/home/clambert:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
| Champ | clambert | Sens |
|---|---|---|
| 1 | clambert | Identifiant de connexion |
| 2 | x | Le mot de passe est dans /etc/shadow |
| 3 | 1000 | UID |
| 4 | 1000 | GID du groupe principal |
| 5 | Chloé Lambert,,, | Commentaire (champ GECOS : nom complet, bureau, téléphones) |
| 6 | /home/clambert | Dossier personnel |
| 7 | /bin/bash | Shell lancé à la connexion ; /usr/sbin/nologin refuse toute session |
/etc/shadow, lisible seulement par root et le groupe shadow, contient les mots de passe hachés et leurs règles de validité :
clambert:$y$j9T$Qm1...$Lk8...:20741:0:99999:7:::
Le deuxième champ commence par $y$ : l'algorithme est yescrypt, celui de Debian depuis la version 11, conçu pour rendre les essais massifs coûteux. Un ! ou un * à cet endroit signifie qu'aucun mot de passe ne permet de se connecter (compte verrouillé, ou compte système). Les champs suivants sont la date du dernier changement (en jours depuis le 1er janvier 1970 : 20741 = 15 octobre 2026), l'âge minimal et maximal du mot de passe, le délai d'avertissement, puis la date d'expiration du compte.
/etc/group liste les groupes et leurs membres secondaires :
sudo:x:27:clambert,mdiallo,amercier
adm:x:4:clambert,mdiallo
web-dev:x:1004:dev-igarnier,dev-hpetit
Chaque compte a un groupe principal (le 4e champ de /etc/passwd, en général un groupe du même nom créé avec lui) et autant de groupes secondaires qu'il faut. Les groupes qui comptent sur Debian : sudo (droit d'utiliser sudo), adm (lecture des journaux de /var/log), systemd-journal (lecture de tout le journal).
Créer, modifier et supprimer des comptes
Debian fournit deux jeux de commandes. adduser, propre à Debian et Ubuntu, pose les questions et applique les bons réglages (dossier personnel, groupe du même nom, copie de /etc/skel). useradd, commune à toutes les distributions, ne fait que ce que ses options demandent : c'est elle qu'on trouve dans les scripts et sur RHEL.
# Créer le groupe des développeurs du prestataire, puis leurs comptes
sudo addgroup web-dev
sudo adduser --comment "Inès Garnier (prestataire)" dev-igarnier
sudo adduser --comment "Hugo Petit (prestataire)" dev-hpetit
# Les ajouter au groupe (deux formes équivalentes)
sudo adduser dev-igarnier web-dev
sudo usermod -aG web-dev dev-hpetit
# L'équivalent avec useradd, sans question
sudo useradd -m -s /bin/bash -c "Hugo Petit (prestataire)" -G web-dev dev-hpetit
sudo passwd dev-hpetit
Dans usermod -aG, le -a (append) est essentiel : sans lui, -G remplace la liste des groupes secondaires, et le compte perd tous les autres.
| Besoin | Commande |
|---|---|
| Qui suis-je, quels groupes ? | id, id dev-igarnier, groups |
| Qui est connecté ? | who, w |
| Changer un mot de passe | passwd (le tien), sudo passwd dev-igarnier |
| Forcer le changement à la prochaine connexion | sudo passwd -e dev-igarnier |
| Fixer une date de fin de compte | sudo chage -E 2027-06-30 dev-igarnier |
| Voir les règles d'un mot de passe | sudo chage -l dev-igarnier |
| Verrouiller, déverrouiller | sudo usermod -L dev-igarnier, sudo usermod -U dev-igarnier |
| Retirer d'un groupe | sudo deluser dev-igarnier web-dev (ou sudo gpasswd -d dev-igarnier web-dev) |
| Supprimer un compte et son dossier | sudo deluser --remove-home dev-igarnier |
Les comptes des prestataires sont des comptes temporaires : leur fin de mission est connue. chage -E les fait expirer tout seuls à la date prévue, même si personne ne pense à les supprimer.
Les comptes Linux et l'annuaire
Dans une entreprise équipée d'Active Directory, créer les comptes à la main sur chaque serveur Linux ne tient pas longtemps. On peut joindre un serveur Debian au domaine avec realmd et sssd : les comptes et les groupes du domaine (ad.sorbier.example) se connectent alors avec leur mot de passe habituel. Chez Sorbier, les deux serveurs Debian n'ont que quatre ou cinq comptes d'administration et srv-web est en DMZ, où l'on évite de dépendre de l'annuaire : les comptes restent locaux. L'annuaire lui-même est traité dans le cours Windows Server.
su et sudo
su (substitute user) ouvre un shell sous un autre compte, en demandant le mot de passe de ce compte : su - ouvre une session root complète si root a un mot de passe. sudo exécute une commande en administrateur en demandant ton propre mot de passe, à condition que la configuration t'y autorise.
su - | sudo commande | |
|---|---|---|
| Mot de passe demandé | Celui de root | Le tien |
| Portée | Toute une session root | Une commande (ou sudo -i pour une session) |
| Traçabilité | Le journal sait qu'on est devenu root, pas ce qu'on a fait | Chaque commande est journalisée avec ton nom |
| Partage du secret | Toute l'équipe connaît le mot de passe root | Personne ne connaît de mot de passe commun |
C'est pourquoi on administre avec sudo et des comptes nominatifs : quand un fichier de configuration a été modifié, le journal dit qui l'a fait. Après une première saisie, sudo garde ton mot de passe en mémoire 15 minutes dans ce terminal.
clambert@srv-web:~$ sudo systemctl reload nginx
[sudo] Mot de passe de clambert :
clambert@srv-web:~$ sudo journalctl _COMM=sudo --since today | tail -n 2
nov. 04 09:52:10 srv-web sudo[2741]: clambert : TTY=pts/0 ; PWD=/home/clambert ; USER=root ; COMMAND=/usr/bin/systemctl reload nginx
nov. 04 09:52:10 srv-web sudo[2741]: pam_unix(sudo:session): session opened for user root(uid=0) by clambert(uid=1000)
Configurer sudo : le fichier sudoers
Les règles de sudo sont dans /etc/sudoers et dans les fichiers de /etc/sudoers.d/. Sur Debian, la ligne qui donne tous les droits au groupe sudo est déjà là :
%sudo ALL=(ALL:ALL) ALL
Elle se lit : les membres du groupe (%) sudo, depuis n'importe quelle machine (ALL), peuvent exécuter en tant que n'importe quel utilisateur et groupe ((ALL:ALL)) n'importe quelle commande (ALL).
On ne modifie pas /etc/sudoers lui-même : on ajoute un fichier dans /etc/sudoers.d/, toujours avec visudo, qui vérifie la syntaxe avant d'enregistrer. Une erreur de syntaxe dans un fichier sudoers désactive sudo pour tout le monde, et sans mot de passe root, il ne reste plus que le mode de secours pour réparer.
Les développeurs du prestataire doivent pouvoir recharger nginx après une modification du site, et rien d'autre :
sudo visudo -f /etc/sudoers.d/web-dev
# Développeurs du prestataire : tester et recharger nginx, rien d'autre
%web-dev ALL=(root) /usr/sbin/nginx -t, /usr/bin/systemctl reload nginx
Les chemins sont complets, les arguments exacts : dev-igarnier pourra taper sudo systemctl reload nginx, mais sudo systemctl stop nginx sera refusé. sudo -l affiche ce qu'un compte a le droit de faire.
dev-igarnier@srv-web:~$ sudo -l
...
L'utilisateur dev-igarnier peut utiliser les commandes suivantes sur srv-web :
(root) /usr/sbin/nginx -t, /usr/bin/systemctl reload nginx
dev-igarnier@srv-web:~$ sudo systemctl restart ssh
Désolé, l'utilisateur dev-igarnier n'est pas autorisé à exécuter '/usr/bin/systemctl restart ssh' en tant que root sur srv-web.
Deux règles de nommage : un fichier de /etc/sudoers.d/ dont le nom contient un point ou finit par ~ est ignoré (web-dev.conf ne serait jamais lu), et ses droits doivent être 0440 (visudo s'en charge). sudo visudo -c vérifie tous les fichiers d'un coup.
Exercices
Exercice 1 sur 4 Lire /etc/passwd Réussi À revoir
Voici trois lignes de /etc/passwd sur srv-journaux :
root:x:0:0:root:/root:/bin/bash
mdiallo:x:1001:1001:Moussa Diallo,,,:/home/mdiallo:/bin/bash
_chrony:x:996:996:Chrony daemon,,,:/var/lib/chrony:/usr/sbin/nologin
- Quel est l'UID de Moussa Diallo et son groupe principal ?
- Le compte
_chronyest-il une personne ? Peut-il ouvrir une session ? - Où est rangé le mot de passe de
mdiallo?
Voir la réponseMasquer la réponse de l'exercice 1
- UID 1001, groupe principal de GID 1001 (le groupe
mdiallo, créé avec le compte). - Non : c'est un compte système (UID 996, sous 1000), qui fait tourner le service de synchronisation de l'heure Chrony. Son shell
/usr/sbin/nologinrefuse toute session. - Dans
/etc/shadow, sous forme hachée ; lexdu deuxième champ le signale.
Tu avais trouvé ?
Exercice 2 sur 4 Préparer l'arrivée d'un prestataire Réussi À revoir
Le prestataire envoie un troisième développeur, Yanis Roux, du 1er décembre 2026 au 31 mars 2027. Écris les commandes pour : créer son compte dev-yroux avec son nom complet ; le mettre dans le groupe web-dev sans lui retirer d'autres groupes ; faire expirer le compte à la fin de sa mission ; vérifier le résultat.
Voir la réponseMasquer la réponse de l'exercice 2
sudo adduser --comment "Yanis Roux (prestataire)" dev-yroux
sudo usermod -aG web-dev dev-yroux
sudo chage -E 2027-04-01 dev-yroux
id dev-yroux
sudo chage -l dev-yroux
id doit afficher le groupe web-dev. chage -E fixe le jour où la connexion devient impossible : avec 2027-04-01, Yanis peut travailler jusqu'au 31 mars inclus, et chage -l affiche cette date d'expiration. Le piège serait d'écrire 2027-03-31 : la connexion serait refusée à partir du 31 mars, et le dernier jour de mission serait perdu.
Tu avais trouvé ?
Exercice 3 sur 4 Relire une configuration sudo Réussi À revoir
Antoine Mercier trouve ce fichier /etc/sudoers.d/support.conf :
%support ALL=(ALL) NOPASSWD: /usr/bin/vim, /usr/bin/systemctl *
Relève les trois problèmes et propose une règle qui permette au groupe support de redémarrer nginx et de lire le journal de nginx.
Voir la réponseMasquer la réponse de l'exercice 3
- Le nom du fichier contient un point :
sudoignoresupport.conf. La règle ne s'applique pas du tout (ce qui, ici, est presque une chance). /usr/bin/vimenrootpermet d'ouvrir un shell (:!bash) avec tous les droits, et d'éditer n'importe quel fichier,/etc/sudoerscompris./usr/bin/systemctl *autorise toutes les actions sur tous les services, y compris arrêter SSH ou le pare-feu.NOPASSWDsupprime en plus la demande de mot de passe : quiconque obtient une session du groupe devientrootsans rien saisir.
Règle corrigée, dans /etc/sudoers.d/support, éditée avec sudo visudo -f /etc/sudoers.d/support :
%support ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/journalctl -u nginx
Pour la lecture des journaux, une meilleure solution existe sans sudo : ajouter les membres du groupe support au groupe systemd-journal (tout le journal) ou adm (les fichiers de /var/log).
Tu avais trouvé ?
Exercice 4 sur 4 su ou sudo ? Réussi À revoir
Lors d'une recette d'E6, l'examinateur te demande pourquoi ton serveur Debian n'a pas de mot de passe root. Réponds en trois arguments.
Voir la réponseMasquer la réponse de l'exercice 4
- Traçabilité : avec
sudo, chaque commande d'administration est journalisée avec le nom de la personne (journalctl _COMM=sudo), alors qu'une sessionrootpartagée ne dit pas qui a fait quoi. - Pas de secret partagé : aucun mot de passe commun à toute l'équipe, donc rien à changer au départ d'un technicien ; on retire simplement son compte du groupe
sudo. - Moindre privilège :
sudopeut donner à un compte quelques commandes précises au lieu de tous les droits, et le travail courant se fait sans privilège.
Le compte root existe toujours (UID 0), mais il est verrouillé : on ne peut pas s'y connecter avec un mot de passe, ce qui supprime aussi une cible d'essais de mots de passe.
Tu avais trouvé ?