Les droits d'accès sous UNIX

Compendre et gérer les droits d'accès sous UNIX

Sur tout système d'exploitation multiutilisateur il existe une gestion plus ou moins avancée des droits d'accès aux fichiers. UNIX n'échappe pas à la règle.

Les droits

Les droits standard

Pour voir les droits sur un fichier ou un répertoire, il suffit d'exécuter la commande ls -l :

#ls -l
drwxr-r---   2 intgrrci   intgrrci        96 Dec 11 15:08 V29.1.0
drwxr-xr-x   2 root       root            96 Jan 11  2006 lost+found

Remarquons le premier groupe de lettres, de la forme suivante : drwxrwxrwx

Il faut décomposer ce groupe en 4, un groupe de 1 lettre, et 3 goupes de trois lettres.

Le première lettre indique le type de l'objet :

Lettre

Type

-

fichier ordinaire

d

répertoire (directory)

p

file nommée (named pipe)

l

lien symbolique

s

socket

c

fichier spécial caractère

b

fichier spécial bloc

n

fichier spécial réseau

Le premier groupe de trois lettres correspond au propritétaire (u: User), le second au groupe (g: Group), le troisième à tous les autres (o: Others).

Le premier caractère du groupe correspond aux droits de lecture (r: Read), le second d'écriture (w: Write), le troisième aux droits d'exécution (x: eXecute).

objet

droit

action

fichier

r

Droit d'accès au contenu du fichier en lecture uniquement

w

Droit d'écriture/modification du fichier ainsi que le droit de le supprimer

x

Droit d'exécution du fichier, dans le cas où il s'agit d'un exécutable (code compilé ou script shell, perl, php, etc.)

Répertoire

r

lecture du contenu (1er niveau)

w

Droit d'écriture/modification/suppression de fichiers dans le répertoire

x

Droit de navigation dans le répertoire

Dans notre exemple, prenons la ligne :

drwxr-xr-x   2 root       root            96 Jan 11  2006 lost+found

lost+found est un répertoire (première lettre = d), ayant pour droits d'accès lecture/écriture/exécution (rwx) pour le propriétaire , lecture et exécution (r-x) pour le groupe et lecture/exécution (r-x) pour les autres.

Remarque

Alors que l'exécution d'un fichier correspond à son exécution réelle (programme), l'exécution d'un répertoire permet seulement d'autoriser la navigation dans le répertoire, c'est à dire ouvrir le répertoire.

De la même façon, pour l'autre ligne :

drwxr-r---   2 intgrrci   intgrrci        96 Dec 11 15:08 V29.1.0

V29.1.0 est un répertoire (première lettre = d ), ayant pour droits d'accès lecture/écriture/exécution (rwx) pour le propriétaire , lecture (r--) pour le groupe et lecture (r--) pour les autres.

Les droits spéciaux

Dans certains cas, la commande ls -l peut retourner ceci :

#ls -l
drwxr-s---   2 intgrrci   intgrrci        96 Dec 11 15:08 V29.1.0
drwxr-s---   2 intgrrci   intgrrci        96 Jun 28  2004 admin
drwxr-s---   2 intgrrci   intgrrci        96 Jun 28  2004 bin
drwxrws---+  2 intgrrci   intgrrci      8192 Jan  9 09:59 conf
drwxr-sr-x   7 intgrrci   intgrrci      8192 Jan  8 09:43 data
drwxr-sr-x   2 intgrrci   intgrrci      8192 Nov  9 17:01 db
drwxrwsr-x+ 32 intgrrci   intgrrci      8192 Jan 11 09:45 livr
drwxrws---+  2 intgrrci   intgrrci    606208 Jan 15 12:41 logs
drwxr-xr-x   2 root       root            96 Jan 11  2006 lost+found
drwxr-s---   2 intgrrci   intgrrci        96 Jun 28  2004 macros
drwxrwsr-x   3 intgrrci   intgrrci      8192 Dec  3 14:28 scripts
drwxr-s---   3 intgrrci   intgrrci      8192 Dec  4 13:47 sql
drwxr-s---   2 intgrrci   intgrrci        96 Mar 10  2006 src

On peut être étonné de voir des motifs comme drwxrwsr-x. Que représente donc ce droit s ? Le s (ou S) représente un droit SGID ou le droit SUID en fonction de l'endroit où il est placé.

Si nous avons, par exemple rwsrwxrwx, il s'agit d'un droit SUID, si nous avons rwxrwsrwx, il s'agit d'un droit SGID.

SUID

Le droit SUID permet d'exécuter un fichier avec les droits du propriétaire du fichier. Habituellement, lorsqu'un utilisateur exécute un fichier, quelqu'il soit, l'exécution se réalise avec les droits de l'utilisateur (droits d'accès aux répertoires, création, écriture ou lecture de fichiers, etc.). Dans certains cas, il peut être utile que l'exécution se réalise avec les droits du propriétaire du fichier.

Le droit SUID est noté ---s------ dans le cas ou s remplace un - ou ---S------, dans le cas ou s cache un x.

Sur un répertoire, ce droit permet d'affecter les droits du propriétaire à tous les fichiers créés dans ce répertoire.

SGID

La même chose que SUID mais pour le groupe. i.e :

Le droit SGID permet d'exécuter un fichier avec les droits du groupe propriétaire du fichier. Habituellement, lorsqu'un utilisateur exécute un fichier, quelqu'il soit, l'exécution se réalise avec les droits de l'utilisateur (droits d'accès aux répertoire, création, écriture ou lecture de fichiers, etc.) Dans certains cas, il peut être utile que l'exécution se réalise avec les droits du groupe propriétaire du fichier.

Le droit SGID est noté ------s--- dans le cas ou s remplace un - ou ------S---, dans le cas ou s cache un x.

Sur un répertoire, ce droit permet d'affecter les droits du groupe propriétaire à tous les fichiers créés dans ce répertoire.

le sticky bit

Sur un fichier, ce droit indique que le fichier doit rester en mémoire vive, même si l'on en a plus besoin.

Sur un répertoire, ce droit empêche de supprimer des fichiers par une autre personne que son propriétaire.

Remarque

Si le sticky bit empêche de supprimer des fichiers, il n'empêche pas de les vider de leur contenu.

Le droit sticky bit est noté ---------t dans le cas ou t remplace un - ou ---------T, dans le cas ou t cache un x.

Affecter ou modifier les droits

Pour affecter ou modifier des droits, il y a plusieurs méthodes.

Méthode octale

La méthode octale affecte à chaque droit une valeur.

droit

valeur

r

4

w

2

x

1

s(uid)

4

s(gid)

2

t

1

Ces valeurs sont choisies de façon à ce que la somme donne une valeur unique permettant de conserver l'information sur les droits sélectionnés. Un exemple vaut mieux qu'un long discours :

Prenons les droits rwx--x-wx. Si l'on remplace chaque lettre par sa valeur octale : 421001021.

Faisons matenant la somme par groupe : 413.

413 correspond aux droits et, vous pourrez essayez, n'est décomposable qu'en rwx--x-wx. Les droits sont donc conservés, malgré leur somme.

Dans le cas des droits spéciaux, il suffit d'ajouter la valeur octal correspondante. Par exemple :

r-xrwsrwT correspond à r-xrw-rwx + --------t (le T masquant un x) et donc

r-xrw-rwx = 401420421 = 567

--------t = 1

la concaténation des deux : 1567

etc.

La notation octale vient du fait que la plus petite valeur est 0 et le plus grande 7. Elle permet dans ce cas, le codage numérique des droits d'accès :

valeur octale

droits

0

---

1

--x

2

-w-

3 (=1+2)

-wx

4

r--

5 (=4+1)

r-x

6 (=4+2)

rw-

7 (=4+2+1)

rwx

Remarque

La méthode octale est plus simple si l'on garde à l'esprit que r=4, w=2 et x=1. Ensuite, il suffit de faire la somme de la combinaison désirée pour obtenir le code octal à appliquer.

Ensuite, il faut faire la concaténation par catégorie (droits spéciaux/utilisateur/groupe/autres) et l'on obtient un résultat sur quatre positions. Cependant, l'usage fait que les droits spéciaux étant peu utilisés, ils sont souvent égaux à 0; par convention, on choisit de ne pas afficher les droits spéciaux s'ils sont égaux à 0. La notation se fait alors sur 3 positions.

Pour affecter ou modifier les droits d'un fichier ou répertoire, il suffit alors d'utiliser chmod :

chmod 677 fichier.txt

On affecte les droits 677 (rw-rwxrwx) au fichier fichier.txt. Les droits spéciaux étant égaux à 0, ils ne sont pas utilisés dans la notation.

Pour un répertoire, la commande est la même.

chmod 1677 fichier.txt

On affecte les droits 1677 (rw-rwxrwT) au fichier fichier.txt.

Méthode arithmétique

La méthode arithmétique consiste à partir d'un état et d'ajouter ou retrancher les droits qu'il faut ou ne faut pas. Par exemple :

chmod u+r fichier.txt

ajoute (+) au proriétaire du fichier (u) fichier.txt le droit de lecture (r).

chmod g-wx fichier.txt

retire (-) au groupe (g) propriétaire du fichier fichier.txt les droits d'écriture (w) et d'exécution (x).

Etc.

Les ACL

Les ACL sont notés par un + sur les droits d'accès. Par exemple :

drwxrws---+  2 intgrrci   intgrrci      8192 Jan  9 09:59 conf
drwxrwsr-x+ 32 intgrrci   intgrrci      8192 Jan 11 09:45 livr
drwxrws---+  2 intgrrci   intgrrci    606208 Jan 15 12:41 logs

Les ACL (Access Control List) permettent d'avoir des droits d'accès plus évolués. En effet, avec les droits standard, il n'est pas possible par exemple de traiter une personne extérieure au groupe comme faisant partie du groupe, juste pour un fichier ou un répertoire. Les exceptions ne sont donc pas permises.

Les ACL permettent d'ajouter des permissions plus exceptionnelles de façon simple.

En fonction de l'UNIX employé, les ACL seront déjà installés ou pas. Sous FreeBSD, par exemple, il faudra recompiler le noyau pour disposer de cette fonctionnalité.

Les ACL sont gérés par les deux commandes setfacl (affecter) et getfacl (afficher).

La syntaxe de base de setfacl est :

setfacl <-s/-m/-x> u:<utilisateur>:<permissions> <fichier(s)>
setfacl <-s/-m/-x> g:<groupe>:<permissions> <fichier(s)>
setfacl <-s/-m/-x> o:<permissions> <fichier(s)>

Les paramètres les plus utiles sont -s (attribuer), -m (modifier), et -x (supprimer). u (utilisateur), g (groupe) et o (autres) sont les sujets classqiues des opérations des droits d'accès. Les permissions restent les permissions classiques sous Unix à savoir r, w et x.

Il y a toutes les options suivantes :

-s, --set=aclset the ACL of file(s), replacing the current ACL
-S, --set-file=file read ACL entries to set from file
-m, --modify=acl modify the current ACL(s) of file(s)
-M, --modify-file=file read ACL entries to modify from file
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
-b, --remove-all remove all extended ACL entries
-k, --remove-default remove the default ACL
    --maskdo recalculate the effective rights mask
-n, --no-mask don't recalculate the effective rights mask
-d, --default operations apply to the default ACL
-R, --recursive recurse into subdirectories
    --post-order visit subdirectories first
-L, --logical logical walk, follow symbolic links
-P, --physical physical walk, do not follow symbolic links
    --restore=file restore ACLs (inverse of `getfacl -R')
    --test test mode (ACLs are not modified)
-v, --version print version and exit
-h, --help this help text

Exemples

setfacl -s g:groupe1:r fichier.txt

donne au groupe groupe1 le droit de lecture sur le fichier fichier.txt.

setfacl -R -m u:jean:rwx /usr/local/www

modifie les permissions de l'utilisateur jean sur le répertoire /usr/local/www et ces permissions s'appliquent également aux sous-dossiers de ce répertoire.

setfacl -b /etc/fichier

retire toutes les permissions sur le fichier /etc/fichier.

getfacl /tmp | setfacl -S- /etc/fichier

donne les mêmes permissions à /etc/fichier qu'à /tmp.

Exemples

Autoriser à écrire dans un répertoire sans pouvoir supprimer le répertoire

Ecrire dans un répertoire : droit w sur ce répertoire.

Ne pas pouvoir effacer ce répertoire : la suppression étant associée au droit w, il faut supprimer ce droit au répertoire père du répertoire en question.