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
sudoet 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 :
- Nom du compte
- Emplacement historique du mot de passe, aujourd'hui remplacé par
x - UID
- GID du groupe principal
- Description
- Répertoire personnel
- 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 :
- Affichez votre UID, votre GID et la liste de vos groupes.
- Affichez la ligne de
/etc/passwdcorrespondant àroot. Quel est son UID, et son répertoire personnel ? - Listez les comptes dont l'UID est supérieur ou égal à 1000. Combien en trouvez-vous ?
- Choisissez trois comptes dont l'UID est inférieur à 1000. À quel service correspondent-ils, d'après leur nom ?
- 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
- Affichez la liste des groupes dont vous êtes membre. Êtes-vous dans le
groupe qui donne accès à
sudo? - Affichez le contenu de
/etc/shadowavec les privilèges administrateur. Cette fois, ça fonctionne — pourquoi ? - Trouvez, dans les journaux du système, la trace de la commande que vous
venez d'exécuter avec
sudo. - Affichez la liste des commandes que vous êtes autorisé à exécuter avec
sudo— il existe une option dédiée. - Comparez le groupe d'administration sur
srv-debet sursrv-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 :
- Créez trois comptes :
alice,bobetcarol, chacun avec un répertoire personnel etbashcomme interpréteur. - Donnez un mot de passe à chacun.
- Vérifiez leurs UID. Sont-ils consécutifs ? Pourquoi ?
- Créez un groupe
projet. - Ajoutez
aliceetbobau groupeprojet, mais pascarol. - Vérifiez l'appartenance des trois comptes, sans ouvrir de session à leur place.
- Ouvrez une session en tant qu'
alicedepuis 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.
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 :
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 :
drwxr-x---en notation octale-rw-------en notation octale640en notation symbolique777en notation symbolique
Puis, sur srv-deb :
- Affichez les permissions de
/etc/shadowet de/etc/passwd. Expliquez la différence à partir de ce que vous avez vu en partie 1. - Affichez les permissions de
/tmp. Un caractère inhabituel apparaît à la fin — lequel ? Notez-le, on y revient en partie 6. - 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.
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 :
- Créez un fichier
secret.txt. Quels droits reçoit-il par défaut ? Affichez votreumasket vérifiez que le calcul correspond. - 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.
- Créez un script
bonjour.shcontenant une ligne affichant un message. Essayez de l'exécuter. Que se passe-t-il ? - Rendez-le exécutable pour vous seul, en notation symbolique, puis relancez-le.
- 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. - Donnez
secret.txtàaliceet au groupeprojet. 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 |
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.
- Créez le répertoire
/srv/projet. - Attribuez-le au groupe
projet, et donnez les droits complets au propriétaire et au groupe, rien aux autres. - Connectez-vous en tant qu'
alice, créez-y un fichier. Vérifiez à quel groupe il appartient. Est-ce ce que vous vouliez ? - Corrigez le problème avec le bit adapté, puis recommencez le test.
Vérifiez que
bobpeut maintenant modifier le fichier d'alice. - Vérifiez que
carolne peut ni entrer dans le répertoire, ni en lister le contenu. - En tant que
bob, essayez de supprimer le fichier d'alice. Ça fonctionne — expliquez pourquoi à partir du tableau de la partie 4. - 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.
- Sans toucher au groupe, donnez à
carolle droit d'entrer dans/srv/projetet d'en lister le contenu. - Donnez-lui le droit de lire les fichiers qui s'y trouvent déjà.
- Vérifiez, en tant que
carol, qu'elle peut lire mais pas écrire. - Faites créer un nouveau fichier par
alice.carolpeut-elle le lire ? - Réglez le problème pour que toute création future soit automatiquement
lisible par
carol. - 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
- Sur
srv-rhel, créez les comptesbobetalice— dans cet ordre. - Comparez les UID d'
aliceet debobentre les deux serveurs. Correspondent-ils ? Si ce n'est pas le cas, expliquez pourquoi. - Sur
srv-deb, en tant qu'alice, créez un fichier et notez son propriétaire et son UID numérique. - Copiez ce fichier vers
srv-rhelen préservant les métadonnées, et regardez à qui il appartient une fois arrivé. Expliquez. - 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/passwdchamp par champ - [ ] Je sais traduire des permissions entre notation symbolique et octale
- [ ] Je sais expliquer ce que fait
xsur 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.