La gestion classique des droits sous Linux est accessible et simple à mettre en place, chaque fichier appartient à un utilisateur et à un groupe unique ce qui permet d’avoir une bonne maîtrise du système. Cependant ce principe ne permet pas de couvrir l’ensemble des besoins en entreprise lorsqu’il est nécessaire d’accorder des privilèges à plusieurs utilisateurs ou groupes tiers sur un même fichier.
Les ACL (Acess Control List) permettent de résoudre ce problème, il est désormais possible d’accorder des permissions d’accès à la carte et de façon très précise, ce qui permet une gestion plus fine des autorisations tout en gardant un certain niveau de sécurité.
Support des ACL
A l’heure actuelle tous les noyaux devraient supporter les ACL. Pour le vérifier quand même il faut regarder s’ils sont présents dans dans le dossier /boot
:
# grep ACL /boot/config-$(uname -r) |
Vous devriez trouver plusieurs lignes de ce type et devraient toutes être égales à y (yes)
CONFIG_FS_POSIX_ACL=y |
Si vous travaillez sur un noyaux qui ne supporte pas les ACL, il faudra le recompiler.
Utilisation des commandes, généralités
Pour modifier les ACL d’un fichier on utilisera la commande setfacl
pour « set file access control lists » et pour les consulter la commande getfacl
pour « get file access control lists ».
Modifier des ACL : setfacl
Le manuel nous indique que la commande setfacl
s’utilise sous cette forme :
# setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file … |
Exemple :
# setfacl -m u:<utilisateur>:<droits> <fichier> |
Récupérer des ACL : getfacl
Le manuel nous indique que la commande getfacl
s’utilise sous cette forme :
# getfacl [-aceEsRLPtpndvh] file |
Nous allons voir en détails certaines de ces options.
Modifier des ACL
Nous avons 3 fichiers créés par l’utilisateur aline. Ces fichiers appartiennent à l’utilisateur et au groupe aline.
# ls -l |
Ajouter d’autres utilisateurs à un fichier
Pour ajouter un autre utilisateur à un fichier il faut utiliser setfacl
sous cette forme, en précisant l’option u
:
# setfacl -m u:Arya:rw- Stark_Family.txt |
Même chose en une seule ligne :
# setfacl -m u:Arya:rw-,u:Sansa:rw-,u:Bran:rw- Stark_Family.txt |
Si on consulte ce fichier avec un simple ls
on verra un ‘+’ à la fin des droits classiques :
# ls -l |
Ajouter d’autres groupes à un fichier
Pour ajouter d’autres groupes à un fichier il faut utiliser setfacl
sous cette forme, en précisant l’option g
:
# setfacl -m g:Hodor:r-- Stark_Family.txt |
La même chose en une seule ligne :
# setfacl -m g:Hodor:r--,g:JohnSnow:r-- Stark_Family.txt |
Résumé des droits du fichier
Si nous regardons les ACL du fichier Stark_Family.txt
nous voyons :
# getfacl Stark_Family.txt |
Ajouter à la fois les utilisateurs et les groupes
Pour ajouter à la fois des utilisateurs et des groupes sur un fichier :
# setfacl -m u:Daenerys:rwx,u:Viserys:r--,u:Rhaegar:rw-,g:Daenerys:rw- Targaryen_Family.txt |
Ce qui nous donne pour Targaryen_Family.txt
:
# getfacl Targaryen_Family.txt |
Exemple de problématique
Prenons un cas qui pose problème avec le système de droits génériques, j’ai un fichier IdeeCadeauPourDaenerys.txt
, qui regroupe les idées de cadeaux pour un anniversaire, ce fichier appartient au groupe amis mais Daenerys s’y trouve aussi :
# ls IdeeCadeauPourDaenerys.txt |
Pour que Daenerys ne puisse pas accéder à ce fichier secret il faudrait soit l’enlever du groupe amis mais cela risque d’impacter d’autres fichiers dont elle doit avoir accès et il n’est pas pratique non plus de créer un autre groupe exprès sans elle.
La solution serait de rajouter un ACL spécial qui va ôter les droits élémentaires rwx
sur le fichier. C’est en effet possible de spécifier une ACL qui va enlever à Daenerys son droit de lecture, même si elle appartient au groupe amis.
# setfacl -m u:Daenerys--- IdeeCadeauPourDaenerys.txt |
Ce qui nous donne Pour IdeeCadeauPourDaenerys.txt :
# getfacl IdeeCadeauPourDaenerys.txt |
Récursivité
Pour les répertories ET les fichiers
Le fonctionnement est le même qu’avec les droits classiques, il est possible d’utiliser la récursivité pour propager les droits à l’ensemble des fichiers et sous-dossiers contenus dans un répertoire, pour cela on utilise l’option -R
:
Pour que les ACL d’un utilisateur soient récursifs :
# setfacl -Rm u:<utilisateur>:<droits> <dossier> |
Pour que les ACL d’un groupe soient récursifs :
# setfacl -Rm g:<groupe>:<droits> <dossier> |
Seulement pour les dossiers (ou fichiers ayant déjà le droits x)
Il suffit dans les droits d’utiliser le droit X (majuscule) à la place du x (minuscule). Avec cette option le droit d’exécution ne s’appliquera que sur les dossiers et pas les fichiers.
Extrait du manuel de setfacl
:
execute only if the file is a directory or already has execute permission for some user (X)
Héritage des droits ACL
L’héritage des ACL est possible, il faut utiliser l’option -d
sur un dossier pour que tous les fichiers et dossier qui seront créés héritent de ces mêmes droits par défaut :
# setfacl -dm u:Tyrion:rw-,o:--- Lannister_Debts/ |
Ainsi tous les fichiers ou dossiers créés dans ce répertoire posséderont les ACL appliquées précédemment, ici Tyrion qui n’appartient pas au groupe admin pourra consulter et modifier les fichiers présents dans le dossier Lannister_Debts/
# ls -l Lannister_Debts/ |
Vérification d’un fichier du répertoire :
# getfacl Alcohols.txt |
Modifier les droits classiques avec les ACL
Il est également possible de modifier les droits classiques avec les commandes propes aux ACL, il suffit de ne pas préciser le groupe et/ou l’utilisateur :
# setfacl -m u::r<droits>,g::<droits>,o:<droits> fichier.txt |
qui est équivalent à :
# chmod ugo=<droit> fichier.txt |
Supprimer des ACL
Vous pouvez supprimer une ACL en particulier avec l’option -x
:
# setfacl -x u:JohnSnow,g:Hodor Stark_Family.txt |
Vous pouvez supprimer toutes les ACL (sauf celles par défaut) avec l’option -b
:
# setfacl -b test.txt |
Vous pouvez supprimer uniquement l’ACL par défaut avec l’option -k
. Pour un répertoire, cette option supprimera l’héritage par exemple.
# setfacl -k Repertoire/ |
Exemple avec le dossier Lannister_Debts/Alcohol/
:
# getfacl Lannister_Debts/Alcohol/ |
On retire l’ACL par défaut avec l’option -k
:
# setfacl -k Lannister_Debts/Alcohol/ |
Ce qui nous donne :
# getfacl Lannister_Debts/Alcohol/ |
Le Masque
Le masque indique les autorisations maximales accordées à un fichier ou dossier, les droits classiques (chmod) ne sont pas comptabilisés.
# getfacl Lannister_Debts/Alcohol/ |
Pour modifier le masque on utilise l’option m
:
# setfacl -m m:r-x Lannister_Debts/Alcohol/ |
Ce masque va bien évidement avoir un impact sur les droits classiques.
Concernant les ACL, les droits n’ont pas été modifiés, cependant les droits effectifs (qui s’appliquent) sont précisés après chaque utilisateur ou groupe. Pour les rétablir il suffira de ré-augenter le masque.
# getfacl Lannister_Debts/Alcohol/ |
Autre Exemple : on ajoute des ACL qui donnent tous les droits sur Hodor.txt pour Arya et Bran
# setfacl -m u:Arya:rwx,u:Bran:rwx Hodor.txt |
Puis avec chmod
on enlève certains droits sur le fichier Hodor.txt
# chmod ugo=r-- Hodor.txt |
On constate que les droits effectifs sont uniquement en Lecture, dû au masque.
# getfacl Hodor.txt |
Autre Exemple : on ajoute plusieurs users sur le fichierIdeesCadeauPourHodor.txt
# setfacl -m u:Sansa:rwx,u:Bran:rwx,u:JohnSnow:rwx IdeeCadeauPourHodor.txt |
Ce qui nous donne :
# getfacl IdeeCadeauPourHodor.txt |
On souhaite ensuite changer les droits pour tout le monde sans pour autant les faire un par un, changer le masque est ici utile :
# setfacl -m m::rw- IdeeCadeauPourHodor.txt |
Ce qui nous donne :
# getfacl IdeeCadeauPourHodor.txt |
Copier des ACL
L’utilisation de la commande cp
nécessite de préciser l’option -a
pour conserver les ACL
# cp -a Hodor.txt HoldTheDoor/Hodor.backup.txt |
La commande mv
quand à elle le fait automatiquement
# mv Hodor.txt HoldTheDoor/Hodor.backup2.txt |