Les droits d’accès
Dans un système d’exploitation, les dossiers et les fichiers sont protégés par un système de droits d’accès. Les permissions accordées concernent le plus souvent un utilisateur ou un groupe défini.
Les droits d’accès classiques (à la Unix)
On distingue les types de permission suivants:
- read: le mode lecture (
r
) - write: le mode écriture permettant la modification (
w
) - execute: pour permettre l’exécution (
x
) pour un fichier. Mais pour un dossier, il permet de d’indiquer la possibilité de référencer les noms qu’il contient. - si la permission n’est pas accordée alors on la remplace par :
-
On peut constater d’autres symboles combinés avec les permissions standards mais qui concernent plutôt la nature des fichiers :
- lien: désigne si c’est un raccourci (
l
) - dossier: indique que c’est un dossier (
d
) - fichier: un fichier normal (
-
)
Sous linux, pour afficher les droits d’accès des dossiers ou des fichiers, on peut utiliser la commande ls -l
. On obtient une sortie contenant quelque chose comme -rwxrwxrwx
correspondant au masque des permissions dont la signification des lettres est expliquée ci-dessus. La première lettre désigne si c’est un fichier ou un dossier ou un lien, les 3 lettres suivantes définissent l’accès pour l’utilisateur, les 3 lettres suivantes pour le groupe, et les 3 dernières pour les autres. Voici un exemple d’exécution de cette commande (droit d’accès du fichier toto.txt pour l’utilisateur carole
et le groupe carole
) :
- 1ère lettre
-
: fichier - 3 lettres suivantes
rw-
: l’utilisateur carole pourra lire et modifier le fichier toto.txt mais pas l’exécuter. - 3 lettres suivantes
r--
: le groupe carole pourra lire le fichier toto.txt et non le modifier ni l’exécuter. - 3 dernières lettres
r--
: les autres ne pourra que lire le fichier toto.txt.
Les droits spéciaux
SUID
: utilisé pour les programmes (s
à la place dex
). Si le programme avec ce droit est exécuté, alors les droits du processus seront ceux du propriétaire du fichier et non ceux de celui qui exécute la commande. L’exemple le plus courant de son utilisation est avec le programmepasswd
. En effet,passwd
demande à modifier les fichiers/etc/passwd
et/etc/shadow
qui sont des fichiers appartenant àroot
et ne peuvent être modifiés que sous contrôle.
SGID
: utilisé pour les programmes et les dossiers (s
à la place dex
). CommeSUID
, une fois exécuté, le programme aura les même droits que le groupe auquel appartient le fichier et non pas ceux du groupe de l’utilisateur qui lance. Par contre s’il s’agit d’un dossier, alors les fichiers et sous-dossiers contenus appartiendront au groupe du dossier à leur création.Sticky bit
: appliqué à un fichier (t
à la place dex
), le sticky bit permet au processus de rester le plus longtemps possible en mémoire. En revanche pour un dossier, il interdit aux autres utilisateurs à part le propriétaire de supprimer le contenu du dossier. Un exemple simple est le répertoire/tmp
dont on souhaite à la fois qu’il contienne pour tout le monde des fichiers d’usage temporaire mais que chacun ne puisse supprimer que les siens.
Les ACLs c’est quoi ?
Les droits d’accès classiques sont restreints à ne s’appliquer que pour un seul utilisateur ou un seul groupe. C’est là qu’interviennent les ACLs. En effet, leur rôle est de peaufiner les droits standards en permettant de définir des droits avec une granularité aussi fine que l’on souhaite.
Voici la structure des commandes ordinaire pour définir une ACL :
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)>
Notation :
Les options -s
, -m
et -x
permettent respectivement d’attribuer, de modifier et de supprimer des permissions. Les lettres u
, g
et o
permettent de définir si la permission s’applique à un utilisateur, ou à un groupe ou autres (respectivement). Les parties entre <> sont à remplacer et permissions correspond aux même types que les droits d’accès classiques.
Pour connaître l’ACL d’un fichier ou un dossier, on utilise la commande :
getfacl fichier
Exemple de scénario d’utilisation
Reprenons notre exemple le fichier toto.txt
:
Ici, il n’y a rien d’extraordinaire. Pour le fichier toto.txt
, le propriétaire c’est carole
appartenant au groupe carole
. L’utilisateur pourra lire et écrire le fichier. Les membres du groupe ainsi que les autres ne peuvent que lire le fichier.
Disons maintenant qu’on a un nouvel utilisateur jojo
qui appartient au groupe carole
mais auquel on veut attribuer des privilèges d’écriture, de lecture et d’exécution sur le fichier toto.txt
.
Vérifions avec la commande test -x toto.txt
si notre modification fonctionne bien avec ce nous espérons c’est-à-dire que l’utilisateur carole
n’a pas le droit d’exécution sur le fichier toto.txt
et que l’utilisateur jojo
aura le droit d’exécution sur le fichier toto.txt.
Mais comment savoir si un fichier est configuré avec une ACL ? Quand on exécute la commande ls -l
si un “+
” est ajouté à la fin du masque comme par exemple pour le fichier toto.txt
alors ce fichier a des droits étendus (ACL) :
Si on change le propriétaire du fichier avec la commande chown
, cela n’affectera pas la configuration des ACLs.
ACL par défaut et héritage
Lors de la création d’un fichier ou d’un dossier, les permissions standards du répertoire parent sont transmis au fils mais pas les droits étendus (les ACLs). Pour y remédier, il est possible de définir nous mêmes des ACLs de défauts qui seront seront transmis à tous les fichiers fils ainsi que tous les sous-répertoires. Pour cela on ajoute le paramètre -d
à la commande setfacl
lorsque l’on affecte l’ACL du répertoire parent.
Illustration:
Soit un répertoire nommé monDossierParent
auquel on affecte une ACL pour restreindre l’accès pour l’utilisateur jojo
. On crée un sous répertoire nommé monDossierFils
.
Le sous-répertoire monDossierFils
n’a pas hérité des ACLs de son parent. Maintenant, on va ajouter une ACL par défaut à monDossierFils
pour que tous les descendants de monDossierFils
héritent de cette ACL.
Le fichier titi.txt
a hérité des ACLs de son dossier parent.