Droits et ACLs sous Linux

Posté le 15 novembre 2015

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

Principe des droits sous Unix : version générique

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

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

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 :

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

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

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

Limite du système

Cette solution simple et efficace renferme une grosse limite, celle de gérer les droits par utilisateur ou par groupe.

Les ACL sous Linux (norme POSIX)

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.

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

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.

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

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.