Unix est multi-utilisateurs. Pour cette raison, tout le monde ne peut pas
tout faire, à part l'administrateur système (traditionnellement nommé
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
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 -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 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.
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 /etc/passwd (ou /etc/shadow), dans lequel seul
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.