Chapitre 612 minIntermédiaire
Droits Linux : chmod, chown, umask et bits spéciaux
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- lire les droits d'un fichier ou d'un dossier dans
ls -l; - convertir des droits en notation octale et inversement ;
- modifier droits, propriétaire et groupe avec
chmod,chownetchgrp; - prévoir les droits d'un nouveau fichier avec
umask; - utiliser le setgid et le sticky bit pour un dossier partagé.
4 exercices corrigés1 schéma
Les droits Linux disent, pour chaque fichier et chaque dossier, ce que peuvent faire son propriétaire, son groupe et tous les autres : lire (r), écrire (w) et exécuter ou traverser (x). Ce chapitre explique comment les lire dans ls -l, les calculer en notation octale (chmod 755, chmod 640), les modifier avec chmod, chown et chgrp, régler les droits des nouveaux fichiers avec umask, et utiliser les bits spéciaux setuid, setgid et sticky.
Propriétaire, groupe et autres
Chaque fichier a un propriétaire (un utilisateur) et un groupe. Ses droits sont donnés pour trois catégories :
- u (user) : le propriétaire ;
- g (group) : les membres du groupe du fichier ;
- o (others) : tous les autres comptes.
Le système regarde la première catégorie qui correspond, dans cet ordre, et s'arrête : si tu es le propriétaire, seuls les droits du propriétaire comptent, même si ceux du groupe sont plus larges. root passe outre les droits de lecture et d'écriture.
Ce que r, w et x veulent dire
Le sens des droits n'est pas le même pour un fichier et pour un dossier :
| Droit | Sur un fichier | Sur un dossier |
|---|---|---|
r (lire, 4) | Lire le contenu | Lister les noms qu'il contient (ls) |
w (écrire, 2) | Modifier le contenu | Créer, renommer et supprimer des fichiers dedans |
x (exécuter, 1) | Lancer le fichier comme un programme | Traverser le dossier : y entrer (cd) et atteindre ce qu'il contient |
Deux conséquences surprennent toujours :
- supprimer un fichier dépend des droits du dossier, pas de ceux du fichier : avec
wetxsur un dossier, on peut supprimer un fichier en lecture seule qui appartient à quelqu'un d'autre (sauf avec le sticky bit, plus bas) ; - pour ouvrir
/srv/www/suivi/index.html, il faut le droitxsur chaque dossier du chemin (/,/srv,/srv/www,/srv/www/suivi) et le droitrsur le fichier. Unxmanquant au milieu du chemin donne « Permission non accordée », quels que soient les droits du fichier. La commandenamei -l /srv/www/suivi/index.htmlaffiche les droits de chaque élément du chemin d'un coup.
La notation octale
Chaque droit a une valeur : r = 4, w = 2, x = 1. On additionne les droits de chaque catégorie, ce qui donne trois chiffres de 0 à 7 :
| Chiffre | Droits | Chiffre | Droits |
|---|---|---|---|
| 7 | rwx (4+2+1) | 3 | -wx (2+1) |
| 6 | rw- (4+2) | 2 | -w- |
| 5 | r-x (4+1) | 1 | --x |
| 4 | r-- | 0 | --- |
Les modes que tu écriras le plus souvent :
| Mode | Lettres | Usage typique |
|---|---|---|
755 | rwxr-xr-x | Dossiers publics, programmes et scripts que tout le monde peut lancer |
644 | rw-r--r-- | Fichiers lisibles par tous, modifiables par leur propriétaire (pages web, configurations non secrètes) |
750 | rwxr-x--- | Dossier réservé au propriétaire et à son groupe |
640 | rw-r----- | Fichier lisible par le groupe seulement (journaux, configurations avec des secrets partagés) |
700 | rwx------ | Dossier privé (~/.ssh) |
600 | rw------- | Fichier privé (clé privée SSH, ~/.ssh/authorized_keys) |
777 | rwxrwxrwx | À proscrire : tout le monde peut tout modifier |
chmod, chown et chgrp
chmod change les droits, en octal ou en symbolique :
chmod 640 /srv/journaux/export.csv # octal : rw-r-----
chmod u+x sauvegarde.sh # ajoute x au propriétaire
chmod g-w,o-rwx rapport.txt # retire w au groupe, tout aux autres
chmod u=rwx,g=rx,o= /srv/www/suivi # fixe exactement : 750
chmod -R g+rX /srv/www/suivi # récursif ; X = x seulement sur les dossiers
En symbolique, u, g, o et a (tous) désignent les catégories, + ajoute, - retire, = fixe. Le X majuscule est précieux en récursif : il ajoute le droit de traverser aux dossiers sans rendre exécutables tous les fichiers.
chown change le propriétaire (et le groupe), chgrp le groupe seul. Seul root peut donner un fichier à quelqu'un d'autre :
sudo chown dev-igarnier fichier.html # nouveau propriétaire
sudo chown root:web-dev /srv/www/suivi # propriétaire et groupe
sudo chown -R www-data:www-data /var/lib/suivi
sudo chgrp adm /srv/journaux/rapport.log
umask : les droits des nouveaux fichiers
Quand un programme crée un fichier, il demande en général les droits 666 (ou 777 pour un dossier ou un exécutable). Le masque umask retire des droits à cette demande : chaque droit présent dans le masque est enlevé.
umask | Nouveau fichier (666 moins le masque) | Nouveau dossier (777 moins le masque) | Usage |
|---|---|---|---|
022 | 644 (rw-r--r--) | 755 (rwxr-xr-x) | Valeur par défaut de Debian |
027 | 640 (rw-r-----) | 750 (rwxr-x---) | Serveur : rien pour les autres |
077 | 600 (rw-------) | 700 (rwx------) | Tout est privé |
002 | 664 (rw-rw-r--) | 775 (rwxrwxr-x) | Travail en équipe dans des dossiers de groupe |
Un umask n'est pas une soustraction chiffre à chiffre : il retire des bits. Avec un masque 027 et une demande 666, le groupe perd w (il garde r) et les autres perdent tout : 640. umask affiche le masque courant, umask 027 le change pour la session. Pour tous les comptes, la valeur se règle par la ligne UMASK de /etc/login.defs ; pour un service, par la directive UMask= de son unité systemd (chapitre 9).
Les bits spéciaux : setuid, setgid et sticky
Un quatrième chiffre, placé devant les trois autres, porte trois droits spéciaux :
| Bit | Valeur | Sur un fichier exécutable | Sur un dossier | Affichage |
|---|---|---|---|---|
| setuid | 4 | Le programme s'exécute avec les droits de son propriétaire | Sans effet | s à la place du x du propriétaire : rwsr-xr-x |
| setgid | 2 | Le programme s'exécute avec les droits de son groupe | Les fichiers créés dedans héritent du groupe du dossier | s à la place du x du groupe : rwxrwsr-x |
| sticky | 1 | Sans effet aujourd'hui | Dans un dossier ouvert à tous, chacun ne peut supprimer que ses fichiers | t à la place du x des autres : rwxrwxrwt |
Les trois se rencontrent sur tout système :
clambert@srv-web:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 118168 18 avril 2025 /usr/bin/passwd
clambert@srv-web:~$ ls -ld /tmp
drwxrwxrwt 12 root root 260 4 nov. 10:02 /tmp
passwd appartient à root et porte le setuid : un utilisateur ordinaire qui le lance obtient, le temps de la commande, le droit d'écrire dans /etc/shadow pour changer son mot de passe. /tmp est en 1777 : tout le monde y écrit, mais personne ne peut effacer les fichiers des autres.
Le setgid sur un dossier est l'outil des dossiers partagés : dans /srv/www/suivi, appartenant au groupe web-dev et en mode 2775, tout fichier créé par dev-igarnier ou dev-hpetit appartient automatiquement au groupe web-dev, au lieu du groupe principal de son créateur. Combiné à un umask 002, chacun peut modifier les fichiers de l'autre.
sudo chown root:web-dev /srv/www/suivi
sudo chmod 2775 /srv/www/suivi # rwxrwsr-x
Un S ou un T majuscule signale un bit spécial posé sans le x correspondant : rwSr--r-- est un setuid sur un fichier non exécutable, donc sans effet, et souvent le signe d'une erreur.
Exercices
Exercice 1 sur 4 Convertir des droits Réussi À revoir
Donne la notation octale ou les lettres :
rwxr-x---rw-rw-r--600751rwxrwsr-x1777
Voir la réponseMasquer la réponse de l'exercice 1
750: 4+2+1, 4+1, 0.664: 4+2, 4+2, 4.rw-------rwxr-x--x: 7 =rwx, 5 =r-x, 1 =--x.2775: setgid (2) devant775.rwxrwxrwt: sticky (1) devant777, le mode de/tmp.
Tu avais trouvé ?
Exercice 2 sur 4 Qui peut faire quoi ? Réussi À revoir
Dans /srv/www/suivi (mode drwxr-x---, propriétaire root, groupe web-dev), le fichier config.php a le mode -rw-r-----, propriétaire dev-igarnier, groupe web-dev. Pour chaque compte, dis s'il peut lire config.php, le modifier, et le supprimer :
dev-igarnier;dev-hpetit, membre deweb-dev;www-data, le compte de nginx, qui n'est pas dansweb-dev.
Voir la réponseMasquer la réponse de l'exercice 2
dev-igarnierest propriétaire du fichier : lecture et écriture (rw-). Pour la suppression, il fautwetxsur le dossier : il n'est pas le propriétaire du dossier, il est membre deweb-dev, qui n'a quer-x: il ne peut pas supprimer son propre fichier.dev-hpetitpasse par le groupe : il traverse et liste le dossier (r-x) et lit le fichier (r--), mais ne peut ni le modifier ni le supprimer.www-datarelève des « autres » :---sur le dossier, il ne peut même pas le traverser. Aucun accès, et nginx affichera une erreur 403. Il faudra lui donner l'accès en lecture, par un groupe ou une ACL (chapitre 7).
Tu avais trouvé ?
Exercice 3 sur 4 Calculer un umask Réussi À revoir
- Avec
umask 027, quels droits a un fichier créé partouch? Un dossier créé parmkdir? - Quel masque faut-il pour que les nouveaux fichiers soient en
660et les nouveaux dossiers en770? - Avec
umask 077, un scriptsauvegarde.shest créé avec un éditeur. Peut-on le lancer avec./sauvegarde.sh? Que faut-il faire ?
Voir la réponseMasquer la réponse de l'exercice 3
- Fichier :
666moins les bits de027donne640(rw-r-----). Dossier :777moins027donne750(rwxr-x---). 007: on retire tout aux autres, rien au propriétaire ni au groupe.666donne660,777donne770.- Non : un éditeur crée les fichiers avec la demande
666, donc600après le masque, sans droit d'exécution../sauvegarde.shrépond « Permission non accordée ». Il fautchmod u+x sauvegarde.sh(mode700). On peut aussi lancerbash sauvegarde.sh, qui ne demande que la lecture.
Tu avais trouvé ?
Exercice 4 sur 4 Un dossier partagé pour l'équipe web Réussi À revoir
Écris les commandes qui préparent /srv/www/suivi pour que : le dossier appartienne à root et au groupe web-dev ; les membres de web-dev y créent, modifient et suppriment des fichiers ; les fichiers créés appartiennent automatiquement au groupe web-dev ; les autres comptes n'y aient aucun accès.
Voir la réponseMasquer la réponse de l'exercice 4
sudo mkdir -p /srv/www/suivi
sudo chown root:web-dev /srv/www/suivi
sudo chmod 2770 /srv/www/suivi
2770 = setgid (les fichiers héritent du groupe web-dev) + rwxrwx--- (tout pour le propriétaire et le groupe, rien pour les autres). Pour que chacun puisse aussi modifier les fichiers des autres, les développeurs travaillent avec un umask 007 (ou 002), qui laisse le droit d'écriture au groupe. nginx (www-data) n'a plus accès : on lui donnera la lecture par une ACL au chapitre suivant, sans l'ajouter au groupe des développeurs.
Tu avais trouvé ?