Gestion des accès aux fichiers : ACL
Vous êtes ici : Support technique -> Stockage -> 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'information voir man chmod).
La plupart du temps, les droits Unix vous suffiront. Mais en utilisant les droits ACL (Access Control List), vous pourrez contrôler les accès à vos données plus finement.
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 (pour plus d'information, voir le
man setfacl) :
setfacl ACL_OPTIONS repertoire
où 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
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) et 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 controlé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|-]
- et/ou un champ g avec mention du groupe, qui correspond
aux droits attribués à l'ensemble du groupe spécifié :
g:groupe:[r|-][w|-][x|-]
- et 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 forts (m::rwx) pour ne pas restreindre les droits donnés à
login et/ou groupe. Pour en savoir plus, reportez vous à
la rubrique Dépendances ACL et droits Unix.
Vous trouverez des exemples d'utilisation de la commande setfacl
dans les rubriques suivantes Ajout de droits à un
utilisateur particulier et Ajout de droits à un
groupe particulier
Visualisation des ACL
La commande getfacl (pour plus d'information, voir le man getfacl) donne un affichage détaillé des droits ACL positionnés sur un répertoire ou un fichier :
getfacl repertoire
Rappel : L'option -l de 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).
rlab000-gaya : ls -ld repertoire_avec_acl repertoire_sans_acl
drwxr-x---+ 2 rlab000 lab 8192 2010-03-29 11:00 repertoire_avec_acl
drwxr-x--- 2 rlab000 lab 8192 2010-03-29 11:00 repertoire_sans_acl
rlab000-gaya : ls -l fichier_avec_acl fichier_sans_acl
-rwx------+ 2 rlab000 lab 8192 2010-03-29 11:00 fichier_avec_acl
-rwx------ 2 rlab000 lab 8192 2010-03-29 11:00 fichier_sans_acl
Par exemple, rlab000 veut donner des droits particuliers à
l'utilisateur rext000 pour accéder à son HOME sur Gaya.
rlab000-gaya : cd $HOME
rlab000-gaya : setfacl --set=u::rwx,u:rext000:rwx,g::r-x,o::---,m::rwx .
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
user:rext000:rwx
group::r-x
mask::rwx
other::---
- Avec le champs (obligatoire) u::rwx, le propriétaire
rlab000 a les droits rwx sur son répertoire
HOME (sans cela il ne peut plus y accéder : il est alors
bloqué par les droits ACL même si les droits Unix sont bien positionnés),
- avec le champs (obligatoire) g::r-x, les utilisateurs appartenant
au groupe propriétaire (lab) ont les droits r-x : ils
peuvent donc voir le contenu du répertoire mais pas y écrire,
- avec le champs (obligatoire) o::---, tous les autres utilisateurs
n'ont aucun droit sur ce répertoire,
- avec le champs u:rext000:rwx, on ajoute les droits rwx
pour l'utilisateur particulier rext000 : il peut donc lire et
écrire sur le répertoire HOME de rlab000,
- ne pas oublier le mask (champs m::rwx) : s'il est
vide (m::---) alors le champs u:rext000:rwx est
inopérant.
ATTENTION :
- il ne faut pas utiliser la commande suivante (avec le path complet)
car vous positionneriez aussi les ACLs sur les répertoires et les fichiers
contenus dans votre HOME et non pas uniquement sur le HOME :
setfacl --set=u::rwx,u:rext000:rwx,g::r-x,o::---,m::rwx /u/rech/lab/rlab000
- 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 des
clés 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 maximums suivants sur le HOME (pas de droit
d'écriture pour le groupe et les autres) :
$ ls -lLd ~
drwxr-xr-x+ 9 rgrp000 grp 4096 Apr 13 09:42 /u/rech/grp/rgrp000
L'option -L est importante car les HOME sur Gaya sont des
liens symboliques.
Dans ce cas, la procédure consiste à d'abord activer les droits ACL puis à
changer ensuite les droits Unix : depuis le HOME de Gaya, utilisez par exemple
la commande "chmod 750 ~" qui évite de donner l'accès à tout le monde.
Par exemple, rlab000 veut donner des droits particuliers à
un groupe ext pour accéder à son HOME sur Gaya.
rlab000-gaya : cd $HOME
rlab000-gaya : setfacl --set=u::rwx,g::r-x,g:ext:r-x,o::---,m::rwx .
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
group::r-x
group:ext:r-x
mask::rwx
other::---
- Avec le champs (obligatoire) u::rwx, le propriétaire
rlab000 a les droits rwx sur son répertoire
HOME (sans cela il ne peut plus y accéder : il est alors
bloqué par les droits ACL même si les droits Unix sont bien positionnés),
- avec le champs (obligatoire) g::r-x, les utilisateurs appartenant
au groupe propriétaire (lab) ont les droits r-x : ils
peuvent donc voir le contenu du répertoire mais pas y écrire,
- avec le champs (obligatoire) o::---, tous les autres utilisateurs
n'ont aucun droit sur ce répertoire,
- avec le champs g:ext:r-x, on ajoute les droits r-x pour
les utilisateurs appartenant au groupe ext : ils peuvent
donc voir le contenu du répertoire mais pas y écrire,
- ne pas oublier le mask (champs m::rwx) : s'il est
vide (m::---) alors le champs g:ext:r-x est inopérant.
ATTENTION :
- il ne faut pas utiliser la commande suivante (avec le path complet)
car vous positionneriez aussi les ACLs sur les répertoires et les fichiers
contenus dans votre HOME et non pas uniquement sur le HOME :
setfacl --set=u::rwx,u:rext000:rwx,g::r-x,o::---,m::rwx /u/rech/lab/rlab000
- 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 des
clés 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 maximums suivants sur le HOME (pas de droit
d'écriture pour le groupe et les autres) :
$ ls -lLd ~
drwxr-xr-x+ 9 rgrp000 grp 4096 Apr 13 09:42 /u/rech/grp/rgrp000
L'option -L est importante car les HOME sur Gaya sont des
liens symboliques.
Dans ce cas, la procédure consiste à d'abord activer les droits ACL puis à
changer ensuite les droits Unix : depuis le HOME de Gaya, 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 droits ACL, vous pouvez utiliser la commande setfacl avec soit :
- l'option --set=... : les droits ACL précédemment positionnés
sont alors écrasés,
- l'option -m ... : les droits ACL sont alors modifiés.
Notez qu'il faut toujours au moins spécifier les champs u::rwx, g::..., o::--- et ne pas oublier le mask m::rwx pour être sûr que les ACL positionnés pour le(s) groupe(s) spécifié(s) (dans l'exemple ci-dessous ext et grp) soient réellement effectifs.
Dans un premier temps, on positionne des ACL pour le groupe ext :
rlab000-gaya : cd $HOME
rlab000-gaya : setfacl --set=u::rwx,g::r-x,g:ext:r-x,o::---,m::rwx .
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
group::r-x
group:ext:r-x
mask::rwx
other::---
Puis on modifie les ACL en changeant de groupe :
rlab000-gaya : setfacl --set=u::rwx,g::r-x,g:grp:r-x,o::---,m::rwx .
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
group::r-x
group:grp:r-x
mask::rwx
other::---
Cette fois, on modifie les ACL en ajoutant un second groupe :
rlab000-gaya : setfacl -m u::rwx,g::r-x,g:ext:r-x,o::---,m::rwx .
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
group::r-x
group:grp:r-x
group:ext:r-x
mask::rwx
other::---
Supression d'une ACL
Pour supprimer les droits ACL, vous pouvez utiliser la commande setfacl avec l'option -b :
rlab000-gaya : cd $HOME
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
group::r-x
group:ext:r-x
mask::rwx
other::---
rlab000-gaya : setfacl -b .
rlab000-gaya : ls -ld .
drwxr-x--- 2 rlab000 lab 8192 2010-03-29 11:00 .
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
group::r-x
other::---
Conseils sur l'utilisation des ACL
Nous vous conseillons de placer des ACL uniquement sur votre répertoire
HOME pour en filtrer l'accès et de positionner ensuite les droits Unix
sur les fichiers et répertoires qu'il contient à l'aide de chmod.
Par exemple, nous sommes sous le compte rlab000 sur Gaya :
rlab000-gaya : cd $HOME
rlab000-gaya : setfacl --set=u::rwx,u:raaa000:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx .
rlab000-gaya : chmod 757 file
rlab000-gaya : ls -ld . file
drwxrwx---+ 0 rlab000 lab 4096 2010-03-30 11:46 .
-rwxr-xrwx 0 rlab000 lab 1000 2010-03-30 11:46 file
rlab000-gaya : getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
user:raaa000:rwx
group::r-x
group:bbb:r-x
other::---
Si on analyse ces droits d'accès, on voit que :
- L'utilisateur raaa000 a les droits ACL rwx sur le
HOME et les droits Unix rwx (champs other)
sur file. Il peut ainsi accéder en lecture et écriture
au fichier file contenu dans le HOME de
rlab000. Notez qu'il peut aussi créer de nouveaux fichiers et
des répertoires sous le HOME de rlab000 (droits ACL).
De plus, il peut aussi modifier le contenu des sous-répertoires pour
lesquels les droits Unix (champs other) l'y autorisent.
- Le groupe propriétaire (lab) a les droits ACL r-x sur
le HOME et les droits Unix r-x (champs group)
sur file. Les membres du groupe lab peuvent donc lire
le fichier mais pas l'écrire (donc pas le modifier). De plus, ils ne
peuvent rien créer directement sous le HOME de rlab000
(droits ACL). Mais ils peuvent aussi modifier le contenu des
sous-répertoires pour lesquels les droits Unix (champs group)
les y autorisent.
- par contre le groupe bbb a les droits ACL r-x sur le
HOME et les droits Unix rwx (champs 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
lab, ils ne peuvent rien créer directement sous le
HOME de rlab000 (droits ACL). Mais ils peuvent aussi
modifier le contenu des sous-répertoires pour lesquels les droits Unix
(champs 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 champs
other (chmod 755 file). Mais ceci empècherait aussi
raaa000 de modifier le fichier.
- Dans ce cas, il faut positionner des ACL sur file aussi :
rlab000-gaya : setfacl --set=u::rwx,u:raaa000:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx file
rlab000-gaya : getfacl file
# file: file
# owner: rlab000
# group: lab
user::rwx
user:raaa000:rwx
group::r-x
group:bbb:r-x
other::---
Il existe deux sortes de droits d'accès : les droits Unix classiques et
les droits désignés par l'ACL. La commande setfacl modifie les
droits ACL mais aussi les droits Unix. Par contre, la commande chmod ne
modifie que certains champs de l'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 être en réalité 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 :
rlab000-gaya: setfacl --set=u::rwx,u:raaa000:rwx,g::rwx,g:bbb:rwx,o::---,m::r-x .
rlab000-gaya: ls -ld .
drwxr-x---+ 0 rlab000 lab 4096 2010-03-30 16:28 .
> getfacl .
# file: .
# owner: rlab001
# group: lab
user::rwx
user:raaa000:rwx #effective:r-x
group::rwx #effective:r-x
group:bbb:rwx #effective:r-x
mask::r-x
other::---
L'utilisateur raaa000, ceux du groupe propriétaire lab
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 de la classe other qui sont respectivement
rwx et ---.
On remarque ensuite que les droits Unix du répertoire sont :
- rwx pour le propriétaire du fichier rlab000.
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:raaa000: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 :
-
rlab000-gaya: setfacl --set=u::r-x,u:raaa000:rwx,g::---,g:bbb:r-x,o::---,m::--- .
rlab000-gaya: ls -ld .
dr-x------+ 15 rlab000 lab 4096 2010-03-30 16:28 .
rlab000-gaya: getfacl .
# file: .
# owner: rlab000
# group: lab
user::r-x
user:raaa000:rwx #effective:---
group::---
group:bbb:r-x #effective:---
mask::---
other::---
Vous noterez que les droits effectifs sont vides (car le mask est vide) : le login raaa000 et le groupe bbb n'ont donc aucun droit sur le répertoire malgré les champs ACL u:raaa000:rwx et g:bbb:r-x.
- La commande chmod u+rwx modifie le champ u:: de l'ACL :
rlab000-gaya: chmod u+w .
rlab000-gaya: ls -ld .
drwx------+ 15 rlab000 lab 4096 2010-03-30 16:28 .
rlab000-gaya: getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
user:raaa000:rwx #effective:---
group::---
group:bbb:r-x #effective:---
mask::---
other::---
- La commande chmod g+rwx modifie le champ m:: de l'ACL et
non pas le champ g:: de l'ACL. Mais le mask influence les champs g::, g:groupe: et u:login: des ACL. Le login raaa000 et le groupe bbb retrouvent donc leurs droits respectifs fixées par les champs ACL u:raaa000:rwx et g:bbb:r-x.
rlab000-gaya: chmod g+rwx .
rlab000-gaya: ls -ld .
drwxrwx---+ 15 rlab000 lab 4096 2010-03-30 16:28 .
rlab000-gaya: getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
user:raaa000: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.
rlab000-gaya: setfacl --set=u::rwx,u:raaa000:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx .
rlab000-gaya: ls -ld .
drwxrwx---+ 15 rlab000 lab 4096 2010-03-30 16:29 .
rlab000-gaya: getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
user:raaa000:rwx
group::r-x
group:bbb:r-x
mask::rwx
other::---
- La commande chmod o+rx modifie le champ o:: de l'ACL :
rlab000-gaya: chmod o+rx .
rlab000-gaya: ls -ld .
drwxrwxr-x+ 15 rlab000 lab 4096 2010-03-30 16:29 .
rlab000-gaya: getfacl .
# file: .
# owner: rlab000
# group: lab
user::rwx
user:raaa000:rwx
group::r-x
group:bbb:r-x
mask::rwx
other::r-x
© CNRS - IDRIS, 23/04/2012