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.

 
Sélectionnez

	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

 
Sélectionnez

	chmod XYZ 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).

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 :

 
Sélectionnez

	chmod 740 MonFichier

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
Sélectionnez

	chmod u+rw MonFichier
Retrait du droit de lecture du reste du monde
Sélectionnez

	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
Sélectionnez

chmod u+s Mon_Fichier

Nous observons alors :

 
Sélectionnez

ls -l Mon_Fichier
-rwsrw-r-- 1 sl amis 200 Oct 26 16:44 Mon_Fichier
Ajout du setgid
Sélectionnez

chmod g+s Mon_Fichier2

Nous observons alors :

 
Sélectionnez

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:

 
Sélectionnez

	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
Sélectionnez

/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 :

 
Sélectionnez

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
Sélectionnez

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.

 
Sélectionnez

'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
Sélectionnez

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 :

 
Sélectionnez

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
Sélectionnez

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
Sélectionnez

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
Sélectionnez

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
Sélectionnez

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.