Les ACL sous Linux

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 …
-m, --modify=acl modifier l'ACL(s) actuel de fichier(s)
-M, --modify-file=fichier lire l'entrée ACL à modifier du fichier
-x, --remove=acl supprimer les entrées de l'ACL des fichier
-X, --remove-file=fichier lire les entrées ACL à supprimer du fichier
-b, --remove-all supprimer toutes les entrées ACL étendues
-k, --remove-default supprimer l'ACL par défaut
--set=acl définit l'ACL du (des) fichier(s), remplaçant ainsi l'ACL courant
--set-file=file lit les entrées ACL à définir depuis un fichier
--mask recalcule les masques de droits en vigueur
-n, --no-mask ne pas recalculer les masques de droits en vigueur
-d, --default les opérations s'appliquent à l'ACL par défaut
-R, --recursive parcourir récursivement les sous-répertoires
-L, --logical suivre les liens symboliques
-P, --physical ne pas suivre les liens symboliques
--restore=fichier restaurer les ACL (inverse de « getfacl -R »)
--test mode test (les ACL ne sont pas modifiés)
-v, --version affiche la version et quitte
-h, --help affiche ce texte d'aide

Exemple :

# setfacl -m u:<utilisateur>:<droits> <fichier>
# setfacl -m g:<groupe>:<droits> <fichier>

Récupérer des ACL : getfacl

Le manuel nous indique que la commande getfacl s’utilise sous cette forme :

# getfacl [-aceEsRLPtpndvh] file
-a, --access affiche la liste de contrôle d’accès du fichier seule
-d, --default affiche la liste de contrôle d’accès par défaut seule
-c, --omit-header supprime les commentaires à l'affichage
-e, --all-effective affiche les droits effectifs
-E, --no-effective affiche les droits non effectifs
-s, --skip-base ignore les fichiers qui n'ont que les entrées de la base
-R, --recursive traitement récursif des sous-dossiers
-L, --logical parcours logique, suit les liens symboliques
-P, --physical parcours physique, ne suit les liens symboliques
-t, --tabular affiche les colonnes séparées par des tabulations
-n, --numeric affiche les identifiants numériques d'utilisateur et de groupes
-p, --absolute-names préserve le caractère « / » en début de chemin
-v, --version affiche la version et quitte
-h, --help affiche ce texte d'aide

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
-rw-rw-r-- 1 aline aline 0 juin 20 19:16 Lannister_Family.txt
-rw-rw-r-- 1 aline aline 0 juin 20 19:16 Stark_Family.txt
-rw-rw-r-- 1 aline aline 0 juin 20 19:16 Targaryen_Family.txt

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 
# setfacl -m u:Sansa:rw- Stark_Family.txt
# setfacl -m u:Bran: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
total 8
-rw-rw-r-- 1 aline aline 0 juin 20 19:16 Lanister_Family.txt
-rw-rw-r--+ 1 aline aline 0 juin 20 19:16 Stark_Family.txt
-rw-rwxr-- 1 aline aline 0 juin 20 19:16 Targaryen_Family.txt

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 
# setfacl -m g:JohnSnow: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 
# file: StarkFamily.txt
# owner: aline
# group: aline
user::rw-
user:Arya:rw-
user:Sansa:rw-
user:Bran:rw-
group::rw-
group:Hodor:r--
group:JohnSnow:r--
mask::rw-
other::r--

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 
# file: Targaryen_Family.txt
# owner: aline
# group: aline
user::rw-
user:Daenerys:rwx
user:Viserys:r--
user:Rhaegar:rw-
group::rw-
group:Daenerys:rw-
mask::rwx
other::r--

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
-rw-rw-r-- 1 aline amis 0 juin 22 17:01 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 
# file: IdeeCadeauPourDaenerys.txt
# owner: aline
# group: amis
user::rw-
user:Daenerys:---
group::rw-
mask::rw-
other::r--

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/
total 4
drwxrwx---+ 2 aline admin 4096 juin 21 19:25 Alcohols.txt
-rw-rw----+ 1 aline admin 0 juin 21 18:43 Army.txt
-rw-rw----+ 1 aline admin 0 juin 21 18:43 Boats.txt
-rw-rw----+ 1 aline admin 0 juin 21 18:43 Castles.txt
-rw-rw----+ 1 aline admin 0 juin 21 18:44 Blacksmiths.txt
-rw-rw----+ 1 aline admin 0 juin 21 18:43 Supplies.txt

Vérification d’un fichier du répertoire :

# getfacl Alcohols.txt 
# file: Alcohols.txt
# owner: aline
# group: admin
user::rw-
user:Tyrion:rw-
group::rw-
mask::rw-
other::---

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/
# file: Lannister_Debts/Alcohol/
# owner: aline
# group: aline
user::rwx
user:Tyrion:rwx
user:Cersei:rwx
group::rwx
group:Tyrion:rwx
mask::rwx
other::---
default:user::rwx
default:user:Jaime:rwx
default:group::rwx
default:mask::rwx
default:other::---

On retire l’ACL par défaut avec l’option -k :

# setfacl -k Lannister_Debts/Alcohol/

Ce qui nous donne :

# getfacl Lannister_Debts/Alcohol/
# file: Lannister_Debts/Alcohol/
# owner: aline
# group: aline
user::rwx
user:Tyrion:rwx
user:Cersei:rwx
group::rwx
group:Tyrion:rwx
mask::rwx
other::---

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/
# file: Lannister_Debts/Alcohol/
# owner: aline
# group: aline
user::rwx
user:Tyrion:rwx
user:Cersei:rwx
group::rwx
group:Tyrion:rwx
mask::rwx
other::---

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/
# file: Lannister_Debts/Alcohol/
# owner: aline
# group: aline
user::rwx
user:Tyrion:rwx #effective:r-x
user:Cersei:rwx #effective:r-x
group::rwx #effective:r-x
group:Tyrion:rwx #effective:r-x
mask::r-x
other::---

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 
# file: Hodor.txt
# owner: aline
# group: aline
user::r--
user:Arya:rwx #effective:r--
user:Bran:rwx #effective:r--
group::rwx #effective:r--
mask::r--
other::r--

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 
# file: IdeeCadeauPourHodor.txt
# owner: aline
# group: aline
user::rw-
user:Arya:rwx
user:Sansa:rwx
user:Bran:rwx
user:Hodor:---
user:JohnSnow:rwx
group::rw-
mask::rwx
other::r--

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 
# file: IdeeCadeauPourHodor.txt
# owner: aline
# group: aline
user::rw-
user:Arya:rwx #effective:rw-
user:Sansa:rwx #effective:rw-
user:Bran:rwx #effective:rw-
user:Hodor:---
user:JohnSnow:rwx #effective:rw-
group::rw-
mask::rw-
other::r--

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

Documentation

https://unix.stackexchange.com/questions/98007/how-do-i-set-permissions-recursively-on-a-dir-with-acl-enabled

> Partager <