Page précédente Page suivante Table des matières

3. Les droits

Unix est multi-utilisateurs. Pour cette raison, tout le monde ne peut pas tout faire, à part l'administrateur système (traditionnellement nommé root), qui à le droit de lire et d'écrire tous les fichiers de tous les répertoires.

3.1 Utilisateurs et groupes

Chaque utilisateur est désigné de manière unique par son login (son "nom"). De plus, chaque utilisateur appartient à un ou plusieurs groupes. Par exemple, sous Red Hat Linux, chaque utilisateur est par défaut seul membre de son groupe personnel et membre du groupe users. Ainsi, sur ma machine, j'ai un utilisateur arnaud qui est membre des groupes arnaud et users. L'intêret d'avoir chaque utilisateur unique membre d'un groupe dépasse le cadre de cet exposé; pour ceux que ça intéresse, c'est expliqué dans le manuel d'installation de Red Hat, au chapitre 11.

3.2 Droits d'accès à un fichier

Un fichier ou un répertoire appartient toujours à un utilisateur et à un groupe. D'autre part, un fichier peut être accessible en lecture, en écriture et en exécution. Les permissions sont distinctes pour l'utilisateur propriétaire du fichier, pour le groupe propriétaire et pour le reste du monde. Ces permissions sont affichées par la commande ls quand on lui passe l'option -l:

-rw-r--r--  1 arnaud   users  1055740 Jun 13 16:42 toto

Cette ligne signifie que le fichier toto appartient à l'utilisateur arnaud et au groupe users, avec les droits -rw-r--r--. Les autres valeurs (1, 1055740 et la date) ne nous intéressent pas ici. Mais qu'est-ce que c'est donc que ces permissions -rw-r--r--? J'y viens. Le premier caractère représente le type de fichier: "-" pour un bête fichier normal, "d" pour un répertoire, "p" pour un tube, "b" ou "c" pour un périphérique, "l" pour un lien symbolique. Les trois suivants représentent les droits de l'utilisateur propriétaire du fichier. "r" représente le droit de lecture, "w" le droit d'écriture et "x" le droit d'exécution. Ici, "rw-" signifie que l'utilisateur arnaud peut lire et écrire dans le fichier, mais pas l'exécuter. Les trois caractères suivants représentent les permissions du groupe; ici, tous les membres du groupe users peuvent lire le fichier, mais pas y écrire. Enfin, les trois derniers caractères ont une signification analogue pour le reste du monde. Une petite nuance pour les répertoires: si un utilisateur a le droit d'"exécution" sur un répertoire, cela signifie qu'il peut s'y rendre avec la commande cd ou équivalent. Enfin, notez que pour effacer un fichier, il n'est pas nécessaire de pouvoir y écrire; il suffit d'avoir le droit d'écrire dans le répertoire le contenant.

Bon, c'est bien gentil tout ça, mais écrire 9 caractères pour représenter les droits (je ne compte pas le type), ça fait beaucoup. Alors on va essayer de concentrer un peu. Chacun des 9 derniers caractères représente une valeur vraie ou fausse. En informatique, on représente ça par un bit. On a donc trois groupes de trois bits, c'est à dire trois chiffres octaux (en base 8), représentés comme suit:

  rwx
  ||+-- 1
  |+--- 2
  +---- 4
Par exemple, un groupe "rwx" est représenté par 4+2+1=7. Un groupe "r--" par 4+0+0=4. Un groupe "--x" par 0+0+1=1. Ainsi, les permissions rw-r--r-- de notre fichier toto s'écrivent 644.

3.3 Droits spéciaux: setuid, setgid, sticky bit

Quand un fichier est exécutable par son propriétaire, il peut de plus être setuid. Cela signifie que lorsqu'il est exécuté, il l'est avec les droits de son propriétaire, et non avec ceux de l'utilisateur qui le lance. Par exemple, le programme passwd, qui permet à un utilisateur de modifier son mot de passe, est setuid root (c'est à dire qu'il est setuid et qu'il appartient à l'utilisateur root): il doit pouvoir écrire dans le fichier /etc/passwd (ou /etc/shadow), dans lequel seul root peut écrire.

De la même façon, un exécutable peut être setgid, et s'exécuter avec les droits du groupe auquel il appartient.

Enfin, un exécutable peut être "sticky" (on dit aussi "avoir le sticky bit positionné"): cela signifie qu'il reste en mémoire même après la fin de son exécution, pour pouvoir être relancé plus rapidement. Alors qu'un exécutable peut être déclaré setuid et setgid par son propriétaire, seul l'administrateur système peut positionner le sticky bit.

Pour les répertoires, la notion de setuid n'existe pas à ma connaissance. Les setgid et sticky bit prennent une signification différente. Quand un répertoire est setgid, tous les fichiers créés dans ce répertoire appartiennent au même groupe que le répertoire. C'est utilisé par exemple quand plusieurs personnes travaillent sur un projet commun: ils ont alors un groupe dédié à ce projet, et un répertoire setgid appartenant à ce groupe, et ils créent leurs fichiers dans ce répertoire avec les permissions 664: tout le groupe peut alors écrire n'importe quel fichier, vu que tous les fichiers appartiennent au groupe.

Voyons maintenant l'utilisation du sticky bit. Comme je l'ai écrit plus haut, un utilisateur qui a le droit d'écrire dans un répertoire peut effacer n'importe quel fichier de ce répertoire. Ca peut être très gênant par exemple pour le répertoire /tmp, dans lequel tout le monde a généralement le droit d'écrire. Pour y remédier, on positionne le sticky bit; ainsi, un utilisateur ne peut effacer que les fichier qui lui appartiennent.

Quand on écrit les permissions en octal, setuid, setgid et sticky bit sont représentés par une nouvelle série de 3 bits, qui se place avant les 3 autres séries: setuid=4, setgid=2, sticky=1. Ainsi, sur ma machine, le serveur de mail /usr/sbin/sendmail a les droits rwsr-sr-x (rwxr-xr-x, setuid, setgid); en octal, ça donne 6775.


Page précédente Page suivante Table des matières