Ergon : gestion des accès aux fichiers, ACL

Les Droits Unix

Les droits Unix permettent de donner des droits d'accès différents en lecture, écriture et/ou exécution aux catégories suivantes :

  • au propriétaire du fichier,
  • aux utilisateurs appartenant au même groupe Unix que le propriétaire du fichier,
  • à tous les autres utilisateurs.

Il suffit d'utiliser la commande chmod pour modifier les droits Unix (pour plus d'informations, voir man chmod). La plupart du temps, les droits Unix vous suffiront. Mais en utilisant les ACL (Access Control List), vous pourrez contrôler les accès à vos données plus finement, en y donnant accès à un utilisateur et un seul (quel que soit son groupe), par exemple .

Les ACL

Ainsi, si l'on désire donner des droits d'accès à un utilisateur et/ou un groupe particulier, on peut définir une ACL (Access Control List) sur le fichier ou le répertoire voulu. La syntaxe générale est la suivante :

  setfacl ACL_OPTIONS répertoire

ACL_OPTIONS peut avoir l'une des formes suivantes :

  • pour créer ou remplacer une ACL existante :
--set=u::rwx,[u:login:[r|-][w|-][x|-]],g::[r|-][w|-][x|-],[g:groupe:[r|-][w|-][x|-]],o::[r|-][w|-][x|-][,m::rwx]
  • pour modifier une ACL existante :
-m u::rwx,[u:login:[r|-][w|-][x|-]],g::[r|-][w|-][x|-],[g:groupe:[r|-][w|-][x|-]],o::[r|-][w|-][x|-][,m::rwx]
  • pour supprimer une ACL existante :
-b

Pour plus d'information, tapez la commande man setfacl)

Remarques importantes :

  • Les droits rwx ont les mêmes significations que les droits Unix classiques rwx.
  • Une ACL syntaxiquement valide doit comporter au minimum trois champs séparés par des virgules :
    • le champ commençant par u (comme user) sans mentionner de login : il correspond aux droits donnés au propriétaire du fichier ou du répertoire. Pour un répertoire (ou un exécutable), nous vous conseillons de positionner :
      u::rwx
      et pour un fichier :
      u::rw
    • le champ commençant par g (comme group) sans mentionner de groupe. Il correspond aux droits donnés au groupe propriétaire du fichier :
      g::[r|-][w|-][x|-]
    • le champ commençant par o (comme other) sans aucune mention. Il correspond aux droits donnés aux utilisateurs qui ne sont pas mentionnés dans les champs u et g :
      o::[r|-][w|-][x|-].

L'utilisation de la commande setfacl avec ces trois seuls champs donne les mêmes permissions que la commande chmod et présente donc peu d'intérêt. Par exemple, la commande suivante donne tous les droits au propriétaire du répertoire mon_repertoire et permet aux membres du groupe propriétaire de consulter le contenu du répertoire (lecture uniquement) :

setfacl --set=u::rwx,g::r-x,o::--- mon_repertoire

Attention : les accès aux sous-répertoires et aux fichiers contenus dans mon_repertoire restent contrôlés par les droits Unix.

  • Pour élargir les droits d'accès, il faut ajouter au moins deux des trois champs suivants aux trois champs présentés ci-dessus :
    • un champ u avec mention du login, qui correspond aux droits donnés à un utilisateur particulier :
      u:login:[r|-][w|-][x|-]
    • un champ g avec mention du groupe, qui correspond aux droits attribués à l'ensemble du groupe spécifié :
      g:groupe:[r|-][w|-][x|-]
    • enfin obligatoirement un champ commençant par m (comme mask), qui définit les droits maximaux (ou effectifs) des utilisateurs concernés par les champs u:login:… et/ou g:groupe:…. Il est conseillé de donner au masque les droits les plus élevés (m::rwx) pour ne pas restreindre les droits donnés à login et/ou à un groupe. Pour en savoir plus, reportez vous à la rubrique Dépendances entre ACL et droits Unix. Vous trouverez des exemples d'utilisation de la commande setfacl dans les rubriques suivantes : Ajout d'un utilisateur particulier et Ajout d'un groupe particulier.
  • toutes les commandes de gestion des ACL sur Ergon peuvent être passées depuis une session sur Adapp; vous accédez alors à votre HOME sur Ergon en utilisant la variable d'environnement $ARCHIVE :
 [login1@ada:~]$ cd $ARCHIVE
 [login1@ada: login1] ls -ld repertoire_avec_acl repertoire_sans_acl
 drwxr-x---+ 2 login1 grp  8192 2014-03-29 11:00 repertoire_avec_acl
 drwxr-x---  2 login1 grp  8192 2014-03-29 11:00 repertoire_sans_acl

Dans les exemples suivants, les commandes sont toutes passées depuis Ergon dans un souci de cohérence, mais ça n'est absolument pas indispensable.

Visualisation des ACL

La commande getfacl (pour plus d'information, voir le man getfacl) donne un affichage détaillé des ACL positionnées sur un répertoire ou un fichier :

     getfacl repertoire

Note : l'option -l de la commande ls permet d'afficher les droits Unix classiques mais aussi de voir si des ACL sont positionnés : un signe + apparaît juste après les droits Unix.

[login1@ergon1:~]$ ls -ld repertoire_avec_acl repertoire_sans_acl
drwxr-x---+ 2 login1 grp  8192 2014-03-29 11:00 repertoire_avec_acl
drwxr-x---  2 login1 grp  8192 2014-03-29 11:00 repertoire_sans_acl

[rlab001@ergon1:~]$ ls -l fichier_avec_acl fichier_sans_acl
-rwx------+ 2 login1 grp  8192 2014-03-29 11:00 fichier_avec_acl
-rwx------  2 login1 grp  8192 2014-03-29 11:00 fichier_sans_acl

Ajout d'un utilisateur particulier dans une ACL

Par exemple, login1 veut donner des droits particuliers à l'utilisateur login2 pour accéder à son HOME sur Ergon.

[login1@ergon1:~]$ cd $HOME
[login1@ergon1:~]$ setfacl --set=u::rwx,u:login2:rwx,g::r-x,o::---,m::rwx .
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
user:login1:rwx
group::r-x
mask::rwx
other::---
  • avec le champ (obligatoire) u::rwx, le propriétaire login1 a les droits rwx sur son répertoire HOME. Attention, sans ces droits il ne peut plus y accéder : il est alors bloqué par les ACL même si les droits Unix sont bien positionnés;
  • avec le champ (obligatoire) g::r-x, les utilisateurs appartenant au groupe propriétaire (grp) ont les droits r-x : ils peuvent donc voir le contenu du répertoire mais pas y écrire;
  • avec le champ (obligatoire) o::---, aucun autre utilisateur n'a le moindre droit sur ce répertoire;
  • avec le champ u:login2:rwx, on ajoute les droits rwx pour l'utilisateur particulier login2 : il peut donc lire et écrire sur le répertoire HOME de login1;
  • ne pas oublier le masque (champ m::rwx) : s'il est vide (m::---) alors le champs u:login2:rwx est inopérant.

ATTENTION :

  • il ne faut pas utiliser la commande suivante avec le PATH complet, car vous positionneriez les ACL non pas uniquement sur le HOME lui-même, mais aussi sur tous les répertoires et les fichiers contenus dans ce HOME :
setfacl --set=u::rwx,u:login2:rwx,g::r-x,o::---,m::rwx /chemin/vers/home/grp/login1
  • Une ACL sur le répertoire HOME, impliquant des droits en écriture pour une autre personne que le propriétaire du compte, rend le mécanisme d'authentification par clé SSH inopérant (une connexion via SSH demande alors le mot de passe). Pour que les clés SSH puissent fonctionner, il faut vérifier que l'on a les droits Unix «maximum» suivants sur le HOME (pas de droit en écriture pour le groupe et les autres) :
[login1@ergon1:~]$ ls -lLd ~
drwxr-xr-x+ 9 login1 grp 4096 Apr 13 09:42 /chemin/vers/home/grp/login1

L'option -L est importante car les HOME sur Ergon sont des liens symboliques. Dans ce cas, la procédure consiste à d'abord activer les ACL, puis à changer ensuite les droits Unix : depuis le HOME de Ergon, utilisez par exemple la commande chmod 750 ~ qui évite de donner l'accès à tout le monde.

Ajout d'un groupe particulier dans une ACL

Par exemple, login1 veut donner des droits particuliers à un groupe ccc pour accéder à son HOME sur Ergon.

[login1@ergon1:~]$ cd $HOME
[login1@ergon1:~]$ setfacl --set=u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx .
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
group::r-x
group:ccc:r-x
mask::rwx
other::---
  • avec le champ (obligatoire) u::rwx, le propriétaire login1 a les droits rwx sur son répertoire HOME. Attention, sans ces droits il ne peut plus y accéder : il est alors bloqué par les ACL même si les droits Unix sont bien positionnés;
  • avec le champ (obligatoire) g::r-x, les utilisateurs appartenant au groupe propriétaire (grp) ont les droits r-x : ils peuvent donc voir le contenu du répertoire mais pas y écrire;
  • avec le champ (obligatoire) o::---, aucun autre utilisateur n'a le moindre droit sur ce répertoire,
  • avec le champ g:ccc:r-x, on ajoute les droits r-x pour les utilisateurs appartenant au groupe ccc : ils peuvent donc voir le contenu du répertoire mais pas y écrire;
  • ne pas oublier le masque (champ m::rwx) : s'il est vide (m::---) alors le champ g:ccc:r-x est inopérant.

ATTENTION :

  • il ne faut pas utiliser la commande suivante avec le PATH complet, car vous positionneriez les ACL non pas uniquement sur le HOME lui-même, mais aussi sur tous les répertoires et les fichiers contenus dans ce HOME :
setfacl --set=u::rwx,u:login2:rwx,g::r-x,o::---,m::rwx /chemin/vers/home/grp/login1
  • Une ACL sur le répertoire HOME, impliquant des droits en écriture pour une autre personne que le propriétaire du compte, rend le mécanisme d'authentification par clé SSH inopérant (une connexion via SSH demande alors le mot de passe). Pour que les clés SSH puissent fonctionner, il faut vérifier que l'on a les droits Unix «maximum» suivants sur le HOME (pas de droit d'écriture pour le groupe et le reste du monde) :
[login1@ergon1:~]$ ls -lLd ~
drwxr-xr-x+ 9 login1 grp 4096 Apr 13 09:42 /chemin/vers/home/grp/login1

L'option -L est importante car les HOME sur Ergon sont des liens symboliques. Dans ce cas, la procédure consiste à d'abord activer les ACL, puis à changer ensuite les droits Unix : depuis le HOME de Ergon, utilisez par exemple la commande chmod 750 ~ qui évite de donner l'accès à tout le monde.

Mise à jour d'une ACL

Pour modifier les ACL, vous pouvez utiliser la commande setfacl avec soit :

  • l'option –set=… : les ACL précédemment positionnés sont alors écrasés,
  • l'option -m … : les ACL existants sont alors modifiés.

Notez qu'il faut toujours au moins spécifier les champs u::rwx, g::…, o::--- et ne pas oublier le masque m::rwx pour être sûr que les ACL positionnés pour le(s) groupe(s) spécifié(s) (dans l'exemple ci-dessous ccc et grp) soient réellement effectifs.

Dans un premier temps, on positionne des ACL pour le groupe ccc :

[login1@ergon1:~]$ cd $HOME
[login1@ergon1:~]$ setfacl --set=u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx .
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
group::r-x
group:ccc:r-x
mask::rwx
other::---

Puis on modifie les ACL en changeant de groupe :

[login1@ergon1:~]$ setfacl --set=u::rwx,g::r-x,g:grp:r-x,o::---,m::rwx .
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
group::r-x
group:grp:r-x
mask::rwx
other::---

Cette fois, on modifie les ACL en ajoutant un second groupe :

[login1@ergon1:~]$ setfacl -m u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx .
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
group::r-x
group:grp:r-x
group:ccc:r-x
mask::rwx
other::---

Supression d'une ACL

Pour supprimer les ACL, vous pouvez utiliser la commande setfacl avec l'option -b :

[login1@ergon1:~]$ cd $HOME
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
group::r-x
group:ccc:r-x
mask::rwx
other::---

[login1@ergon1:~]$ setfacl -b .
[login1@ergon1:~]$ ls -ld .
drwxr-x---  2 login1 grp  8192 2014-03-29 11:00 .
[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
group::r-x
other::---

Conseils sur l'utilisation des ACL

Nous vous conseillons de placer une ACL uniquement sur votre répertoire HOME pour en filtrer l'accès, puis de positionner ensuite les droits Unix sur les fichiers et répertoires qu'il contient à l'aide de la commande chmod.

Par exemple, nous sommes sous le compte login1 sur Ergon :

[login1@ergon1:~]$ cd $HOME
[login1@ergon1:~]$ setfacl --set=u::rwx,u:login3:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx .
[login1@ergon1:~]$ chmod 757 file
[login1@ergon1:~]$ ls -ld . file
drwxrwx---+ 0 login1 grp 4096 2014-03-30 11:46 .
-rwxr-xrwx  0 login1 grp 1001 2014-03-30 11:46 file

[login1@ergon1:~]$ getfacl .
# file: .
# owner: login1
# group: grp
user::rwx
user:login3:rwx
group::r-x
group:bbb:r-x
other::---

Si on analyse ces droits d'accès, on voit que :

  • L'utilisateur login3 a les ACL rwx sur le HOME et les droits Unix rwx (champ other) sur file. Il peut ainsi accéder en lecture et écriture au fichier file contenu dans le HOME de login1. Notez qu'il peut aussi créer de nouveaux fichiers et des répertoires sous le HOME de login1 grâce aux ACL. De plus, il peut aussi modifier le contenu des sous-répertoires pour lesquels les droits Unix (champ other) l'y autorisent.
  • Le groupe propriétaire (grp) a les ACL r-x sur le HOME et les droits Unix r-x (champ group) sur file. Les membres du groupe grp peuvent donc lire le fichier mais pas y écrire (donc pas le modifier). De plus, ils ne peuvent rien créer directement dans le HOME de login1 (ACL). Mais ils peuvent modifier le contenu des sous-répertoires pour lesquels les droits Unix (champ group) les y autorisent.
  • Par contre le groupe bbb a les ACL r-x sur le HOME et les droits Unix rwx (champ other) sur file. Les membres du groupe bbb peuvent donc traverser le HOME et lire ou écrire (donc modifier ou écraser) file, ce qui n'était peut-être pas souhaité. Mais, comme grp, ils ne peuvent rien créer directement dans le HOME de login1 (ACL). Mais ils peuvent modifier le contenu des sous-répertoires pour lesquels les droits Unix (champ other) les y autorisent.
  • Pour éviter que le groupe bbb puisse écraser file, on peut être tenté de supprimer le droit Unix d'écriture dans le champ other avec la commande chmod 755 file. Mais ceci empêcherait alors aussi login3 de modifier le fichier.

Dans ce cas, il faut positionner une ACL sur file aussi :

[login1@ergon1:~]$ setfacl --set=u::rwx,u:login3:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx file
[login1@ergon1:~]$ getfacl file
# file: file
# owner: login1
# group: grp
user::rwx
user:login3:rwx
group::r-x
group:bbb:r-x
other::---

Dépendances entre ACL et droits Unix (pour utilisateurs avertis)

Il existe deux sortes de droits d'accès : les droits Unix classiques et les droits enregistrés dans l'ACL. La commande setfacl modifie les ACL mais aussi les droits Unix. Par contre, la commande chmod ne modifie que certains champs des ACL.

Pour bien comprendre cette dépendance il faut détailler la fonctionnalité du masque d'une ACL (champ m::…). Les droits effectifs des utilisateurs concernés par les champs u:login:…, g::… et g:ext:… peuvent en réalité être restreints par les droits présents dans le masque.

Par exemple, si l'on positionne des ACL sur un répertoire comme indiqué ci-dessous :

  [login1@ergon1:~]$ setfacl --set=u::rwx,u:login3:rwx,g::rwx,g:bbb:rwx,o::---,m::r-x .
  [login1@ergon1:~]$ ls -ld .
  drwxr-x---+ 0 login1 grp 4096 2014-03-30 16:28 .
  [login1@ergon1:~]$ getfacl .
  # file: .
  # owner: login1
  # group: grp
  user::rwx
  user:login3:rwx                #effective:r-x
  group::rwx                      #effective:r-x
  group:bbb:rwx                   #effective:r-x
  mask::r-x
  other::---

L'utilisateur login3, ceux du groupe propriétaire grp ainsi que ceux du groupe bbb ont comme droits effectifs r-x et non pas rwx en raison du masque m::r-x. La commande setfacl effectue un ET logique bit à bit entre leurs droits respectifs 111 et le masque 101. Par contre, le masque ne s'applique pas pour déterminer des droits du propriétaire et des utilisateurs du champ other qui sont respectivement rwx et ---.
On remarque ensuite que les droits Unix du répertoire sont :

  • rwx pour le propriétaire du fichier login1. Ceci correspond au champ u::rwx de l'ACL.
  • r-x pour le groupe ce qui correspond à ceux du champ m::r-x de l'ACL, c'est-à-dire aux droits maximaux des utilisateurs du groupe Unix étendu décrit dans les champs u:login3:rwx, g::rwx, g:bbb:rwx (il faut comprendre ici la notion de groupe Unix au sens large),
  • --- (aucun droit) pour les utilisateurs n'appartenant pas aux catégories précédentes. Ceci correspond au champ o::--- de l'ACL.

Inversement, pour mieux comprendre l'action de la commande chmod sur un répertoire contenant une ACL, on part de la situation suivante :

    [login1@ergon1:~]$ setfacl --set=u::r-x,u:login3:rwx,g::---,g:bbb:r-x,o::---,m::--- .
    [login1@ergon1:~]$ ls -ld .
    dr-x------+ 15 login1 grp 4096 2014-03-30 16:28 .
    [login1@ergon1:~]$ getfacl .
    # file: .
    # owner: login1
    # group: grp
    user::r-x
    user:login3:rwx                #effective:---
    group::---
    group:bbb:r-x                   #effective:---
    mask::---
    other::---
  • Vous noterez que les droits effectifs sont vides (car le masque est vide) : le login login3 et le groupe bbb n'ont donc aucun droit sur le répertoire malgré les champs ACL u:login3:rwx et g:bbb:r-x. La commande chmod u+rwx modifie le champ u:: de l'ACL :
    [login1@ergon1:~]$ chmod u+w .
    [login1@ergon1:~]$ ls -ld .
    drwx------+ 15 login1 grp 4096 2014-03-30 16:28 .
    [login1@ergon1:~]$ getfacl .
    # file: .
    # owner: login1
    # group: grp
    user::rwx
    user:login3:rwx                #effective:---
    group::---
    group:bbb:r-x                   #effective:---
    mask::---
    other::---
  • La commande chmod g+rwx modifie le masque (champ m::) de l'ACL et non pas le champ g::. Mais ce masque a lui une influence les champs g::, g:groupe: et u:login: des ACL.
  • Le login login3 et le groupe bbb retrouvent donc leurs droits respectifs fixées par les champs ACL u:login3:rwx et g:bbb:r-x.
    [login11@ergon1:~]$ chmod g+rwx .
    [login1@ergon1:~]$ ls -ld .
    drwxrwx---+ 15 login1 grp 4096 2014-03-30 16:28 .
    [login11@ergon1:~]$ getfacl .
    # file: .
    # owner: login1
    # group: grp
    user::rwx
    user:login3:rwx
    group::---
    group:bbb:r-x
    mask::rwx
    other::---
  • Les droits concernant le champ g:: des ACL ne peuvent être modifiés que par la commande setfacl.
    [login1@ergon1:~]$ setfacl --set=u::rwx,u:login3:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx .
    [login1@ergon1:~]$ ls -ld .
    drwxrwx---+ 15 login1 grp 4096 2014-03-30 16:29 .
    [login1-ergon1:~]$ getfacl .
    # file: .
    # owner: login1
    # group: grp
    user::rwx
    user:login3:rwx
    group::r-x
    group:bbb:r-x
    mask::rwx
    other::---
  • La commande chmod o+rx modifie le champ o:: de l'ACL :
    [login1@ergon1:~]$ chmod o+rx .
    [login1@ergon1:~]$ ls -ld .
    drwxrwxr-x+ 15 login1 grp 4096 2014-03-30 16:29 .
    [login1-ergon1:~]$ getfacl .
    # file: .
    # owner: login1
    # group: grp
    user::rwx
    user:login3:rwx
    group::r-x
    group:bbb:r-x
    mask::rwx
    other::r-x