Linux sans magie #11 — ACL : donner un droit à un utilisateur sans chambouler toutes les permissions

Comprendre les ACL Linux avec getfacl et setfacl : ajouter un droit ciblé à un utilisateur, lire le masque effectif et revenir proprement en arrière.

Jusqu’ici, nous avons appris à raisonner avec trois catégories :

propriétaire | groupe | autres

Ce modèle couvre énormément de situations.

Mais imaginons maintenant ceci : un fichier appartient à Alice, son groupe doit conserver ses droits actuels, et nous voulons simplement permettre à Bob de le lire.

Nous pourrions changer de groupe, ouvrir davantage les permissions classiques ou réorganiser la propriété du fichier. Mais ce serait modifier beaucoup de choses pour répondre à un besoin très précis.

C’est justement là que les ACL, pour Access Control Lists, deviennent utiles.

Sous Linux, elles permettent de définir des droits plus fins pour des utilisateurs ou des groupes nommés, en complément des permissions classiques.

Objectif

À la fin de ce lab, vous saurez :

  • reconnaître la présence d’une ACL ;
  • lire le résultat de getfacl ;
  • ajouter un droit à un utilisateur précis ;
  • comprendre pourquoi le masque ACL peut modifier les droits réellement obtenus ;
  • retirer proprement l’entrée ajoutée ;
  • distinguer permissions classiques et ACL.

Nous resterons volontairement sur les ACL d’accès simples.

Les ACL par défaut, qui permettent notamment de définir les droits hérités dans un répertoire, viendront plus tard.

Avant de commencer : un détail important

Pour démontrer réellement qu’un utilisateur A peut donner un accès spécifique à un utilisateur B, il faut disposer de deux comptes utilisateur.

Nous n’allons pas créer automatiquement un nouvel utilisateur système pour ce lab.

Si votre machine possède déjà un second compte de test, vous pourrez réaliser toute la manipulation. Sinon, vous pourrez tout de même exécuter les commandes d’inspection et comprendre le mécanisme. Les commandes utilisant le second utilisateur seront clairement identifiées.

Autre point : les commandes getfacl et setfacl doivent être disponibles sur votre système. Leur disponibilité peut dépendre de la distribution et de l’installation des outils ACL.

Testez :

command -v getfacl
command -v setfacl

Si les commandes existent, leur chemin est affiché, par exemple :

/usr/bin/getfacl
/usr/bin/setfacl

Lab — préparer un fichier classique

Placez-vous dans votre répertoire personnel :

cd

Créez notre lab :

mkdir linux-sans-magie-lab
cd linux-sans-magie-lab

Créons un fichier :

echo "Document confidentiel de lab" > document.txt

Regardez ses permissions :

ls -l document.txt

Le résultat exact dépendra de votre utilisateur et de votre umask.

Pour notre raisonnement, imaginons :

-rw-r----- 1 alice equipe 29 Sep 10 09:00 document.txt

Nous avons :

rw- | r-- | ---

Donc :

  • propriétaire : lecture et écriture ;
  • groupe : lecture ;
  • autres : aucun droit.

C’est le modèle que nous connaissons déjà.

Observer l’ACL actuelle

Exécutez :

getfacl document.txt

Vous devriez voir quelque chose de proche de :

# file: document.txt
# owner: alice
# group: equipe
user::rw-
group::r--
other::---

Cela ressemble presque exactement à nos permissions classiques, et c’est normal.

Les entrées correspondant au propriétaire, au groupe propriétaire et aux autres sont les entrées ACL de base. Une ACL devient réellement plus intéressante lorsqu’elle contient notamment un utilisateur ou un groupe nommé supplémentaire.

Ajouter un utilisateur précis

Supposons maintenant que nous disposions d’un second utilisateur appelé :

bob

Vérifiez d’abord qu’il existe réellement :

id bob

Si le compte n’existe pas, n’inventez pas un utilisateur et ne créez rien pour ce lab. Vous pouvez continuer la lecture sans exécuter les commandes concernant bob.

Si le compte existe, ajoutons-lui seulement le droit de lecture :

setfacl -m u:bob:r-- document.txt

La syntaxe peut se lire ainsi :

u:bob:r--

soit :

utilisateur : bob : lecture seule

setfacl -m sert à modifier l’ACL.

Vérifier ce qui vient de changer

Exécutez :

getfacl document.txt

Vous pourriez maintenant obtenir :

# file: document.txt
# owner: alice
# group: equipe
user::rw-
user:bob:r--
group::r--
mask::r--
other::---

Une nouvelle ligne apparaît :

user:bob:r--

Voilà notre ACL supplémentaire.

Nous n’avons pas changé le propriétaire, changé le groupe du fichier, ouvert les permissions aux autres, ni utilisé chmod 777.

Nous avons ajouté une règle spécifique pour Bob.

Et ls -l, que montre-t-il ?

Regardez à nouveau :

ls -l document.txt

Sur un système prenant en charge les ACL de cette manière, vous pourrez remarquer un + après les permissions :

-rw-r-----+ 1 alice equipe ... document.txt

Ce + indique que les droits ne se résument plus nécessairement aux trois blocs classiques affichés par ls -l.

C’est exactement la situation évoquée dans notre article sur Permission denied : ls -l peut être correct sans raconter toute l’histoire.

Comprendre le masque ACL

Vous avez probablement remarqué cette ligne :

mask::r--

Le masque ACL définit le maximum de droits effectifs pouvant être accordés à plusieurs catégories d’entrées, notamment les utilisateurs nommés, le groupe propriétaire et les groupes nommés.

Il ne limite pas de la même manière l’entrée du propriétaire du fichier ni l’entrée other.

Pour l’instant :

user:bob:r--
mask::r--

Bob demande r-- et le masque autorise r--. Les droits effectifs de Bob restent donc r--.

Provoquer une situation intéressante

Nous allons volontairement modifier le masque pour comprendre son rôle.

Exécutez :

setfacl -m m:--- document.txt

Puis :

getfacl document.txt

Vous pourriez voir :

user::rw-
user:bob:r--        #effective:---
group::r--          #effective:---
mask::---
other::---

Regardez attentivement :

user:bob:r--

semble toujours dire que Bob possède le droit de lecture.

Mais juste à côté :

#effective:---

nous indique que son droit réel est limité par le masque.

C’est une notion importante : une entrée ACL peut annoncer certains droits, tandis que le masque détermine les droits effectivement utilisables.

Restaurer le masque

Remettons un masque permettant la lecture :

setfacl -m m:r-- document.txt

Vérifiez :

getfacl document.txt

Bob devrait retrouver un droit effectif de lecture.

Que fait normalement setfacl avec le masque ?

Heureusement, vous n’avez généralement pas besoin de recalculer le masque manuellement à chaque modification.

Par défaut, setfacl recalcule l’entrée de masque lorsqu’une ACL étendue est modifiée, sauf comportement demandé explicitement par certaines options. L’option -n permet notamment d’empêcher ce recalcul automatique.

Pour notre série, le bon réflexe reste donc :

setfacl ...
getfacl ...

On modifie, puis on observe le résultat réel.

Tester avec le second utilisateur

Si vous disposez réellement du compte de test bob et d’une méthode normale pour ouvrir une session avec lui, vous pouvez tester la lecture du fichier.

Attention : le simple fait d’avoir une ACL sur document.txt ne garantit pas que Bob puisse atteindre ce fichier.

Nous avons appris dans le #9 que tous les répertoires du chemin doivent également être traversables.

C’est particulièrement important si votre lab se trouve dans votre répertoire personnel, qui peut être privé.

Par exemple :

ls -ld "$HOME"

Si Bob ne peut pas traverser votre répertoire personnel, l’ACL sur le fichier ne suffira pas.

Ce n’est pas un défaut des ACL. C’est simplement notre règle habituelle :

accès au chemin
+
droits sur l’objet final
=
opération possible

Pour cette raison, nous ne transformerons pas ce lab débutant en exercice multi-utilisateur complexe avec changement des permissions du $HOME.

Le point à retenir ici est le fonctionnement de l’ACL elle-même.

Retirer uniquement l’entrée de Bob

Nous voulons maintenant revenir en arrière.

Au lieu de supprimer toutes les ACL sans réfléchir, retirons précisément l’entrée que nous avons ajoutée :

setfacl -x u:bob document.txt

Puis :

getfacl document.txt

L’entrée user:bob:r-- doit avoir disparu.

L’option -x permet de supprimer des entrées ACL sélectionnées.

Et si je veux supprimer toutes les ACL étendues ?

setfacl fournit aussi :

setfacl -b document.txt

Cette option retire les entrées ACL étendues tout en conservant les entrées ACL de base correspondant au propriétaire, au groupe et aux autres.

Dans notre lab, nous préférons :

setfacl -x u:bob document.txt

parce qu’elle exprime exactement notre intention.

C’est le même principe que dans les articles précédents : corriger ou retirer le minimum nécessaire.

ACL ou chmod ?

Les deux outils ne répondent pas exactement au même problème.

chmod est idéal lorsque notre besoin correspond au modèle :

propriétaire
groupe
autres

Une ACL devient intéressante lorsque nous avons besoin d’une exception plus fine.

Par exemple :

propriétaire Alice : rw-
groupe equipe       : r--
utilisateur Bob     : r--
autres              : ---

Avec uniquement les trois classes traditionnelles, Bob devrait soit appartenir au bon groupe, soit profiter de permissions accordées plus largement.

L’ACL ajoute donc une granularité supplémentaire.

Attention : ACL et permissions classiques restent liées

Les ACL ne forment pas un système complètement indépendant des permissions traditionnelles.

Linux définit une correspondance entre certaines entrées ACL et les bits de mode du fichier. Lorsqu’une ACL possède un masque, la partie « groupe » visible dans les permissions classiques correspond notamment à ce masque plutôt qu’à la seule entrée du groupe propriétaire. Modifier les permissions avec chmod peut donc aussi modifier des éléments de l’ACL.

Cela explique pourquoi, une fois que des ACL sont présentes, il vaut mieux vérifier avec :

getfacl fichier

plutôt que de regarder uniquement :

ls -l fichier

Petit défi

Si vous possédez un second compte de test, repartez d’un fichier propre :

echo "rapport" > rapport.txt
chmod 600 rapport.txt

Vérifiez :

ls -l rapport.txt
getfacl rapport.txt

Votre mission : donner uniquement le droit de lecture au second utilisateur, sans modifier other et sans changer le propriétaire du fichier.

Ajoutez l’ACL :

setfacl -m u:bob:r-- rapport.txt

Puis vérifiez :

getfacl rapport.txt

Posez-vous trois questions : que possède le propriétaire ? Que possède Bob ? Que possèdent les autres ?

Enfin, retirez uniquement l’accès de Bob :

setfacl -x u:bob rapport.txt

Et vérifiez une dernière fois.

Aller plus loin : les ACL par défaut

Il existe une deuxième grande famille importante : les ACL par défaut.

Elles s’appliquent aux répertoires et peuvent servir de base aux ACL des nouveaux objets créés à l’intérieur. Les fichiers ordinaires n’ont pas de default ACL.

Vous voyez probablement le lien avec notre article précédent sur umask.

Nous avions appris :

programme demande un mode
→ umask retire certains droits
→ création

Avec une ACL par défaut sur le répertoire parent, le mécanisme de création devient plus riche : l’ACL par défaut participe à la détermination des droits du nouvel objet.

Nous ne mélangeons volontairement pas les deux sujets aujourd’hui. Ce sera une excellente suite.

Sécurité

Les ACL sont particulièrement intéressantes lorsqu’elles permettent d’éviter une ouverture excessive des permissions.

Si Bob doit lire un fichier, il est préférable de raisonner sur le besoin réel plutôt que de faire :

chmod 777 document.txt

Une ACL ne rend cependant pas automatiquement une configuration sûre.

Il faut toujours vérifier :

  • qui possède le fichier ;
  • quelles entrées ACL existent ;
  • quel masque s’applique ;
  • quels droits possèdent groupe et autres ;
  • si les répertoires du chemin autorisent l’accès.

Le principe reste le même : moindre privilège et vérification.

Nettoyage / rollback

Si vous avez utilisé le fichier document.txt :

setfacl -b document.txt

Cette commande retire les ACL étendues.

Vous pouvez vérifier :

getfacl document.txt

Supprimez ensuite le lab :

cd
rm -r linux-sans-magie-lab

Vérifiez simplement :

test ! -e ~/linux-sans-magie-lab && echo "Lab supprimé"

Résultat attendu :

Lab supprimé

Ce qu’il faut retenir

Les permissions Linux classiques restent notre base :

propriétaire | groupe | autres

Mais elles ne sont pas la limite du contrôle d’accès.

Une ACL permet notamment d’ajouter :

utilisateur précis → droits précis

Le trio de commandes à retenir est maintenant :

ls -l fichier
getfacl fichier
setfacl ...

ls -l donne la vue classique.

getfacl montre les règles détaillées.

setfacl permet de les modifier.

Et lorsque vous voyez un + après les permissions dans ls -l, vous savez désormais qu’il peut être utile d’aller regarder plus loin.

Linux n’a pas changé de logique. Nous avons simplement ajouté une couche supplémentaire à un modèle que vous connaissez déjà.

Références officielles

  • Linux man-pages — acl(5) : https://man7.org/linux/man-pages/man5/acl.5.html
  • Linux man-pages — getfacl(1) : https://man7.org/linux/man-pages/man1/getfacl.1.html
  • Linux man-pages — setfacl(1) : https://man7.org/linux/man-pages/man1/setfacl.1.html

Conclusion

Les ACL prolongent naturellement ce que nous avons appris sur rwx, chmod, Permission denied et umask.

Elles ne remplacent pas les permissions classiques : elles permettent simplement d’exprimer des exceptions plus précises.

La méthode reste la même : observer, modifier le minimum nécessaire, puis vérifier le résultat réel.