Chapitre 711 minIntermédiaire
ACL Linux : setfacl et getfacl
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- dire quand les droits classiques ne suffisent plus ;
- lire une ACL avec
getfaclet en déduire les droits effectifs ; - poser et retirer des entrées avec
setfacl; - faire hériter une ACL aux fichiers créés ensuite.
4 exercices corrigés1 schéma
Les ACL POSIX (Access Control Lists) ajoutent aux droits classiques des entrées pour des utilisateurs ou des groupes nommés : « www-data peut lire ce dossier », « le groupe support peut lire ce fichier », sans changer son propriétaire ni son groupe. Ce chapitre explique quand les droits rwx ne suffisent plus, comment lire et poser des ACL avec getfacl et setfacl, le rôle du masque, et les ACL par défaut qui s'héritent dans un dossier.
Quand les droits classiques ne suffisent plus
Les droits rwx ne connaissent qu'un propriétaire et un groupe. Le dossier /srv/www/suivi du chapitre précédent appartient au groupe web-dev, en 2770. Il faut maintenant que :
www-data(nginx) lise les fichiers, sans pouvoir les modifier ;- les techniciens du groupe
supportles lisent pour dépanner ; - les développeurs gardent le contrôle total.
Mettre www-data dans web-dev lui donnerait l'écriture : une faille dans le site permettrait de le réécrire. Ouvrir les droits aux « autres » donnerait l'accès à tous les comptes. Les ACL règlent le problème proprement.
Les ACL POSIX sont prises en charge par les systèmes de fichiers courants (ext4, XFS, Btrfs) sans option de montage. Les commandes sont dans le paquet acl : sudo apt install acl s'il manque.
Lire une ACL avec getfacl
clambert@srv-web:~$ getfacl -p /srv/www/suivi
# file: /srv/www/suivi
# owner: root
# group: web-dev
# flags: -s-
user::rwx
group::rwx
other::---
Sans ACL, getfacl affiche simplement les droits classiques : user:: (le propriétaire), group:: (le groupe propriétaire), other::. La ligne flags: -s- signale le setgid. L'option -p garde le / initial des chemins ; sans elle, getfacl le retire (avec un avertissement) pour que sa sortie puisse être réappliquée sous un autre dossier.
Poser une ACL avec setfacl
# www-data lit les fichiers et traverse les dossiers ; support aussi
sudo setfacl -R -m u:www-data:rX /srv/www/suivi
sudo setfacl -R -m g:support:rX /srv/www/suivi
| Option | Effet |
|---|---|
-m u:www-data:rX | Ajoute ou modifie (modify) l'entrée de l'utilisateur www-data |
-m g:support:rX | Même chose pour le groupe support |
-R | Applique à tout le contenu, récursivement |
-x u:www-data | Retire l'entrée de www-data |
-b | Retire toutes les ACL (retour aux droits classiques) |
-d | Agit sur l'ACL par défaut d'un dossier (voir plus bas) |
Le X majuscule a le même sens qu'avec chmod : le droit de traverser pour les dossiers, sans rendre les fichiers exécutables.
clambert@srv-web:~$ getfacl -p /srv/www/suivi
# file: /srv/www/suivi
# owner: root
# group: web-dev
# flags: -s-
user::rwx
user:www-data:r-x
group::rwx
group:support:r-x
mask::rwx
other::---
clambert@srv-web:~$ ls -ld /srv/www/suivi
drwxrws---+ 3 root web-dev 4096 4 nov. 10:21 /srv/www/suivi
Le + à la fin des droits dans ls -l signale qu'une ACL existe : c'est le seul indice, il faut alors lire getfacl.
Le masque
L'entrée mask:: est la limite maximale des droits accordés aux entrées nommées (user:www-data, group:support) et au groupe propriétaire. Un droit absent du masque n'est accordé à personne de ces catégories, même s'il figure dans leur entrée. setfacl recalcule le masque à chaque modification, comme l'union des droits de ces entrées.
Le piège : chmod sur le groupe modifie le masque, pas l'entrée group::. Après un chmod 750 /srv/www/suivi, le masque devient r-x, et getfacl signale les droits réellement effectifs :
clambert@srv-web:~$ sudo chmod 2750 /srv/www/suivi
clambert@srv-web:~$ getfacl -p /srv/www/suivi | grep -E 'group::|mask'
group::rwx #effective:r-x
mask::r-x
Le groupe web-dev n'a plus que la lecture effective : les développeurs ne peuvent plus créer de fichiers. Sur un dossier qui a des ACL, on change les droits du groupe avec setfacl -m g::rwx ou setfacl -m m::rwx, pas avec chmod g=.
Les ACL par défaut
Une ACL posée par setfacl -R ne concerne que les fichiers existants. Pour que les fichiers créés ensuite dans un dossier héritent des mêmes entrées, on pose une ACL par défaut sur le dossier, avec -d :
sudo setfacl -R -d -m u:www-data:rX /srv/www/suivi
sudo setfacl -R -d -m g:support:rX /srv/www/suivi
sudo setfacl -R -d -m g::rwx /srv/www/suivi
getfacl les affiche avec le préfixe default:. Un fichier créé dans le dossier reçoit ces entrées comme ACL ordinaire ; un sous-dossier les reçoit à la fois comme ACL ordinaire et comme ACL par défaut, et les transmet à son tour. Le résultat final reste limité par les droits que demande le programme qui crée le fichier : un fichier créé par un éditeur (demande 666) n'aura jamais le x.
Pour copier ou sauvegarder des fichiers en gardant leurs ACL : cp -a, rsync -A, tar --acls. getfacl -R /srv/www/suivi > acl.txt sauvegarde toutes les ACL dans un fichier texte, que setfacl --restore=acl.txt réapplique.
ACL POSIX et permissions NTFS
| ACL POSIX (Linux) | ACL NTFS (Windows) | |
|---|---|---|
| Entrées | Propriétaire, groupe, utilisateurs et groupes nommés, masque, autres | Autant d'entrées que nécessaire, pour des comptes et des groupes |
| Droits | r, w, x | Une quinzaine de droits fins (lecture, écriture, modification, contrôle total, prise de possession…) |
| Refus | Pas d'entrée de refus | Entrées d'autorisation et de refus |
| Héritage | ACL par défaut, appliquée à la création | Héritage dynamique, propagé depuis le parent |
| Outils | getfacl, setfacl | Onglet Sécurité, icacls, Get-Acl/Set-Acl |
Le calcul des droits effectifs NTFS combinés aux droits de partage est traité dans le cours Windows Server. Samba, qui partage des dossiers Linux avec des postes Windows, traduit les ACL NTFS en ACL POSIX (Services Linux).
Exercices
Exercice 1 sur 4 Lire une ACL Réussi À revoir
Voici l'ACL du fichier /srv/www/suivi/config.php :
# owner: dev-igarnier
# group: web-dev
user::rw-
user:www-data:r--
group::rw-
group:support:r--
mask::r--
other::---
Donne les droits effectifs de : dev-igarnier, dev-hpetit (membre de web-dev), www-data, mdiallo (membre de support), amercier (membre d'aucun de ces groupes).
Voir la réponseMasquer la réponse de l'exercice 1
dev-igarnier:rw-. Le propriétaire n'est pas filtré par le masque.dev-hpetit:r--. L'entréegroup::rw-est filtrée par le masquer--: lewdisparaît.www-data:r--(entrée nommée, dans le masque).mdiallo:r--pargroup:support.amercier: aucun droit (other::---).
Le masque r-- vient sans doute d'un chmod 640 fait après la pose des ACL. Pour rendre l'écriture au groupe : sudo setfacl -m m::rw /srv/www/suivi/config.php.
Tu avais trouvé ?
Exercice 2 sur 4 Donner un accès en lecture Réussi À revoir
Le service commercial (groupe commercial) doit pouvoir lire, depuis son compte sur srv-web, les exports déposés chaque nuit dans /srv/exports, dossier root:web-dev en 2770. Il ne doit rien pouvoir modifier ni supprimer, et les exports des nuits suivantes doivent lui être lisibles aussi. Écris les commandes et la vérification.
Voir la réponseMasquer la réponse de l'exercice 2
sudo setfacl -R -m g:commercial:rX /srv/exports # contenu existant
sudo setfacl -d -m g:commercial:rX /srv/exports # fichiers créés ensuite
getfacl -p /srv/exports
getfacl doit montrer group:commercial:r-x et default:group:commercial:r-x, avec un masque qui contient au moins r-x. Le groupe commercial n'a pas w sur le dossier : il ne peut ni créer ni supprimer de fichiers. Si /srv/exports contenait des sous-dossiers, la commande -d serait à passer avec -R pour qu'eux aussi transmettent l'ACL.
Tu avais trouvé ?
Exercice 3 sur 4 Ce qu'hérite un nouveau fichier Réussi À revoir
Le dossier /srv/www/suivi porte les ACL par défaut suivantes :
default:user::rwx
default:user:www-data:r-x
default:group::rwx
default:group:support:r-x
default:mask::rwx
default:other::---
dev-hpetit y crée index.html avec un éditeur, qui demande les droits 666. Quelle ACL aura le fichier, et quels seront les droits effectifs de www-data et du groupe web-dev ?
Voir la réponseMasquer la réponse de l'exercice 3
Quand un dossier a une ACL par défaut, le umask est ignoré : le fichier reçoit les entrées par défaut, limitées par les droits que demande le programme (rw-rw-rw-). Ces droits limitent l'entrée du propriétaire, le masque et les autres ; les entrées nommées sont recopiées telles quelles.
user::rw-
user:www-data:r-x #effective:r--
group::rwx #effective:rw-
group:support:r-x #effective:r--
mask::rw-
other::---
Le masque vaut rwx limité par rw-, soit rw-. www-data peut donc lire le fichier (son x est filtré, ce qui est sans importance pour une page web) ; le groupe web-dev peut lire et modifier (rw-), ce qui permet aux développeurs de travailler sur les fichiers les uns des autres. Les autres n'ont aucun droit.
Tu avais trouvé ?
Exercice 4 sur 4 Un accès qui disparaît Réussi À revoir
Après avoir posé setfacl -m u:www-data:rX /srv/www/suivi, Chloé Lambert tape sudo chmod 2700 /srv/www/suivi pour « fermer le dossier aux autres ». nginx affiche aussitôt des erreurs 403. Pourquoi ?
Voir la réponseMasquer la réponse de l'exercice 4
chmod 2700 met les droits du groupe à ---. Comme le dossier a une ACL, ces droits de groupe deviennent le masque : mask::---. Le masque plafonne l'entrée user:www-data:r-x, dont les droits effectifs tombent à ---. www-data ne peut plus traverser le dossier, d'où les 403. Les autres étaient déjà à --- : la commande n'était pas nécessaire. Correction : sudo setfacl -m m::rwx /srv/www/suivi (ou chmod 2770), puis vérifier avec getfacl.
Tu avais trouvé ?