Gestion des droits de fichiers : générique et ACLDate de publication : 15/11/2005 , Date de mise à jour : 20/12/2005
Par
Sylvain Luce (Katyucha) (Mes autres articles)
Ce tutoriel vous présente la gestion des droits de manière générique et en utilisant les Access Control Lists (ACL).
1. Avant-propos
2. Principe des droits sous Unix : version générique
2.1. Principe de base
2.2. Mise en oeuvre par un cas pratique
2.3. Cas spécial : setuid et setgid
2.4. Limite du système
3. Les ACL sous Linux (norme POSIX)
3.1. Apport
3.1. Pré-requis
3.2. Affectation des droits ACL
4. Conclusion
1. Avant-propos
Bien gérer ses fichiers et ses dossiers ne passe pas forcément par un bon archivage ou une bonne hériarchie. Il s'agit aussi de définir judicieusement leurs droits.
Qui peut le lire ? Qui peux écrire dedans ? Qui peut exécuter ce programme ? Qui peut accéder à tel répertoire ?
Nous allons donc voir dans cet article la gestion des droits de fichiers sous Linux (et Unix en général).
2. Principe des droits sous Unix : version générique
2.1. Principe de base
La gestion des droits de fichiers Unix s'effectue suivant 3 orientations : le droit de lecture (Read), le droit d'écriture (Write) et le droit d'exécution (eXecute).
- Le droit de lecture permet de lire le contenu d'un fichier.
- Le droit d'écriture permet la modification et la suppression d'un fichier.
- Le droit d'exécution sur des fichiers binaires ou shells permet de lancer le programme.
En version numérique :
Read = 4
Write = 2
eXecute = 1
Appliquées à un répertoire, ces définitions sont sensiblement différentes.
| Code d'accès |
Signification |
Fichier |
Répertoire |
| r |
Read |
Le fichier peut etre lu |
Le répertoire peut etre listé (exemple : obtenir les fichiers contenus dans ce répertoire par la commande ls) |
| w |
Write |
Le contenu du fichier peut être modifié ou ses attributs modifiés |
Dans le répertoire, on peut supprimer, créer ou modifier un fichier |
| x |
eXecute |
Le fichier peut etre exécuté |
On peut entrer dans ce répertoire, qui devient notre répertoire courant |
Chacun de ces droits sont attribués à 3 types de personnes : le propriétaire (owner ou UID), le groupe (group ou GID) et le reste du monde (other).
2.2. Mise en oeuvre par un cas pratique
Je dispose donc d'un fichier : MaCuisine.xml, contenant mes recettes de cuisine.
ls MaCuisine.xml
-rwxr-xr-- 1 sl amis 200 Oct 26 16:44 MaCuisine.xml |
Le premier - ne nous intéresse pas : il correspond au type de fichier. (par exemple d = répertoire)
Ensuite viennent 3 séries de trois lettres commençant par r:
rwx : Les droits du owner : sl => L'utilisateur sl a les droits de lecture, d'écriture et exécution du fichier.
r-x : Les droits du group : amis => Toute personne du groupe amis a les droits de lecture et exécution.
r-- : Les droits du reste du monde => Les autres ont juste le droit de lecture.
Si vous voulez changer les droits du fichier, la commande "chmod" est présente.
Elle s'utilise ainsi
 |
Quand vous modifiez les droits d'un répertoire et que vous désirez que tous les fichiers contenus dans celui-ci dispose des mêmes droits, utilisez l'option -R (pour récursive).
|
où X, Y et Z sont respectivement les droits (en numérique) du propriétaire, du groupe et du reste.
Comment calculer X ? En sommant les droits que vous voulez accorder.
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-x = 4 + 1 = 5
--- = 0
...etc
(Y et Z se calculent de la même manière)
Pour obtenir rwxr----- par exemple :
Si le calcul mathématique ne vous semble pas très parlant, il existe un moyen littéraire de donner les droits :
| Ajout de lecture et écriture au owner | chmod u+rw MonFichier |
| Retrait du droit de lecture du reste du monde | chmod o-r MonFichier |
En première lettre, vous insérez le type de personne à modifier. Puis avec le + ou -, vous décrivez respectivement, soit une opération d'ajout de droit, soit une opération de retrait.
Il ne reste plus qu'à donner les droits impactés par leurs lettres : r, w, x.
| Type de personne |
Lettre |
| Le owner du fichier |
u |
| Le groupe du fichier |
g |
| Le reste du monde |
o |
| Tout le monde |
a |
2.3. Cas spécial : setuid et setgid
Le setuid et le setgid sont deux attributs qui permettent de modifier les droits du processus créés par l'exécution du fichier.
Si le setuid est activé, quand le fichier est exécuté par un utilisateur, le processus a les mêmes droits que le propriétaire du fichier en cours d'éxécution.
Pour le setgid, vous avez donc deviné qu'il s'agissait d'un héritage des droits du groupe et non du propriétaire du fichier.
Pour les activer, il vous suffit d'ajouter ou supprimer le flag "s" sur le propriétaire ou le groupe.
| Ajout du setuid | chmod u+s Mon_Fichier |
Nous observons alors :
ls -l Mon_Fichier
-rwsrw-r-- 1 sl amis 200 Oct 26 16:44 Mon_Fichier |
| Ajout du setgid | chmod g+s Mon_Fichier2 |
Nous observons alors :
ls -l Mon_Fichier2
-rwxrwsr-- 1 sl amis 200 Oct 26 16:44 Mon_Fichier2 |
2.4. Limite du système
Cette solution simple et efficace renferme une grosse limite, celle de gérer les droits par utilisateur ou par groupe.
3. Les ACL sous Linux (norme POSIX)
3.1. Apport
Prenons un cas difficilement soluble avec le système de droits génériques pour illustrer :
Imaginons que je possède un fichier IdeeCadeauPourGeraldine.txt, qui regroupe les idées de cadeau pour un anniversaire:
ls IdeeCadeauPourGeraldine.txt
-rwxrw---- 1 sl amis 120 Oct 26 17:44 IdeeCadeauPourGeraldine.txt |
Malheureusement, Geraldine appartient au groupe "amis". Je ne peux pas me permettre de l'enlever du groupe juste pour un fichier, surtout qu'il va exister des impacts sur d'autres fichiers... Créer un autre groupe sans elle ? Que de complications !
La solution tient dans le rajout d'utilisateurs et/ou de groupes avec des droits élémentaires (rwx). Ainsi, je vais pouvoir spécifier une ACL qui va enlever à Geraldine son droit de lecture, même si elle appartient au groupe amis.
Cette amélioration s'implémente au fur et à mesure en standard dans les distributions Linux.
3.1. Pré-requis
Il y a deux pré-requis :
- Le noyau supporte les ACL.
- Le système de fichier est monté avec l'option acl :
| extrait de /etc/fstab | /dev/hda6 /home ext3 defaults,acl 0 2 |
3.2. Affectation des droits ACL
Il existe deux commandes essentielles pour gérer les ACL : setfacl et getfacl
Pour l'ensemble des exemples, nous partirons d'un fichier suivant :
sl@machine:/home/TEST$ ls -lrt
total 4
-rwxr-x--- 1 sl sl 209 2005-10-31 16:59 MaCuisine.xml |
setfacl vous permet de modifier la liste des droits ACL.
Vous pouvez en retirer comme en ajouter.
En premier lieu et avant tout, vous devez initialiser un "mask".
Si ce masque n'existe pas, vous ne pouvez pas rajouter de règles ACL.
Seules les opérations autorisées dans ce masque seront actives. Ainsi, si vous mettez un masque de rw-, aucune personne ne pourra effectuer l'opération d'exécution, même si vous l'autorisez.
À l'inverse, si le masque est "rwx" et que vous désirez empêcher l'ensemble des personnes concernées par le droit Write d'effectuer une opération d'écriture, il vous suffit de modifier ce masque en r-x.
| Ajout d'un masque total | setfacl -m m::rwx mon_fichier |
Partons de cette commande pour examiner la syntaxe de setfacl. L'argument -m permet de rajouter un ACL, à l'inverse -x l'enlève.
'type de la personne':'nom_de_la_personne':'droit en rwx' |
De plus, le deuxième argument possède cette structure
Il existe 2 types de personnes (en dehors du masque "m") : "u" pour un utilisateur et "g" pour un groupe.
Ainsi pour rajouter à l'utilisateur pm, les droits de lecture et écriture d'un fichier :
| Masque partiel | setfacl -m u:pm:rw- mon_fichier |
 |
Quand vous modifiez les droits d'un répertoire et que vous désirez que tous les fichiers contenus dans celui ci dispose des mêmes droits, utilisez l'option -R (pour récursive).
|
Quand je refais un ls -l de mon fichier, je me rends compte d'un petit changement :
sl@machine:/home/TEST$ ls -lrt
total 4
-rwxr-x---+ 1 sl sl 209 2005-10-31 16:59 MaCuisine.xml |
Le petit + indique que le fichier possède des droits ACL.
Pour visionner les droits ACL, on utilise la commande getfacl.
| Commande getfacl | sl@machine:/home/TEST$ getfacl MaCuisine.xml
# file: MaCuisine.xml
# owner: sl
# group: sl
user::rwx
user:pm:rw-
group::r-x
mask::rwx
other::--- |
Les lignes user::rwx, other::--- et group::r-x correspondent aux habituels droits Unix.
Vous retrouvez aussi votre masque : mask::rwx et l'autre user:pm:rw-
Voyons maintenant l'intérêt du masque. Mon désir : Supprimer pour tous les utilisateurs (en dehors de moi, le owner), le droit en écriture.
Je supprime le droit en écriture dans le masque.
| Modification de masque | sl@machine:/home/TEST$ setfacl -m m::r-x MaCuisine.xml
sl@machine:/home/TEST$ getfacl MaCuisine.xml
# file: MaCuisine.xml
# owner: sl
# group: sl
user::rwx
user:pm:rw- #effective:r--
group::r-x
mask::r-x
other::--- |
On remarque la ligne #effective, qui nous signale qu'après application du masque, les droits réels de pm sont juste : lecture.
Sans le masque, je devrais enlever pour chaque utilisateur (dans mon cas, il n'y en a qu'un , mais imagninez avec 25) le droit en écriture.
Si je désire enlever à pm tout droit ACL sur ce fichier :
| Suppression d'un user | sl@machine:/home/TEST$ setfacl -x u:pm MaCuisine.xml
sl@machine:/home/TEST$ getfacl MaCuisine.xml
getfacl MaCuisine.xml
# file: MaCuisine.xml
# owner: sl
# group: sl
user::rwx
group::r-x
mask::r-x
other::--- |
Et il redevient un utilisateur normal assujettit aux règles classiques.
Vous pouvez aussi supprimer l'ensemble des droits ACL d'un fichier.
| Plus d'ACL | sl@clickdroit:/home/TEST$ setfacl -b MaCuisine.xml
sl@clickdroit:/home/TEST$ getfacl MaCuisine.xml
# file: MaCuisine.xml
# owner: sl
# group: sl
user::rwx
group::r-x
other::--- |
4. Conclusion
La gestion des droits sous Unix sous sa forme générique doit être bien connue de tous, d'une part pour des questions de sécurité mais aussi de confidentialité, d'autre part parce qu'elle est fondamentale dans la manipulation/utilisation des fichiers.
Aujourd'hui, peu utilisé sous Linux et même sur les autres UNIX, les ACL sont pourtant d'une mise en oeuvre simple et tout à fait à porter de main pour n'importe quel administrateur ou utilisateur. Je vous conseille donc vivement de les mettre en place au moins dans un premier temps au niveau du /home, ce genre de droits est souvent prisé par les utilisateurs.
 
|