Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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/shadow et /etc/group ;
  • créer, modifier, faire expirer et supprimer des comptes et des groupes ;
  • expliquer pourquoi on administre avec sudo plutôt qu'avec su ;
  • écrire une règle sudo restreinte avec visudo, 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

SorteUIDExemplesUsage
Superutilisateur0rootTous les droits, aucune vérification. Verrouillé sur une installation Debian faite sans mot de passe root
Comptes système1 à 999www-data (nginx), sshd, systemd-network, _aptFont tourner les services, sans mot de passe, souvent sans shell (/usr/sbin/nologin)
Comptes ordinaires1000 à 59999clambert, mdiallo, dev-igarnierDes 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 : :

text
clambert:x:1000:1000:Chloé Lambert,,,:/home/clambert:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ChampclambertSens
1clambertIdentifiant de connexion
2xLe mot de passe est dans /etc/shadow
31000UID
41000GID du groupe principal
5Chloé Lambert,,,Commentaire (champ GECOS : nom complet, bureau, téléphones)
6/home/clambertDossier personnel
7/bin/bashShell 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é :

text
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 :

text
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.

bash
# 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.

BesoinCommande
Qui suis-je, quels groupes ?id, id dev-igarnier, groups
Qui est connecté ?who, w
Changer un mot de passepasswd (le tien), sudo passwd dev-igarnier
Forcer le changement à la prochaine connexionsudo passwd -e dev-igarnier
Fixer une date de fin de comptesudo chage -E 2027-06-30 dev-igarnier
Voir les règles d'un mot de passesudo chage -l dev-igarnier
Verrouiller, déverrouillersudo usermod -L dev-igarnier, sudo usermod -U dev-igarnier
Retirer d'un groupesudo deluser dev-igarnier web-dev (ou sudo gpasswd -d dev-igarnier web-dev)
Supprimer un compte et son dossiersudo 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 rootLe tien
PortéeToute une session rootUne commande (ou sudo -i pour une session)
TraçabilitéLe journal sait qu'on est devenu root, pas ce qu'on a faitChaque commande est journalisée avec ton nom
Partage du secretToute l'équipe connaît le mot de passe rootPersonne 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.

console
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à :

text
%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 :

bash
sudo visudo -f /etc/sudoers.d/web-dev
text
# 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.

console
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 :

text
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
  1. Quel est l'UID de Moussa Diallo et son groupe principal ?
  2. Le compte _chrony est-il une personne ? Peut-il ouvrir une session ?
  3. Où est rangé le mot de passe de mdiallo ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. UID 1001, groupe principal de GID 1001 (le groupe mdiallo, créé avec le compte).
  2. 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/nologin refuse toute session.
  3. Dans /etc/shadow, sous forme hachée ; le x du 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
bash
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 :

text
%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
  1. Le nom du fichier contient un point : sudo ignore support.conf. La règle ne s'applique pas du tout (ce qui, ici, est presque une chance).
  2. /usr/bin/vim en root permet d'ouvrir un shell (:!bash) avec tous les droits, et d'éditer n'importe quel fichier, /etc/sudoers compris.
  3. /usr/bin/systemctl * autorise toutes les actions sur tous les services, y compris arrêter SSH ou le pare-feu. NOPASSWD supprime en plus la demande de mot de passe : quiconque obtient une session du groupe devient root sans rien saisir.

Règle corrigée, dans /etc/sudoers.d/support, éditée avec sudo visudo -f /etc/sudoers.d/support :

text
%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 session root partagé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 : sudo peut 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é ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Droits Linux : chmod, chown, umask et bits spéciauxRevoir le sommaire du cours