35.3. Gestion des ACL

Tableau 35.1, « Types d'éléments d'ACL » résume les six types possibles d'éléments d'ACL, dont chacun définit des droits d'accès pour un utilisateur ou un groupe d'utilisateurs. L'élément owner (propriétaire)définit les droits d'accès de l'utilisateur propriétaire du fichier ou du répertoire. L'élément owning group (groupe propriétaire) définit les droits d'accès du groupe propriétaire du fichier. Le super-utilisateur peut changer le propriétaire ou le groupe propriétaire avec chown ou chgrp, auquel cas les éléments propriétaire et groupe propriétaire font référence au nouveau propriétaire et groupe propriétaire. Chaque élément named user (utilisateur nommé) définit les droits d'accès de l'utilisateur spécifié dans le champ qualificateur de l'élément, qui se trouve dans le champ du milieu sous la forme du texte présenté dans Tableau 35.1, « Types d'éléments d'ACL ». Chaque élément named group définit les droits d'accès du groupe spécifié dans le champ qualificateur de l'élément. Seuls les éléments utilisateur nommé et groupe nommé ont un champ qualificateur qui n'est pas vide. L'élément other (autre) définit les droits d'accès de tous les utilisateurs.

L'élément mask limite en outre les droits d'accès accordés par les éléments named user, named group et owning group en définissant lesquels parmi les droits d'accès dans ces éléments sont effectifs et lesquels sont masqués. Si des droits existent dans un des éléments mentionnés ainsi que dans le masque, ils sont effectifs. Les droits contenus uniquement dans le masque ou uniquement dans l'élément lui-même ne sont pas effectifs—cela signifie que les droits d'accès ne sont pas accordés. Tous les droits définis dans les éléments owner et owning group sont toujours effectifs. L'exemple de Tableau 35.2, « Masquage de droits d'accès » montre ce mécanisme.

Il y a deux classes de base d'ACL : une ACL minimale ne contient que les éléments concernant les types owner, owning group et other, ce qui correspond aux bits conventionnels de droits d'accès pour les fichiers et les répertoires. Une ACL étendue va au delà de ce principe. Elle doit contenir un élément mask et peut inclure plusieurs éléments des types named user et named group.

Tableau 35.1. Types d'éléments d'ACL

Type

Forme du texte

owner

user::rwx

named user

user:name:rwx

owning group

group::rwx

named group

group:name:rwx

mask

mask::rwx

other

other::rwx

Tableau 35.2. Masquage de droits d'accès

Type d'élément

Forme du texte

Droits d'accès

named user

user:geeko:r-x

r-x

mask

mask::rw-

rw-

Droits d'accès effectifs :

r--

35.3.1. Éléments d'ACL et bits de droits d'accès du mode fichier

Figure 35.1, « ACL minimale : éléments d'ACL comparés aux bits de droits d'accès » et la figure Figure 35.2, « ACL étendue : éléments d'ACL comparés aux bits de droits d'accès » illustrent les deux cas d'une ACL minimale et d'une ACL étendue. Les figures sont structurées en trois blocs—le bloc de gauche présente les spécifications de type des éléments d'ACL, celui du milieu un exemple d'ACL et celui de droite les bits de droits d'accès respectifs conformément au principe conventionnel de droits d'accès, par exemple, comme ls -l le montre également. Dans les deux cas, les droits d'accès owner class sont mis en correspondance avec l'élément d'ACL owner. Les droits d'accès other class sont mis en correspondance avec l'élément d'ACL respectif. Cependant, la mise en correspondance des droits d'accès group class est différent dans les deux cas.

Figure 35.1. ACL minimale : éléments d'ACL comparés aux bits de droits d'accès

ACL minimale : éléments d'ACL comparés aux bits de droits d'accès

Dans le cas d'une ACL minimale — sans élément mask — les droits d'accès group class sont mis en correspondance avec l'élément d'ACL owning group. Ce comportement est illustré dans Figure 35.1, « ACL minimale : éléments d'ACL comparés aux bits de droits d'accès ». Dans le cas d'une ACL étendue — avec mask — les droits d'accès group class sont mis en correspondance avec l'élément mask. Ce comportement est illustré dans Figure 35.2, « ACL étendue : éléments d'ACL comparés aux bits de droits d'accès ».

Figure 35.2. ACL étendue : éléments d'ACL comparés aux bits de droits d'accès

ACL étendue : éléments d'ACL comparés aux bits de droits d'accès

Cette approche de mise en correspondance assure une interaction harmonieuse des applications, qu'elles disposent ou non de la prise en charge des ACL. Les droits d'accès qui ont été affectés au moyen des bits de droits d'accès représentent la limite supérieure pour tous les autres « réglages fins » effectués avec une ACL. Les changements apportés aux bits de droits d'accès sont reflétés par l'ACL et vice versa.

35.3.2. Un répertoire avec une ACL d'accès

La gestion des ACL d'accès est expliquée dans l'exemple suivant :

Avant de créer le répertoire, utilisez la commande umask pour définir quels droits d'accès doivent être masqués chaque fois qu'un objet fichier est créé. La commande umask 027 règle les droits par défaut en donnant au propriétaire l'étendue complète des droits d'accès (0), en refusant au l'accès en écriture (2) et en ne donnant aucun droit du tout aux autres utilisateurs (7). La commande umask masque véritablement les bits de droits d'accès correspondants ou les désactive. Pour plus de détails, consultez la page de manuel correspondante (man umask).

mkdir monrep devrait créer le répertoire monrep avec les droits d'accès par défaut, comme défini par umask. Faites appel à ls -dl monrep pour vérifier si tous les droits ont été affectés correctement. La sortie de cet exemple est :

drwxr-x--- ... tux projet3 ... monrep

Avec getfacl monrep, vérifiez l'état initial de l'ACL. Celle-ci donne des informations comme :

# file: monrep 
# owner: tux 
# group: projet3 
user::rwx 
group::r-x 
other::---
     

La sortie de getfacl reflète précisément la mise en correspondance de bits de droits d'accès avec des éléments d'ACL, comme décrit dans Section 35.3.1, « Éléments d'ACL et bits de droits d'accès du mode fichier ». Les trois premières lignes de la sortie affichent le nom, le propriétaire et le groupe propriétaire du répertoire. Les trois lignes suivantes contiennent les trois éléments d'ACL owner, owning group et other. En fait, dans le cas de cette ACL minimale, la commande getfacl ne produit aucune information que vous n'auriez pu obtenir avec ls.

Modifiez l'ACL pour affecter des droits d'accès en lecture, écriture et exécution à un utilisateur supplémentaire geeko et à un groupe supplémentaire mascottes avec :

setfacl -m user:geeko:rwx,group:mascottes:rwx monrep

L'option -m invite setfacl à modifier l'ACL existante. L'argument suivant indique les éléments d'ACL à modifier (les entrées multiples sont séparées par des virgules). La partie finale spécifie le nom du répertoire auquel ces modifications devront s'appliquer. Utilisez la commande getfacl pour jeter un coup d'œil à l'ACL obtenue.

# file: monrep
# owner: tux
# group: projet3
user::rwx
user:geeko:rwx
group::r-x
group:mascottes:rwx
mask::rwx
other::--- 

En plus des éléments initiés pour l'utilisateur geeko et le groupe mascottes, un élément mask a été généré. Cet élément mask est défini automatiquement, de sorte que tous les droits d'accès sont effectifs. setfacl adapte automatiquement les éléments mask existants aux réglages modifiés, à moins que vous ne désactiviez cette fonctionnalité avec -n. mask définit les droits d'accès effectifs maximaux pour tous les éléments dans le group class. Ceci inclut named user, named group et owning group. Les bits de droit d'accès de group class affichés par ls -dl monrep correspondent à présent à l'élément mask.

drwxrwx---+ ... tux projet3 ... monrep
   

La première colonne de la sortie contient maintenant un + additionnel pour indiquer qu'il y a une ACL étendue pour cet élément.

Selon la sortie de la commande ls, les droits d'accès pour l'élément mask comprennent aussi un accès en écriture. Traditionnellement, de tels bits de droits d'accès signifieraient que le owning group (ici projet3) a aussi un accès en écriture dans le répertoire monrep. Cependant, les droits d'accès effectivement effectifs pour le owning group correspondent à la partie se chevauchant des droits d'accès définis pour le owning group et le mask—qui est r-x dans notre exemple (voir Tableau 35.2, « Masquage de droits d'accès »). Dans la mesure où les droits d'accès effectifs du owning group de cet exemple sont concernés, rien n'a changé, même après l'ajout des éléments d'ACL.

Modifiez l'élément mask avec setfacl ou chmod. Par exemple, faites appel à chmod g-w monrep. ls -dl monrep affiche alors :

drwxr-x---+ ... tux projet3 ... monrep

getfacl monrep fournit la sortie suivante :

# file: monrep
# owner: tux
# group: projet3
user::rwx
user:geeko:rwx          # effective: r-x
group::r-x
group:mascottes:rwx     # effective: r-x
mask::r-x
other::---

Après avoir exécuté la commande chmod pour supprimer le droit d'accès en écriture des bits du group class, la sortie de la commande ls est suffisante pour voir que les bits mask doivent avoir changé en conséquence : le droit d'accès en écriture est à nouveau limité au propriétaire de monrep. La sortie de la commande getfacl le confirme. Cette sortie comporte un commentaire pour tous ces éléments dans lesquels les bits de droits d'accès effectifs ne correspondent pas aux droits d'origine, parce qu'ils ont été filtrés en fonction de l'élément mask. Les droits d'accès d'origine peuvent être restaurés à tout moment avec chmod g+w monrep.

35.3.3. Un répertoire avec une ACL par défaut

Les répertoires peuvent avoir une ACL par défaut, ce qui est un type spécial d'ACL définissant les droits d'accès dont les objets présents dans le répertoire héritent quand ils sont créés. Une ACL par défaut affecte à la fois les sous-répertoires et les fichiers.

35.3.3.1. Effets d'une ACL par défaut

Les droits d'accès dans une ACL par défaut se transmettent différemment aux fichiers et aux sous-répertoires :

  • Un sous-répertoire hérite de l'ACL par défaut du répertoire parent aussi bien au titre de son ACL par défaut que de son ACL d'accès.

  • Un fichier hérite de l'ACL par défaut au titre de son ACL d'accès.

Tous les appels système qui créent des objets système de fichiers utilisent un paramètre mode qui définit les droits d'accès pour l'objet système de fichiers nouvellement créé. Si le répertoire parent n'a pas d'ACL par défaut; les bits de droits d'accès, comme définis par le umask, sont soustraits des droits d'accès tels qu'ils sont passés par le paramètre mode, le résultat étant affecté au nouvel objet. Si une ACL par défaut existe pour le répertoire parent, les bits de droits d'accès affectés au nouvel objet correspondent à la partie se chevauchent des droits d'accès du paramètre mode et ceux qui sont définis dans l'ACL par défaut. L'umask est négligé dans ce cas.

35.3.3.2. Application des ACL par défaut

Les trois exemples suivants montrent les principales opérations sur les répertoires et les ACL par défaut :

  1. Ajoutez une ACL par défaut au répertoire existant monrep avec :

    setfacl -d -m group:mascottes:r-x monrep
    

    L'option -d de la commande setfacl invite setfacl à effectuer les modifications suivantes (option -m) dans l'ACL par défaut.

    Observez de plus près le résultat de cette commande :

    getfacl monrep
    
    # file: monrep
    # owner: tux
    # group: projet3
    user::rwx
    user:geeko:rwx
    group::r-x
    group:mascottes:rwx
    mask::rwx
    other::---
    default:user::rwx
    default:group::r-x
    default:group:mascottes:r-x
    default:mask::r-x
    default:other::---
    

    getfacl renvoie à la fois l'ACL d'accès et l'ACL par défaut. L'ACL par défaut es formée par toutes les lignes qui commencent par default. Même si vous avez simplement exécuté la commande setfacl avec un élément pour le groupe mascottes dans l'ACL par défaut, setfacl a automatiquement copié tous les autres éléments provenant de l'ACL d'accès pour créer une ACL par défaut valide. Les ACL par défaut n'ont pas d'effet immédiat sur les droits d'accès. Elles entrent en jeu uniquement lors de la création des objets systèmes de fichiers. Ces nouveaux objets n'héritent de droits d'accès que de l'ACL par défaut de leur répertoire parent.

  2. Dans l'exemple suivant, utilisez mkdir pour créer un sous-répertoire dans monrep, qui hérite de son ACL par défaut.

    mkdir monrep/monsousrep
    
    getfacl monrep/monsousrep
    
    # file: monrep/monsousrep
    # owner: tux
    # group: projet3
    user::rwx
    group::r-x
    group:mascottes:r-x
    mask::r-x
    other::---
    default:user::rwx
    default:group::r-x
    default:group:mascottes:r-x
    default:mask::r-x
    default:other::---
    

    Comme attendu, le sous-répertoire nouvellement créé monsousrep dispose des droits provenant de l'ACL par défaut du répertoire parent. L'ACL d'accès de monsousrep est un reflet exact de l'ACL par défaut de monrep. L'ACL par défaut que ce répertoire transmet à ses objets subordonnés est également le même.

  3. Utilisez touch pour créer un fichier dans le répertoire monrep, par exemple, touch monrep/monfichier. ls -l monrep/monfichier affiche alors :

    -rw-r-----+ ... tux projet3 ... monrep/monfichier 
    

    La sortie de getfacl monrep/monfichier est :

    # file: monrep/monfichier
    # owner: tux
    # group: projet3
    user::rw-
    group::r-x          # effective:r--
    group:mascottes:r-x # effective:r--
    mask::r--
    other::--- 
    

    La commande touch utilise un mode ayant la valeur 0666 lorsque de nouveaux fichiers sont créés, ce qui signifie que les fichiers sont créés avec des droits d'accès en lecture et en écriture pour toutes les classes d'utilisateurs, du moins s'il n'existe pas d'autres restrictions dans umask ou dans l'ACL par défaut (voir Section 35.3.3.1, « Effets d'une ACL par défaut »). Concrètement, cela signifie que tous les droits d'accès non contenus dans la valeur mode sont supprimés des éléments d'ACL respectifs. Bien qu'aucun droit d'accès n'ait été suprimé depuis l'élément d'ACL du group class, l'élément mask a été modifié pour masquer les droits d'accès non réglés dans mode.

    Cette approche assure l'interaction harmonieuse des applications, telles que les compilateurs, avec les ACL. Vous pouvez créer des fichiers avec des droits d'accès restreints et les marquer par la suite comme étant exécutables. Le mécanisme mask garantit que les utilisateurs et les groupes corrects peuvent les exécuter comme souhaité.

35.3.4. L'algorithme de contrôle d'une ACL

Un algorithme de contrôle est appliqué avant d'accorder à n'importe quel processus ou application l'accès à un objet système de fichiers protégé par des ACL. À titre de règle de base, les éléments sont examinés dans l'ordre suivant :owner, named user, owning group et named group et other. L'accès est géré en conformité avec l'élément qui convient le mieux au processus. Les droits d'accès ne se cumulent pas.

La situation se complique si un processus appartient à plusieurs groupes et pourrait potentiellement convenir à plusieurs éléments group. Un élément est sélectionné aléatoirement parmi les éléments appropriés avec les droits d'accès requis. Le fait de savoir lequel des éléments déclenche le résultat final « accès accordé »n'a pas d'importance. De même, si aucun des éléments group approprié ne contient les droits d'accès exigés, un élément sélectionné aléatoirement déclenche le résultat final « access denied ».


SUSE LINUX Guide de l'administrateur 9.2