mardi 1 mars 2016

Droits

Une phrase comme celle-ci
"Les droits sur /usr/bin sont du type 0755...."
reprise de l'article précédent a pu intriguer quelques néophytes.
Aussi, bien qu’il existe des centaines d’articles traitant des droits sur les fichiers en linux, je me suis finalement décidé à y mettre mon grain de sel.

Travaillant dans un (émulateur de) terminal, je génère à l'aide de la commande cat le fichier quisuisje contenant le texte :
echo Je suis $USER
Je termine par ENTER pour envoyer la ligne et CTRL+D pour signifier la fin du processus.
J'essaie d'exécuter le fichier avec
./quisuisje
mais évidemment ça ne fonctionne pas tant que je n'ai pas donné le droit d'exécution (chmod +x) :


J'examine (commande ls) quels sont les droits sur le fichier.
Ceux-ci

r droit en lecture
w droit en écriture
x droit en exécution

sont répartis en 3 catégories

  • droits du propriétaire du fichier (c'est moi : toto)
  • droits des membres du groupe indiqué. Ici ce sont les amis du propriétaire (membres du groupe toto)
  • droits des autres utilisateurs

Je ne veux pas que mes amis puissent modifier le fichier, aussi je leur enlève le droit en écriture sur le fichier :



La commande chmod, telle qu’utilisée ici, est suivie d’une ou de plusieurs lettres qui indiquent le ou les utilisateurs concernés :

u désigne le propriétaire
g les membres du groupe
o les autres

Vient ensuite ± puis le ou les droits ajoutés ou retirés selon le cas.
(Note: si rien ne précède +/-, la commande concerne tous les utilisateurs)

L'ensemble des droits sur un fichier constitue un nombre binaire et chaque droit attribué correspond à un bit de ce nombre binaire mis sur ON.
Les droits sur quisuisje correspondent au nombre binaire
000111101101
(Les 3 premiers bits sur OFF sont associés à des droits spéciaux dont il n'a pas été question jusqu’ici).

Je voudrais calculer le nombre hexadécimal correspondant.
Pour ce faire je regroupe les bits par série de 4 et je leur attribue les valeurs 8, 4, 2, 1.
J'annule ces valeurs si le bit est sur OFF, ensuite dans chaque groupe j'additionne les valeurs survivantes pour avoir le chiffre du nombre hexadécimal :

Le nombre décimal vaut :

1x256 + 14x16 + 13 = 493

Mais quel sens faut-il donner à la transformation en hexadécimal du nombre binaire correspondant aux droits ?
Aucun : ça n'a aucun sens. Il s'agit cependant d'un excellent entraînement pour passer maintenant à l'octal.
Les bits sont cette fois regroupés par séries de 3 avec les valeurs 4, 2, 1.
Pour le reste nous procédons de la même façon :


Le nombre décimal équivalent est évidemment inchangé :

7x64 + 5x8 + 5 = 493

Cette fois, ça a du sens.
Plutôt que d'adapter les droits sur quisuisje avec
chmod (g-w) quisuisje
on aurait pu les fixer directement :
chmod 755 quisuisje

Les droits rwx pour un dossier n'ont pas la même signification que pour un fichier :
r droit de lire le répertoire
w droit d'y ajouter ou d'y supprimer des fichiers
x droit d'y aller (dans le dossier)
Je crée dossier puis j’enlève les droits r et x aux utilisateurs qui ne sont ni toto (c’est moi) ni ses amis (membres du groupe toto) :


Au fait quels sont mes amis ?


Seulement riri.
Donc titine n’a pas le droit d’aller dans dossier :


Je rétablis le droit x pour tous. Cette fois titine peut aller dans dossier mais elle ne peut y lire le répertoire (il lui manque le droit r) :


Pour finir je donne à tous les droits rwx sur dossier (chmod 777 dossier).
Mais si un utilisateur à le droit de supprimer des fichiers, il peut tous les supprimer, même ceux qui ne sont pas à lui, même ceux pour lesquels il n'a pas le droit d'écriture!
Ainsi sur la copie d'écran qui suit, riri supprime le fichier hello appartenant à titine :


C'est ici qu'intervient le sticky bit :



S'il est activé pour un dossier dans lequel tous peuvent écrire, chacun ne pourra y supprimer que ces propres fichiers.

Activation :


Vérification:


Les droits sur le dossier sont maintenant décrit par la chaîne rwxrwxrwt et hello est à l'abri de toute suppression (sauf par son propriétaire titine ou toto propriétaire du dossier).
Le nom sticky bit provient d’un usage ancien de ce bit qui n’est pas celui expliqué ici.

Je peux aussi activer pour dossier le bit setgid :



Tout fichier créé par titine (comme salut) sera dorénavant caractérisé par le groupe toto (groupe du dossier de travail):


Comme riri appartient au groupe toto, il pourra donc modifier ce fichier.

Je veux maintenant faire machine arrière : remettre sur off les 2 bits spéciaux qui ont été activés :


Ça fonctionne pour le sticky bit (rwt devient rwx) avec chmod en mode numérique.
Pour le bit setgid, il faut utiliser chmod en mode symbolique.

Un dernier droit spécial n'a pas été évoqué jusqu'à présent.

Afin de pouvoir montrer sur une exemple ce dont il s'agit, je recopie l'exécutable whoami dans mon dossier test :


Comme je suis propriétaire de cette copie de whoami, je peux lui attribuer les droits que je veux.
Aussi j'active pour cet exécutable le bit setuid :



Pour ma copie de whoami lancée par titine, tout se passe comme si c'était moi (toto) qui l'avait lancée. Le whoami d'origine n'est évidemment pas impacté.
Pourquoi ne pas avoir avoir utilisé le fichier quisuisje pour ce qui précède?
Tout simplement parce que pour des raisons de sécurité le bit setuid est désactivé pour les fichiers scripts exécutables.