Les droits sous linux : setuid, setgid et sticky bit

Petit point sur les droits Unix spéciaux que sont les setuid, setgid et le sticky bit.

Lorsque l’on découvre l’univers d’Unix/Linux/Mac, il y a certaines choses qui ont du mal à passer lorsque l’on débute. Je me souviens par exemple de la difficulté à apprendre le fonctionnement du système des droits sur les fichiers et plus particulièrement n’avoir rien compris des setuid, setgid et sticky bit. Je reparle de ça parce que je viens de perdre pas mal de temps avec un problème sur un développement PHP en cours, et il s’agissait du setgid qui n’était pas accordé à un répertoire. Bref, ce qui suit est un petit rafraîchissement.

Comme dit dans le sous-titre, les setuid, setgid et sticky bit sont des droits dits spéciaux, ils s’ajoutent aux droits classiques (lecture, écriture et exécution) et fonctionnent différemment suivant qu’on les applique sur un fichier ou un répertoire.

setuid

Lorsqu’un utilisateur exécute un programme, celui-ci se lance avec les droits de cet utilisateur. Je (utilisateur fabien) lance un script toto.sh, celui-ci aura les droits de fabien, normal. Mais il arrive que l’on veuille lancer une commande spéciale – en général dévolue à root – en tant que simple utilisateur, l’exemple flagrant étant la commande passwd (sous /usr/bin/passwd) qui est une commande root, mais tout un chacun peut pourtant changer son mot de passe avec cette commande. En regardant les droits sur passwd, on s’aperçoit que ce fichier est setuidé :

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 25708 sep 25  2007 /usr/bin/passwd

C’est-à-dire que lorsqu’un utilisateur lance la commande passwd, elle est lancée avec les droits du superutilisateur, ainsi l’écriture pourra se faire dans le fichier /etc/passwd et l’utilisateur aura changé son mot de passe sans être root. Sans le setuid, l’utilisateur n’aurait pas pu écrire dans le fichier /etc/passwd.
La notion de setuid n’existe pas pour les répertoires.

setgid

Le principe du setgid est le même que le setuid pour un fichier, mais bien entendu au niveau des droits du groupe. Un exécutable setgidé peut donc être lancé avec les droits du groupe auquel il appartient. Par contre, le comportement change lorsqu’il s’agit d’un répertoire. Lorsqu’un répertoire est setgidé, tous les fichiers créés dans ce répertoire appartiennent au même groupe que le répertoire. Ainsi, imaginons un répertoire conteneur, plusieurs personnes – Jean-Claude, André et Robert – travaillent dedans pour un même projet, il est bon de le setgider, de cette façon, les fichiers créés appartiendront tous au même groupe et non aux groupes de chaque utilisateur individuel.

Sticky bit

Lorsque l’on positionne le sticky bit, un exécutable restera en mémoire même lorsqu’il aura terminé son exécution, ainsi, il se lancera plus rapidement au prochain lancement. Cette pratique tend à être obsolète. Seul l’administrateur système peut positionner le sticky bit.

En ce qui concerne les répertoires, le sticky bit sert à sécuriser un fichier se trouvant dans un répertoire où tout le monde a les droits en écriture. Par exemple pour le répertoire /tmp (en général tout le monde a le droit d’écrire dedans), il serait gènant qu’un autre utilisateur puisse supprimer un de vos fichiers. Pour y remédier, on positionne le sticky bit sur ce répertoire, n’autorisant la suppression d’un fichier uniquement à son propriétaire.

Ecriture octale

Les permissions octales des setuid, setgid et sticky bit sont représentées par une série de 3 bits avant les 3 autres séries des permissions classiques :
setuid=4,
setgid=2,
sticky=1
Par exemple, un fichier ayant les droits rwsr-sr-x (rwxr-xr-x, setuid, setgid) donnera en octal 6755.

6 thoughts on “Les droits sous linux : setuid, setgid et sticky bit”

  1. Excellent article !
    J’ai enfin compris à quoi servent ces 3 droits spéciaux.

    Par contre, la notation octale des droits sur les fichiers/répsertoires reste encore pour moi très obscure.

    Puis-je vous suggérer de prendre ce thème pour pour prochain billet ?

  2. Bonjour je viens de lire (mieux vaut tard que jamais) votre article, qui est très bien et m’a pas mal aidé, j’ai par contre pu relever deux petites erreurs, la première en ce qui concerne (propriétaire,groupe,exécutable) à la 8eme ligne, je pense que vous vouliez dire soit (lecture,écriture,exécution), soit (propriétaire,group,autres), pour la 2nd erreur que j’ai cru relever, il s’agit de la notation octal des droits de la dernière ligne :
    rwsr-sr-x, en octal cela s’écrit 6755. Merci pour le temps que vous nous avez consacré, cordialement

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *