Aller au contenu

2 - Utilisateurs, groupes et droits

La séance précédente vous a appris les bases d'un système. Maintenant nous allons voir comment contrôler ceux qui ont le droit de faire des actions dessus.

C'est une des briques de la sécurité sous Unix, et c'est aussi la cause d'une bonne moitié des pannes que vous rencontrerez : un service qui ne démarre pas, un fichier qu'on ne peut pas écrire, un partage réseau illisible. Souvent, c'est une histoire de droits.

Ce que vous allez apprendre ici

  • Créer, modifier et supprimer des comptes et des groupes
  • Lire et interpréter les permissions d'un fichier
  • Modifier les droits et le propriétaire d'un fichier
  • Comprendre ce que change sudo et dans quelles limites
  • Mettre en place un répertoire partagé entre plusieurs utilisateurs
  • Dépanner un partage entre deux machines dont les identifiants divergent

Prérequis

Le TP 1 est supposé acquis : navigation, lecture de fichiers, grep, tubes, redirections, édition avec nano ou vi.


1. Qui êtes-vous, pour le système

Un compte possède deux identités : un nom, pour les utilisateurs, et un nombre, pour le noyau.

Votre compte possède un identifiant numérique, l'UID, et appartient à un groupe principal identifié par un GID. Le nom etudiant est une étiquette lisible, associée au nombre dans un fichier. C'est le nombre qui sert à toutes les vérifications de droits.

Commande Rôle
id Votre UID, votre GID, tous vos groupes
id nom La même chose pour un autre compte
groups Vos groupes, en plus court
who Qui est connecté en ce moment
last Historique des connexions

Trois fichiers portent toute l'information :

Fichier Contenu
/etc/passwd Les comptes : nom, UID, GID, description, répertoire personnel, interpréteur
/etc/group Les groupes : nom, GID, membres additionnels
/etc/shadow Les empreintes de mots de passe, lisible uniquement par root

Une ligne de /etc/passwd se lit ainsi :

etudiant:x:1000:1000:Compte etudiant:/home/etudiant:/bin/bash
   1      2  3    4          5              6            7
  1. Nom du compte
  2. Emplacement historique du mot de passe, aujourd'hui remplacé par x
  3. UID
  4. GID du groupe principal
  5. Description
  6. Répertoire personnel
  7. Interpréteur de commandes

Pourquoi le mot de passe a déménagé

/etc/passwd doit être lisible par tout le monde, parce que n'importe quel programme a besoin de traduire un UID en nom. Y laisser les empreintes de mots de passe revenait à les offrir à qui voulait les casser. Elles ont donc été déplacées dans /etc/shadow, que seul root peut lire.

Les UID ne sont pas distribués au hasard :

Plage Usage
0 root, l'administrateur
1 à 999 Comptes système, créés par les paquets pour faire tourner les services
1000 et au-delà Comptes d'utilisateur

Exercice 1 — Reconnaître les comptes

Sur srv-deb :

  1. Affichez votre UID, votre GID et la liste de vos groupes.
  2. Affichez la ligne de /etc/passwd correspondant à root. Quel est son UID, et son répertoire personnel ?
  3. Listez les comptes dont l'UID est supérieur ou égal à 1000. Combien en trouvez-vous ?
  4. Choisissez trois comptes dont l'UID est inférieur à 1000. À quel service correspondent-ils, d'après leur nom ?
  5. Essayez d'afficher /etc/shadow. Que se passe-t-il, et pourquoi ?
Indice — question 3

L'UID est le troisième champ, séparé par des deux-points. Extrayez-le, puis filtrez sur sa valeur. La commande awk fait ça très bien, mais cut et un tri numérique suffisent aussi.


2. Devenir administrateur

Le compte root a tous les droits, sans exception et sans garde-fou. On ne travaille donc jamais connecté en root : on emprunte ses privilèges le temps d'une commande.

sudo commande          # exécuter une commande en tant que root
sudo -u autre commande # l'exécuter en tant qu'un autre utilisateur
sudo -i                # ouvrir un shell root (à éviter)

sudo demande votre mot de passe, pas celui de root, et journalise chaque usage. C'est ce qui permet de savoir qui a fait quoi sur une machine partagée.

Signification de sudo

sudo est généralement présenté comme la contraction de "superuser do".

Le droit d'utiliser sudo n'est pas automatique : Il est défini par la configuration de sudo, généralement dans /etc/sudoers et les fichiers inclus depuis /etc/sudoers.d/.

Famille Groupe donnant accès à sudo
Debian sudo
Red Hat wheel

Ce comportement peut toutefois être modifié : sudoers permet également d'accorder des droits directement à un utilisateur ou à d'autres groupes.

Le fichier qu'on n'édite pas avec un éditeur classique

Une erreur de syntaxe dans /etc/sudoers peut empêcher sudo de fonctionner et compliquer fortement la récupération de l'accès administrateur, notamment sur une machine distante.

N'éditez pas /etc/sudoers avec nano, vim, etc. directement. Utilisez visudo, qui vérifie la syntaxe avant d'installer la nouvelle configuration. Pour les règles supplémentaires, il est généralement préférable d'utiliser des fichiers dédiés dans /etc/sudoers.d/, également créés ou vérifiés avec visudo

Exercice 2 — Privilèges

  1. Affichez la liste des groupes dont vous êtes membre. Êtes-vous dans le groupe qui donne accès à sudo ?
  2. Affichez le contenu de /etc/shadow avec les privilèges administrateur. Cette fois, ça fonctionne — pourquoi ?
  3. Trouvez, dans les journaux du système, la trace de la commande que vous venez d'exécuter avec sudo.
  4. Affichez la liste des commandes que vous êtes autorisé à exécuter avec sudo — il existe une option dédiée.
  5. Comparez le groupe d'administration sur srv-deb et sur srv-rhel.
Indice — question 3

Le journal principal du système, dont le nom diffère selon la famille — vous l'avez identifié au TP 1. Filtrez sur le mot sudo.


3. Créer et gérer des comptes

Commande Rôle
useradd nom Créer un compte (bas niveau, peu d'automatismes)
useradd -m -s /bin/bash nom Avec répertoire personnel et interpréteur
passwd nom Définir ou changer un mot de passe
usermod -aG groupe nom Ajouter le compte à un groupe supplémentaire
usermod -L nom / -U nom Verrouiller / déverrouiller un compte
userdel nom Supprimer le compte
userdel -r nom Supprimer le compte et son répertoire personnel

Pour les groupes :

Commande Rôle
groupadd nom Créer un groupe
groupdel nom Supprimer un groupe
gpasswd -a user groupe Ajouter un membre
gpasswd -d user groupe Retirer un membre

Le piège du -a

usermod -G groupe user remplace la liste des groupes secondaires de l'utilisateur.

Par exemple, si alice appartient actuellement à projet et sudo : bash usermod -G projet alice retire alice de sudo et de tous ses autres groupes secondaires. Pour ajouter un groupe sans modifier les appartenances existantes, utilisez : bash usermod -aG projet alice Le -a signifie « ajouter ».

Il est donc généralement indispensable lorsqu'on souhaite simplement ajouter une nouvelle appartenance à un utilisateur existant. À l'inverse, utilisez volontairement -G sans -a lorsque votre objectif est de remplacer entièrement la liste des groupes secondaires.

Debian fournit en plus d'adduser, un script interactif qui crée le compte, le répertoire, le groupe et demande le mot de passe en une fois. Dans les systèmes Red Hat, useradd est généralement l'outil standard utilisé pour cette tâche.

Un compte nouvellement créé avec un répertoire personnel reçoit une copie du contenu de /etc/skel. C'est notamment là que se trouvent les .bashrc et .profile que vous aviez découverts au TP 1 : modifier /etc/skel permet donc de définir les fichiers d'environnement par défaut des futurs comptes.

Exercice 3 — Créer des comptes

Sur srv-deb, créez l'environnement d'un petit service :

  1. Créez trois comptes : alice, bob et carol, chacun avec un répertoire personnel et bash comme interpréteur.
  2. Donnez un mot de passe à chacun.
  3. Vérifiez leurs UID. Sont-ils consécutifs ? Pourquoi ?
  4. Créez un groupe projet.
  5. Ajoutez alice et bob au groupe projet, mais pas carol.
  6. Vérifiez l'appartenance des trois comptes, sans ouvrir de session à leur place.
  7. Ouvrez une session en tant qu'alice depuis votre compte, vérifiez son identité, puis revenez à votre compte.
Indice — question 7

Une commande de deux lettres permet de changer d'utilisateur. Avec un tiret entre la commande et le nom, elle charge aussi l'environnement de la cible — ce qui n'est pas la même chose que sans.


4. Lire les permissions

C'est le cœur de la séance. Chaque fichier porte trois informations : un propriétaire, un groupe, et neuf bits de permission.

-rw-r--r-- 1 alice projet 1024 Oct  3 14:22 rapport.txt

Le premier caractère donne la nature de l'objet :

Caractère Nature
- Fichier ordinaire
d Répertoire
l Lien symbolique
c / b Périphérique caractère / bloc

Les neuf suivants se lisent par groupes de trois :

 rw-    r--    r--
 ↑      ↑      ↑
 user   group  others
 (propriétaire)  (groupe)  (tous les autres)

Chaque triplet combine trois droits :

Lettre Sur un fichier Sur un répertoire
r Lire le contenu Lister les entrées
w Modifier le contenu Créer, renommer, supprimer des entrées
x Exécuter Traverser le répertoire

Le piège des répertoires

Sur un répertoire, x signifie traverser le répertoire : il permet notamment d'accéder à un fichier ou sous-répertoire dont on connaît le nom, sous réserve des permissions de l'objet lui-même.

Un répertoire en r-- permet de lire la liste de ses entrées, mais sans x, on ne peut normalement pas accéder aux objets qu'il contient. À l'inverse, un répertoire en --x permet de traverser le répertoire et d'accéder à des objets dont on connaît le nom, mais ne permet pas d'en obtenir la liste avec ls.

Enfin, w sur un répertoire permet de modifier ses entrées (création, suppression, renommage), mais il faut généralement aussi x pour effectuer ces opérations. C'est pourquoi un utilisateur peut, par exemple, supprimer un fichier qu'il ne possède pas et dont il ne peut pas lire le contenu : les droits concernés sont ceux du répertoire, pas ceux du fichier.

La notation octale

Chaque droit vaut un nombre : r = 4, w = 2, x = 1. On les additionne par triplet.

Octal Droits Signification
7 rwx Tout
6 rw- Lecture et écriture
5 r-x Lecture et traversée
4 r-- Lecture seule
0 --- Rien

644 signifie donc rw-r--r-- : le propriétaire lit et écrit, les autres lisent. 755 signifie rwxr-xr-x, le classique des répertoires et des programmes.

Exercice 4 — Déchiffrer

Sans utiliser de machine, traduisez :

  1. drwxr-x--- en notation octale
  2. -rw------- en notation octale
  3. 640 en notation symbolique
  4. 777 en notation symbolique

Puis, sur srv-deb :

  1. Affichez les permissions de /etc/shadow et de /etc/passwd. Expliquez la différence à partir de ce que vous avez vu en partie 1.
  2. Affichez les permissions de /tmp. Un caractère inhabituel apparaît à la fin — lequel ? Notez-le, on y revient en partie 6.
  3. Trouvez, dans votre répertoire personnel, un fichier que le groupe peut lire et un que personne d'autre que vous ne peut lire.

5. Modifier les permissions

Commande Rôle
chmod 644 fichier Fixer les droits en octal
chmod u+x fichier Ajouter un droit au propriétaire
chmod g-w fichier Retirer un droit au groupe
chmod o= fichier Retirer tous les droits aux autres
chmod -R 755 dossier Appliquer récursivement
chown alice fichier Changer de propriétaire
chown alice:projet fichier Changer propriétaire et groupe
chgrp projet fichier Changer seulement le groupe

La notation symbolique combine une cible (u, g, o, a pour tous), un opérateur (+, -, =) et des droits.

Un utilisateur ordinaire ne peut pas changer le propriétaire d'un fichier. Cette opération nécessite généralement les privilèges de root (ou la capacité CAP_CHOWN).

Le umask

Quand vous créez un fichier, il ne naît pas avec tous les droits. Un masque retire par défaut certains bits.

umask        # afficher le masque courant
umask 022    # le modifier pour la session

Avec un masque à 022, un fichier créé avec les droits théoriques 666 reçoit 644, et un répertoire créé en 777 reçoit 755. Le masque retranche.

Exercice 5 — Modifier

Sur srv-deb, dans votre répertoire personnel :

  1. Créez un fichier secret.txt. Quels droits reçoit-il par défaut ? Affichez votre umask et vérifiez que le calcul correspond.
  2. Faites en sorte que vous seul puissiez le lire et l'écrire, et que personne d'autre n'y ait accès. Faites-le en octal.
  3. Créez un script bonjour.sh contenant une ligne affichant un message. Essayez de l'exécuter. Que se passe-t-il ?
  4. Rendez-le exécutable pour vous seul, en notation symbolique, puis relancez-le.
  5. Créez un répertoire prive, retirez-lui le droit de traversée pour le groupe et les autres, et vérifiez le résultat.
  6. Donnez secret.txt à alice et au groupe projet. Quelle commande faut-il, et pourquoi devez-vous être administrateur ?
Indice — question 3

Le fichier existe et son contenu est correct, mais il manque un droit. Regardez ses permissions et comparez au tableau de la partie 4.


6. Le répertoire partagé

Vous avez maintenant tout pour résoudre un problème réel : faire travailler plusieurs personnes dans un même répertoire.

Un simple chmod 770 sur un répertoire de groupe ne suffit pas. Sans SetGID, un fichier nouvellement créé reçoit généralement le groupe principal de son créateur. Avec SetGID sur le répertoire parent, il hérite du groupe du répertoire. Alice crée un fichier, il appartient au groupe alice, et Bob ne peut pas le modifier.

Trois bits spéciaux existent pour ces cas :

Bit Octal Sur Effet
SetGID 2000 Répertoire Les fichiers créés héritent du groupe du répertoire
Sticky 1000 Répertoire Seul le propriétaire d'un fichier peut le supprimer
SetUID 4000 Exécutable Le programme s'exécute avec les droits de son propriétaire
chmod 2770 /srv/projet   # rwxrws--- : SetGID actif
chmod 1777 /tmp          # rwxrwxrwt : Sticky actif

Ils apparaissent dans le listage à la place du x : s pour SetGID et SetUID, t pour le sticky. C'est le caractère que vous avez repéré sur /tmp à l'exercice 4.

SetUID, à manipuler avec précaution

Un exécutable SetUID appartenant à root s'exécute avec les droits de root, quel que soit celui qui le lance. C'est indispensable pour des commandes comme passwd, qui doit écrire dans /etc/shadow. C'est aussi l'un des vecteurs d'élévation de privilèges les plus exploités, et vous le retrouverez du côté offensif en master.

Exercice 6 — Le répertoire d'équipe

Objectif : alice et bob travaillent ensemble dans /srv/projet. Ils voient et modifient mutuellement leurs fichiers. carol n'a aucun accès. Personne ne peut supprimer le fichier d'un autre.

  1. Créez le répertoire /srv/projet.
  2. Attribuez-le au groupe projet, et donnez les droits complets au propriétaire et au groupe, rien aux autres.
  3. Connectez-vous en tant qu'alice, créez-y un fichier. Vérifiez à quel groupe il appartient. Est-ce ce que vous vouliez ?
  4. Corrigez le problème avec le bit adapté, puis recommencez le test. Vérifiez que bob peut maintenant modifier le fichier d'alice.
  5. Vérifiez que carol ne peut ni entrer dans le répertoire, ni en lister le contenu.
  6. En tant que bob, essayez de supprimer le fichier d'alice. Ça fonctionne — expliquez pourquoi à partir du tableau de la partie 4.
  7. Empêchez-le avec le bit adapté, et vérifiez.

Question 4 : les fichiers déjà créés

Poser le bit SetGID ne corrige pas les fichiers existants, seulement les suivants. Si votre test échoue, supprimez le fichier créé à la question 3 et recommencez.


7. Quand trois droits ne suffisent plus

Le modèle propriétaire/groupe/autres est simple, mais rigide : il ne permet pas d'accorder un droit à un utilisateur précis sans l'accorder à tout un groupe.

Les listes de contrôle d'accès lèvent cette limite.

Commande Rôle
getfacl fichier Afficher les ACL
setfacl -m u:carol:r fichier Donner la lecture à carol
setfacl -m g:autre:rw fichier Donner lecture et écriture à un groupe
setfacl -x u:carol fichier Retirer l'entrée de carol
setfacl -b fichier Supprimer toutes les ACL
setfacl -d -m u:carol:r dossier ACL par défaut, héritée par les nouveaux fichiers

Un fichier portant des ACL affiche un + à la fin de ses permissions dans ls -l. C'est le seul indice visible et c'est une source classique de confusion, parce que ls seul ne montre pas les droits réels.

Exercice 7 — Une exception

Le contexte change : carol doit pouvoir lire le travail de l'équipe, sans pouvoir le modifier, et sans être ajoutée au groupe projet.

  1. Sans toucher au groupe, donnez à carol le droit d'entrer dans /srv/projet et d'en lister le contenu.
  2. Donnez-lui le droit de lire les fichiers qui s'y trouvent déjà.
  3. Vérifiez, en tant que carol, qu'elle peut lire mais pas écrire.
  4. Faites créer un nouveau fichier par alice. carol peut-elle le lire ?
  5. Réglez le problème pour que toute création future soit automatiquement lisible par carol.
  6. Affichez les permissions du répertoire avec ls -l. Quel caractère signale la présence d'ACL ?

8. Le problème des identifiants qui divergent

Dernière partie de ce cour.

Vos deux serveurs ont chacun leurs comptes, créés indépendamment. Rien ne garantit qu'alice porte le même UID des deux côtés.

Tant que les machines sont isolées, cette différence n'a généralement aucune conséquence. Mais dès que des fichiers sont transférés ou accessibles depuis une autre machine, par exemple via NFS, lors du déplacement d'un disque ou après la restauration d'une sauvegarde, les propriétaires sont enregistrés et interprétés à partir des UID et GID numériques.

Le nom d'utilisateur associé à un UID est déterminé localement par chaque machine. Un même UID peut donc correspondre à des utilisateurs différents selon les systèmes.

Résultat : un fichier appartenant à l'UID 1001 sur une machine appartiendra à l'UID 1001 sur l'autre, qui ne correspond peut-être pas du tout à la même personne.

Ce n'est pas un cas d'école

C'est notamment une cause de problèmes de permissions avec NFS, de propriétaires incorrects après restauration de sauvegardes et de problèmes d'accès lors de migrations.

Vous rencontrerez ce problème dès la séance 5. Sa résolution sera abordée plus tard dans le cursus.

Exercice 8 — Constater la divergence

  1. Sur srv-rhel, créez les comptes bob et alice — dans cet ordre.
  2. Comparez les UID d'alice et de bob entre les deux serveurs. Correspondent-ils ? Si ce n'est pas le cas, expliquez pourquoi.
  3. Sur srv-deb, en tant qu'alice, créez un fichier et notez son propriétaire et son UID numérique.
  4. Copiez ce fichier vers srv-rhel en préservant les métadonnées, et regardez à qui il appartient une fois arrivé. Expliquez.
  5. Proposez, à l'écrit, deux façons de résoudre le problème pour deux machines. Laquelle tient encore avec cinquante machines ?
Indice — question 4

Une option de cp et une option de scp préservent propriétaire et permissions. Pour afficher l'UID numérique plutôt que le nom, ls dispose d'une option dédiée.

Indice — question 1

L'ordre de création est important : il détermine les UID attribués, et c'est précisément ce qui crée la divergence avec srv-deb.


9. Synthèse

Catégorie Commandes
Identité id, groups, who, last, su
Privilèges sudo, visudo
Comptes useradd, usermod, userdel, passwd
Groupes groupadd, groupdel, gpasswd
Permissions chmod, chown, chgrp, umask
ACL getfacl, setfacl
Fichiers clés /etc/passwd, /etc/group, /etc/shadow, /etc/skel, /etc/sudoers

Avant de partir

  • [ ] Je sais lire une ligne de /etc/passwd champ par champ
  • [ ] Je sais traduire des permissions entre notation symbolique et octale
  • [ ] Je sais expliquer ce que fait x sur un répertoire
  • [ ] Je sais créer un compte, un groupe, et rattacher l'un à l'autre
  • [ ] Je sais mettre en place un répertoire partagé qui fonctionne vraiment
  • [ ] Je sais accorder un droit à une seule personne sans toucher au groupe
  • [ ] Je sais expliquer pourquoi un fichier change de propriétaire en changeant de machine

Pour aller plus loin

Trouver les exécutables SetUID

Cherchez dans tout le système les fichiers portant le bit SetUID. Combien y en a-t-il ? Choisissez-en trois et expliquez pourquoi ils en ont besoin. C'est le premier réflexe d'un audit de sécurité — et du côté offensif, le premier endroit où l'on regarde.

Expirer un mot de passe

Trouvez la commande qui gère la durée de vie des mots de passe. Forcez alice à changer le sien à sa prochaine connexion, puis vérifiez en ouvrant une session à sa place.

Restreindre sudo

Créez dans /etc/sudoers.d/ un fichier autorisant bob à redémarrer un service précis, et rien d'autre. Vérifiez qu'il ne peut pas faire autre chose. C'est le principe du moindre privilège, que vous retrouverez à chaque séance jusqu'en M2.

Les groupes secondaires et la session

Ajoutez-vous à un nouveau groupe, puis affichez vos groupes avec groups et avec id. Le nouveau groupe apparaît-il tout de suite ? Trouvez pourquoi, et ce qu'il faut faire pour qu'il soit pris en compte.