Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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 getfacl et 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 support les 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

console
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

bash
# 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
OptionEffet
-m u:www-data:rXAjoute ou modifie (modify) l'entrée de l'utilisateur www-data
-m g:support:rXMême chose pour le groupe support
-RApplique à tout le contenu, récursivement
-x u:www-dataRetire l'entrée de www-data
-bRetire toutes les ACL (retour aux droits classiques)
-dAgit 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.

console
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 :

console
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=.

ACL de /srv/www/suiviMasqueDroits effectifsuser::rwxuser:www-data:r-xgroup::rwxgroup:support:r-xother::---mask::r-xroot (propriétaire) :rwxwww-data :r-xweb-dev : w filtrér-xsupport :r-xautres :---Le masque ne filtre ni le propriétaire ni les autres
Le masque filtre les entrées nommées et le groupe propriétaire : ici, il retire l'écriture à web-dev

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 :

bash
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éesPropriétaire, groupe, utilisateurs et groupes nommés, masque, autresAutant d'entrées que nécessaire, pour des comptes et des groupes
Droitsr, w, xUne quinzaine de droits fins (lecture, écriture, modification, contrôle total, prise de possession…)
RefusPas d'entrée de refusEntrées d'autorisation et de refus
HéritageACL par défaut, appliquée à la créationHéritage dynamique, propagé depuis le parent
Outilsgetfacl, setfaclOnglet 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 :

text
# 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ée group::rw- est filtrée par le masque r-- : le w disparaît.
  • www-data : r-- (entrée nommée, dans le masque).
  • mdiallo : r-- par group: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
bash
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 :

text
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.

text
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é ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Installer des logiciels avec apt et automatiser les mises à jourRevoir le sommaire du cours