Tutoriel Linux

Setfacl sous Linux : donner un accès précis sans ouvrir les droits à tout le monde

Débutant5 min de lecture

Vous devez donner accès à un dossier à une personne, mais vous ne voulez ni changer son groupe principal, ni ouvrir les droits avec un chmod 777. C’est exactement le cas où une ACL devient utile. Avec setfacl, vous ajoutez une règle pour un utilisateur ou un groupe précis, tout en conservant le propriétaire et les permissions classiques du fichier.

Je vous conseille tout de même de lire l’ACL avant de la modifier. Une règle correcte peut sembler inopérante si un dossier parent bloque le passage ou si le masque ACL limite les droits effectifs.

Tux contrôle les accès de plusieurs utilisateurs à un dossier partagé avec des ACL Linux
Les ACL ajoutent une exception ciblée sans ouvrir les droits du dossier à tous les utilisateurs.

Vérifier les droits avant d’ajouter une ACL

Les commandes setfacl et getfacl sont fournies par le paquet acl. Vérifiez d’abord leur présence :

command -v setfacl
command -v getfacl

Sur Debian ou Ubuntu, installez-les avec :

sudo apt update
sudo apt install acl

Sur Fedora, Rocky Linux ou AlmaLinux :

sudo dnf install acl

Sur Arch Linux :

sudo pacman -S acl

Je pars ici d’un dossier /srv/rapports auquel l’utilisateur alice doit accéder. Commencez par relever le propriétaire, le groupe et les permissions classiques :

ls -ld /srv/rapports
namei -l /srv/rapports
getfacl -p /srv/rapports

namei -l affiche chaque composant du chemin. C’est important, car le droit x doit autoriser la traversée de tous les dossiers parents. getfacl -p affiche ensuite l’ACL complète sans retirer le slash initial du chemin.

Donner un accès précis avec setfacl

Pour accorder à alice la lecture et la traversée du dossier, testez d’abord la modification sans l’appliquer :

sudo setfacl --test -m u:alice:rx /srv/rapports

Si le résultat correspond à ce que vous attendez, appliquez la règle :

sudo setfacl -m u:alice:rx /srv/rapports
getfacl -p /srv/rapports

Dans u:alice:rx, u cible un utilisateur nommé, alice est le compte concerné et rx autorise la lecture du contenu du dossier ainsi que sa traversée. Pour un groupe, utilisez la même logique :

sudo setfacl -m g:audit:rx /srv/rapports

Cette ACL ne donne pas automatiquement accès aux fichiers déjà présents. Pour un fichier précis, accordez le droit nécessaire sur ce fichier :

sudo setfacl -m u:alice:r-- /srv/rapports/bilan.pdf
getfacl -p /srv/rapports/bilan.pdf

Si vous devez traiter toute une arborescence, sauvegardez-la d’abord, puis utilisez rX. Le X majuscule ajoute l’exécution uniquement aux dossiers et aux fichiers déjà exécutables :

sudo getfacl -R -p /srv/rapports > acl-rapports-backup.txt
sudo setfacl -R -m u:alice:rX /srv/rapports

Ne lancez pas une modification récursive sur /srv ou /var/www par facilité. Ciblez le dossier réellement concerné. Le même principe s’applique à chmod récursif sous Linux, qui peut casser rapidement les droits d’une application.

Comprendre le masque et les droits effectifs

Dès qu’une ACL contient un utilisateur ou un groupe nommé, elle possède aussi une entrée mask. Ce masque plafonne les droits du groupe propriétaire, des utilisateurs nommés et des groupes nommés.

getfacl -p /srv/rapports

Vous pouvez par exemple voir :

user:alice:rwx
mask::r-x
# effective:r-x

Dans ce cas, alice affiche rwx, mais le masque retire l’écriture. Ses droits effectifs sont donc r-x. Par défaut, setfacl recalcule le masque à partir des entrées concernées. Évitez l’option -n tant que vous n’avez pas une raison précise d’empêcher ce recalcul.

Un ls -l affiche généralement un signe + après les permissions lorsqu’une ACL étendue est présente. Attention aussi aux modifications ultérieures avec chmod : les bits du groupe correspondent au masque ACL et peuvent donc changer les droits effectifs. Relisez toujours l’ACL après avoir mélangé les deux outils.

Faire hériter les droits aux nouveaux fichiers

Une ACL d’accès règle le dossier actuel. Pour que les nouveaux fichiers et sous-dossiers héritent d’une règle, ajoutez une ACL par défaut sur le répertoire :

sudo setfacl -m d:u:alice:rwX /srv/rapports
getfacl -p /srv/rapports

Les lignes préfixées par default: s’appliqueront aux objets créés ensuite. Elles ne corrigent pas rétroactivement les fichiers existants. Vérifiez aussi l’umask du service qui crée les fichiers, puis créez un fichier de test avec le même compte ou le même service.

Sur un espace de travail partagé, demandez-vous d’abord si un groupe Linux classique serait plus simple à maintenir. Le guide sur la gestion des groupes sous Linux couvre ce cas. Une ACL est surtout intéressante pour ajouter une exception ciblée sans multiplier les groupes ou modifier les droits de tous les autres utilisateurs.

Tester l’accès et savoir revenir en arrière

Ne vous contentez pas de la sortie de getfacl. Testez avec le compte concerné :

sudo -u alice test -x /srv/rapports && echo acces-dossier-ok
sudo -u alice test -r /srv/rapports/bilan.pdf && echo lecture-fichier-ok

Pour retirer seulement l’entrée de alice :

sudo setfacl -x u:alice /srv/rapports
sudo setfacl -x u:alice /srv/rapports/bilan.pdf

Pour supprimer toutes les ACL étendues du dossier tout en gardant les entrées classiques propriétaire, groupe et autres :

sudo setfacl -b /srv/rapports

Pour retirer uniquement l’ACL par défaut :

sudo setfacl -k /srv/rapports

Enfin, le fichier créé avec getfacl -R permet une restauration complète de l’arborescence :

sudo setfacl --restore=acl-rapports-backup.txt

Conservez cette sauvegarde avec prudence : elle peut contenir les chemins, propriétaires, groupes et indicateurs spéciaux de l’arborescence. Sur NFS, CIFS ou un système de fichiers particulier, les ACL disponibles peuvent dépendre du serveur et des options de montage. Si setfacl renvoie Operation not supported, identifiez d’abord le système de fichiers avec findmnt -T /srv/rapports au lieu de contourner le problème avec des droits trop larges.

Les pages de manuel de setfacl, getfacl et acl détaillent les entrées, le masque et l’héritage. Pour un dossier où plusieurs utilisateurs écrivent mais ne doivent pas effacer les fichiers des autres, regardez aussi le fonctionnement du sticky bit sous Linux : il répond à un autre problème que les ACL.