Aller au contenu
Réussir mon BTS SIO

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

Par exemple

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, chown et chgrp ;
  • 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.

-rw-r-----1 root adm … access.logliens, propriétaire, groupe,taille, date, nomtypefichierpropriétairerootgroupeadmautrescomptes4 + 2 + 04 + 0 + 00 + 0 + 0640mode octal : 640Valeursr = 4lirew = 2écrirex = 1exécuter, traverser
Les droits d'un journal de nginx : 640, lecture et écriture pour root, lecture pour le groupe adm, rien pour les autres

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 :

DroitSur un fichierSur un dossier
r (lire, 4)Lire le contenuLister les noms qu'il contient (ls)
w (écrire, 2)Modifier le contenuCréer, renommer et supprimer des fichiers dedans
x (exécuter, 1)Lancer le fichier comme un programmeTraverser 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 w et x sur 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 droit x sur chaque dossier du chemin (/, /srv, /srv/www, /srv/www/suivi) et le droit r sur le fichier. Un x manquant au milieu du chemin donne « Permission non accordée », quels que soient les droits du fichier. La commande namei -l /srv/www/suivi/index.html affiche 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 :

ChiffreDroitsChiffreDroits
7rwx (4+2+1)3-wx (2+1)
6rw- (4+2)2-w-
5r-x (4+1)1--x
4r--0---

Les modes que tu écriras le plus souvent :

ModeLettresUsage typique
755rwxr-xr-xDossiers publics, programmes et scripts que tout le monde peut lancer
644rw-r--r--Fichiers lisibles par tous, modifiables par leur propriétaire (pages web, configurations non secrètes)
750rwxr-x---Dossier réservé au propriétaire et à son groupe
640rw-r-----Fichier lisible par le groupe seulement (journaux, configurations avec des secrets partagés)
700rwx------Dossier privé (~/.ssh)
600rw-------Fichier privé (clé privée SSH, ~/.ssh/authorized_keys)
777rwxrwxrwxÀ proscrire : tout le monde peut tout modifier

chmod, chown et chgrp

chmod change les droits, en octal ou en symbolique :

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

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

umaskNouveau fichier (666 moins le masque)Nouveau dossier (777 moins le masque)Usage
022644 (rw-r--r--)755 (rwxr-xr-x)Valeur par défaut de Debian
027640 (rw-r-----)750 (rwxr-x---)Serveur : rien pour les autres
077600 (rw-------)700 (rwx------)Tout est privé
002664 (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 :

BitValeurSur un fichier exécutableSur un dossierAffichage
setuid4Le programme s'exécute avec les droits de son propriétaireSans effets à la place du x du propriétaire : rwsr-xr-x
setgid2Le programme s'exécute avec les droits de son groupeLes fichiers créés dedans héritent du groupe du dossiers à la place du x du groupe : rwxrwsr-x
sticky1Sans effet aujourd'huiDans un dossier ouvert à tous, chacun ne peut supprimer que ses fichierst à la place du x des autres : rwxrwxrwt

Les trois se rencontrent sur tout système :

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

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

  1. rwxr-x---
  2. rw-rw-r--
  3. 600
  4. 751
  5. rwxrwsr-x
  6. 1777
Voir la réponseMasquer la réponse de l'exercice 1
  1. 750 : 4+2+1, 4+1, 0.
  2. 664 : 4+2, 4+2, 4.
  3. rw-------
  4. rwxr-x--x : 7 = rwx, 5 = r-x, 1 = --x.
  5. 2775 : setgid (2) devant 775.
  6. rwxrwxrwt : sticky (1) devant 777, 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 :

  1. dev-igarnier ;
  2. dev-hpetit, membre de web-dev ;
  3. www-data, le compte de nginx, qui n'est pas dans web-dev.
Voir la réponseMasquer la réponse de l'exercice 2
  1. dev-igarnier est propriétaire du fichier : lecture et écriture (rw-). Pour la suppression, il faut w et x sur le dossier : il n'est pas le propriétaire du dossier, il est membre de web-dev, qui n'a que r-x : il ne peut pas supprimer son propre fichier.
  2. dev-hpetit passe 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.
  3. www-data relè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

  1. Avec umask 027, quels droits a un fichier créé par touch ? Un dossier créé par mkdir ?
  2. Quel masque faut-il pour que les nouveaux fichiers soient en 660 et les nouveaux dossiers en 770 ?
  3. Avec umask 077, un script sauvegarde.sh est 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
  1. Fichier : 666 moins les bits de 027 donne 640 (rw-r-----). Dossier : 777 moins 027 donne 750 (rwxr-x---).
  2. 007 : on retire tout aux autres, rien au propriétaire ni au groupe. 666 donne 660, 777 donne 770.
  3. Non : un éditeur crée les fichiers avec la demande 666, donc 600 après le masque, sans droit d'exécution. ./sauvegarde.sh répond « Permission non accordée ». Il faut chmod u+x sauvegarde.sh (mode 700). On peut aussi lancer bash 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
bash
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é ?

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 : ACL Linux : setfacl et getfaclRevoir le sommaire du cours