Table des matières

ACL

Si l’on veut donner des droits à un utilisateur ou un groupe particulier, on pourra définir une ACL (« Access Control List ») sur le fichier ou le répertoire, et affecter les droits unitairement. Ceci se fait simplement avec la commande setfacl, de la manière suivante :

setfacl -m ACL fichier

ACL est l’ACL à affecter au fichier ou au répertoire fichier. Les ACLs sont constitués d’une liste d’entrées nommées des ACE (« Access Control Entries »). Les ACEs sont séparées par des virgules et définissent chacune un droit. Chacun de ces droits doit être spécifié de manière complète, en précisant la classe d’utilisateur sur lequel il porte avec un mot-clé (user pour l’utilisateur propriétaire, group pour les utilisateurs du groupe propriétaire, ou other pour les autres utilisateurs), le nom de l’utilisateur ou du groupe si nécessaire, et les droits affectés à cet utilisateur ou à ce groupe. Tous ces paramètres doivent être séparés par deux points (caractère ’:’). Par exemple, pour ajouter les droits d’écriture à l’utilisateur alfred sur le fichier exemple, vous pourrez utiliser la commande suivante :

setfacl -m user:alfred:w exemple

Si l’on ne spécifie aucun utilisateur avec la classe d’utilisateurs user dans une entrée, cette entrée se réfère automatiquement à l’utilisateur propriétaire du fichier ou du répertoire. De même, si l’on ne spécifie aucun groupe avec la classe d’utilisateurs group, l’entrée se réfère au groupe auquel le fichier appartient. Fixer ces entrées d’ACL sur un fichier avec ces deux syntaxes revient donc exactement à utiliser chmod avec les droits Unix classiques (à un détail près que l’on verra ci-dessous pour le groupe).

Les droits complets d’un fichier ou d’un répertoire peuvent être consultés avec la commande getfacl. Cette commande affiche en commentaire les informations sur l’objet auquel elle s’applique, à savoir son nom, son propriétaire et son groupe, à la suite d’un dièze (caractère ’#’). Suivent toutes les ACEs affectées à cet objet. Les droits Unix classiques sont lisibles directement avec les entrées user::, group:: et other:: respectivement pour l’utilisateur, les utilisateurs du groupe et les autres utilisateurs. Par exemple, si l’on affiche les ACLs associées au fichier exemple après la commande précédente, on obtient ceci :

# file: exemple
# owner: batman
# group: users
user::rw-
user:alfred:-w-
group::r--
mask::rw-
other::r--

Dès qu’une ACL nominative a été attribuée à un fichier, une ACL spéciale est créée automatiquement. Il s’agit de l’ACL mask, qui, comme son nom l’indique, définit un masque de droits complémentaires pour tous les utilisateurs et les groupes ajoutés nominativement à l’ACL. Pour ces utilisateurs, les droits effectivement accordés sont leurs droits respectifs, restreints aux droits présent dans le masque. Le masque permet donc de restreindre les droits de tous les utilisateurs de la classe group, au sens large.

Par exemple, si le masque contient les droits de lecture et d’écriture, et que l’utilisateur alfred dispose des droits de lecture et d’exécution sur le fichier, ses droits effectifs seront uniquement la lecture. Les droits effectifs sont indiqués en commentaire par getfacl pour les utilisateurs et les groupes s’ils ne sont pas égaux aux droits indiqués dans leurs entrées respectives.

Dès qu’il est défini, le masque remplace l’entrée du groupe du fichier pour les commandes classiques. Ainsi, dès qu’un masque est défini dans l’ACL d’un fichier, les changements de droits sur le groupe effectués avec la commande chmod ne modifient plus que le champ de masque. Cela peut surprendre dans certains situation. Par exemple, si l’entrée de l’ACL décrivant les droits du groupe du fichier ne donne aucun droit, les utilisateurs de ce groupe n’auront toujours aucun droit même après un chmod g+rwx sur le fichier. En effet, cette dernière commande ne modifie que le masque. Il est donc nécessaire d’ajouter les droits sur le groupe du fichier explicitement avec setfacl, de la manière suivante :

chmod g+rwx exemple
setfacl -m group::rwx exemple

La première commande modifie les droits sur le masque, et la deuxième ajoute les droits pour tous les utilisateurs du groupe.

Notez bien que le masque ne s’applique pas pour la détermination des droits du propriétaire et des utilisateurs de la classe other. Par ailleurs, lorsque l’on affiche les droits étendus d’un fichier avec l’option -l de la commande ls, les droits affichés pour le groupe du fichier sont les droits définis dans le masque lui-même (même si aucune entrée d’ACL ne donne complètement ces droits à un utilisateur ou à un groupe). Cela permet donc de voir directement les droits les plus forts qui pourraient être attribués sur ce fichier, ce qui est cohérent avec ce qu’attendent les outils Unix classiques.

Il est possible de supprimer toutes les entrées de l’ACL d’un fichier avec l’option -b de setfacl. Pour supprimer une entrée spécifique de l’ACL, vous devrez utiliser l’option -x. Cette dernière option ne permet pas de supprimer les entrées génériques pour le propriétaire et le groupe du fichier, ni celles des autres utilisateurs. Par exemple, pour retirer toutes les entrées définies précédemment sur le fichier exemple, on utilisera la commande suivante :

setfacl -b exemple

Vous pourrez toutefois constater que getfacl continue d’afficher les entrées génériques « user:: », « group:: » et « other:: ». Les répertoires disposent, en plus de leur ACL normale, d’une ACL par défaut. L’ACL par défaut d’un répertoire est celle qui est appliquée à tout nouveau fichier ou répertoire créés dans ce répertoire. De plus, les sous-répertoires héritent de l’ACL par défaut de leur parent. Les ACLs par défaut sont modifiables avec l’option -d de setfacl et sont affichées avec le préfixe default: par getfacl.

Note : Notez bien que de nombreux outils Unix classiques ne gèrent pas correctement la notion d’ACL (en particulier les gestionnaires de fichiers graphiques). La copie ou la modification d’un fichier peut donc provoquer la perte de son ACL, modifiant ainsi les droits des utilisateurs sur ce fichier. Les ACLs doivent donc être utilisées avec parcimonie et leur manipulation entourée du plus grand soin.

ls, cp et mv

Ces commandes doivent pouvoir lister, copier et déplacer les ACL en même temps que les fichiers. Pour les deux premières commandes, il faut préciser explicitement que l'on veut afficher/conserver les droits (ce qui est aussi le cas quand on ne travaille que sur les droits classiques) : ls -l, cp -a. La commande mv, quant à elle, préserve toujours les droits.

Quand les droits étendus ne peuvent être conservés (déplacement ou copie vers un système de fichier qui n'est pas configuré pour les recevoir ou utilisation d'une version de cp trop ancienne), un message d'avertissement en informe l'utilisateur. Par exemple :

setfacl -m u:luce:rw index.php
cp -a index.php /mnt/vfat
cp: preserving permissions for `/mnt/vfat/index.php': Opération non supportée

Noter qu'un fichier comportant une ACL qu'on veut lister par ls -l n'affiche qu'un + à la suite de ses permissions. Seule la commande getfacl, pour l'instant, permet d'avoir connaissance du détail. Par exemple :

setfacl -m u:khadija:rw /var/www/index.php
ls -l /var/www/index.php
 -rw-rw----+ 1 khadija www-data 5055 2005-10-16 18:53 /var/www/index.php

Avec -rw-rw—-+, on sait que le fichier possède une ACL (+), sans en connaître les constituants.

Sauvegarde des données

Sauvegarder des données dotées d'ACL nécessite :

À titre indicatif, tar et cpio et rsync ne le sont pas (à moins d'être patchés), star et pax le sont.

Pour contourner le problème de sauvegarde, il est possible d'écrire toutes les ACL dans un fichier qui servira de base à une restauration ultérieure :

getfacl --skip-base -R /dossier/dossier/ > fichier 

récupère les informations récursivement et les inscrit dans un simple fichier. La restauration se fait au moyen de

setfacl --restore=fichier

Il faut, pour qu'elle fonctionne, se placer à la racine contenant l'arborescence, en raison de la notation relative des chemins (d'où le message Removing leading '/' from absolute path names que l'on peut souvent lire en tapant des commandes avec ces programmes). Le chemin d'un répertoire /tmp/test est enregistré comme tmp/test : on doit donc, pour restaurer, lancer la commande depuis la racine de /tmp, c'est-à-dire /.

Par exemple : le répertoire /tmp/test contient trois fichiers à ACL. On sauvegarde les ACL avec

getfacl --skip-base -R /tmp/test > acl.acl

Pour restaurer, on se place à la racine (cd /) et on lance

setfacl --restore=acl.acl

Si on avait lancé la commande depuis /test, setfacl aurait renvoyé les erreurs :

setfacl: tmp/test: Aucun fichier ou répertoire de ce type
setfacl: tmp/test/a: Aucun fichier ou répertoire de ce type
setfacl: tmp/test/b: Aucun fichier ou répertoire de ce type
setfacl: tmp/test/c: Aucun fichier ou répertoire de ce type