Table des matières
Jean Zay : 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) via la commande setfacl
sur le fichier ou le répertoire voulu. La syntaxe générale est la suivante :
$ setfacl ACL_OPTIONS répertoire
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
Pour plus d'information, tapez la commande man setfacl
.
Remarques importantes :
- Lorsque vous positionnez des droits ACL sur un répertoire (par exemple
$WORK/sub_dir/shared_dir
) ou un fichier, vous devez aussi positionner des droits ACL permettant d'accéder à chacun des répertoires qui composent le chemin d'accès à ce répertoire (pour cet exemple$WORK
etsub_dir
). Sans cela, l'accès sera refusé. - Les droits
rwx
ont les mêmes significations que les droits Unix classiquesrwx
. - 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 champsu
etg
:
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 (u::rwx
) du répertoire mon_repertoire
et permet aux membres du groupe propriétaire (g::r-x
) de consulter le contenu du répertoire en 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 alors contrôlés par les droits Unix.
Pour élargir les droits d'accès, il faut ajouter aux trois champs présentés ci-dessus, au moins un des deux premiers champs suivants et obligatoirement le dernier champ m
ci-dessous :
- un champ
u
avec mention du login, qui correspond aux droits donnés à un utilisateur particulier (icilogin
) :
u:login:[r|-][w|-][x|-]
- un champ
g
avec mention du groupe, qui correspond aux droits attribués à l'ensemble des utilisateurs du groupe Unix spécifié (icigroupe
) :
g:groupe:[r|-][w|-][x|-]
- et obligatoirement le champ commençant par
m
(comme mask), qui définit les droits maximaux (ou effectifs) des utilisateurs concernés par les champsu:login:…
et/oug:groupe:…
. Il est conseillé de donner au masque les droits les plus élevés (m::rwx
) pour ne pas restreindre les droits donnés à unlogin
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.
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.
$ 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 $ 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, si login1
veut donner des droits d'accès en lecture et écriture à l'utilisateur login2
sur son répertoire DIR_login1
, il doit utiliser la commande setfacl
suivante :
[login1@hostname:~]$ cd $DIR_login1 [login1@hostname:~]$ setfacl --set=u::rwx,u:login2:rwx,g::r-x,o::---,m::rwx .
Il pourra ensuite contrôler les droits ACL positionnés avec la commande getfacl
:
[login1@hostname:~]$ getfacl . # file: . # owner: login1 # group: grp user::rwx user:login2:rwx group::r-x mask::rwx other::---
Remarques :
- avec le champ (obligatoire)
u::rwx
, le propriétairelogin1
a les droitsrwx
sur son répertoireDIR_login1
. 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 droitsr-x
: ils peuvent donc traverser le répertoire et voir son contenu mais pas y écrire; - avec le champ (obligatoire)
o::---
, aucun autre utilisateur n'a le moindre droit sur ce répertoire; - avec le champ spécifié
u:login2:rwx
,login1
ajoute les droitsrwx
uniquement pour l'utilisateurlogin2
: celui-ci peut donc lire et écrire dans le répertoireDIR_login1
; - ne pas oublier le masque (champ
m::rwx
) : s'il est vide (m::---
) alors le champsu:login2:rwx
est inopérant.
ATTENTION :
- il ne faut pas utiliser le chemin complet de votre
HOME
, car vous positionneriez les ACL non pas uniquement votreHOME
lui-même, mais aussi sur tous les répertoires et les fichiers qu'il contient. Par conséquent, évitez ce type de commande :$ setfacl --set=u::rwx,u:login2:rwx,g::r-x,o::---,m::rwx /chemin/complet/vers/home
- Une ACL sur votre répertoire
HOME
, impliquant des droits en écriture pour une autre personne, rend le mécanisme d'authentification par clé SSH inopérant (une connexion SSH demandera 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 leHOME
(pas de droit en écriture sauf pour le propriétaire) :$ ls -ld ~ drwxr-xr-x+ 9 login grp 4096 Apr 13 09:42 /chemin/complet/vers/home
Si besoin, la procédure consiste à d'abord activer les ACL, puis à changer ensuite les droits Unix sur votre
HOME
avec la commandechmod 750 ~
qui évite de donner l'accès en écriture à tout le monde:$ cd $HOME $ setfacl --set=u::rwx,u:login2:rwx,g::r-x,o::---,m::rwx . $ chmod 750 ~
Ajout d'un groupe particulier dans une ACL
Par exemple, si login1
veut donner des droits d'accès particuliers au groupe ccc
sur son répertoire DIR_login1
, il doit utiliser la commande setfacl
suivante :
[login1@hostname:~]$ cd $DIR_login1 [login1@hostname:~]$ setfacl --set=u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx .
Il pourra ensuite contrôler les droits ACL positionnés avec la commande getfacl
:
[login1@hostname:~]$ getfacl . # file: . # owner: login1 # group: grp user::rwx group::r-x group:ccc:r-x mask::rwx other::---
Remarques :
- avec le champ (obligatoire)
u::rwx
, le propriétairelogin1
a les droitsrwx
sur son répertoireDIR_login1
. 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 droitsr-x
: ils peuvent donc traverser le répertoire et voir son contenu 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
,login1
ajoute les droitsr-x
pour les utilisateurs appartenant au groupeccc
: ils peuvent donc traverser le répertoire et voir son contenu mais pas y écrire; - ne pas oublier le masque (champ
m::rwx
) : s'il est vide (m::---
) alors le champg:ccc:r-x
est inopérant.
ATTENTION :
- Il ne faut pas utiliser le chemin complet de votre
HOME
car vous positionneriez les ACL non pas uniquement sur votreHOME
lui-même, mais aussi sur tous les répertoires et les fichiers qu'il contient. Par conséquent, évitez ce type de commande :$ setfacl --set=u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx /chemin/complet/vers/home
- Une ACL sur votre répertoire
HOME
, impliquant des droits en écriture pour une autre personne, rend le mécanisme d'authentification par clé SSH inopérant (une connexion SSH demandera 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 leHOME
(pas de droit en écriture sauf pour le propriétaire) :$ ls -ld ~ drwxr-xr-x+ 9 login grp 4096 Apr 13 09:42 /chemin/complet/vers/home
Si besoin, la procédure consiste à d'abord activer les ACL, puis à changer ensuite les droits Unix sur votre
HOME
avec la commandechmod 750 ~
qui évite de donner l'accès en écriture à tout le monde:$ cd $HOME $ setfacl --set=u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx . $ chmod 750 ~
Mise à jour d'une ACL
Pour modifier les ACL, vous pouvez utiliser la commande setfacl
avec soit :
- l'option
--set=...
: les ACL existants sont alors écrasés. Dans ce cas, il faut toujours au moins spécifier les champsu::rwx
,g::...
,o::---
et le masquem::rwx
pour être sûr que les ACL positionnés pour le(s) login(s) et/ou le(s) groupe(s) spécifé(s) seront réellement effectifs. - l'option
-m ...
: les ACL existants sont alors modifiés.
Dans un premier temps, on positionne des ACL sur le répertoire MY_DIR
pour le groupe Unix ccc
via l'option --set=
ce qui oblige à tout spécifier :
$ cd MY_DIR $ setfacl --set=u::rwx,g::r-x,g:ccc:r-x,o::---,m::rwx . $ getfacl . # file: . # owner: login1 # group: grp user::rwx group::r-x group:ccc:r-x mask::rwx other::---
Puis on modifie les ACL en remplaçant le groupe Unix ccc
par ddd
via l'option --set=
ce qui oblige encore à tout spécifier :
$ cd MY_DIR $ setfacl --set=u::rwx,g::r-x,g:ddd:r-x,o::---,m::rwx . $ getfacl . # file: . # owner: login1 # group: grp user::rwx group::r-x group:ddd:r-x mask::rwx other::---
Cette fois, on modifie les ACL en ajoutant un second groupe bbb
mais via l'option -m
ce qui évite de tout spécifier :
$ cd MY_DIR $ setfacl -m g:bbb:r-x . $ getfacl . # file: . # owner: login1 # group: grp user::rwx group::r-x group:bbb:r-x group:ddd:r-x mask::rwx other::---
Supression d'une ACL
Pour supprimer les ACL, vous pouvez utiliser la commande setfacl
avec l'option -b
:
$ cd MY_DIR $ ls -ld . drwxr-x---+ 2 login1 grp 8192 2014-03-29 11:00 . $ getfacl . # file: . # owner: login1 # group: grp user::rwx group::r-x group:ccc:r-x mask::rwx other::--- $ setfacl -b . $ ls -ld . drwxr-x--- 2 login1 grp 8192 2014-03-29 11:00 . $ 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 le répertoire racine de l'arborescence à partager pour en filtrer l'accès, puis de positionner ensuite les droits Unix sur les fichiers et sous-répertoires qu'elle contient à l'aide de la commande chmod
.
Par exemple, le compte login1
désire partager une arborescence de fichiers contenue dans ROOT_TREE
avec le compte login3
et le groupe Unix bbb
:
[login1@hostname:~]$ cd ROOT_TREE [login1@hostname:~]$ setfacl --set=u::rwx,u:login3:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx . [login1@hostname:~]$ ls -l . drwxrwx---+ 0 login1 grp 4096 2014-03-30 11:46 . -rwxr-xrwx 0 login1 grp 1001 2014-03-30 11:46 file1 drwxrwxrwx 0 login1 grp 4096 2014-03-30 11:46 SUB_DIR [login1@hostname:~]$ getfacl . # file: . # owner: login1 # group: grp user::rwx user:login3:rwx group::r-x group:bbb:r-x mask::rwx other::---
Si on analyse ces droits d'accès, on voit que :
- L'utilisateur
login3
a les ACLrwx
sur le répertoireROOT_TREE
et les droits Unixrwx
(champ other) sur le fichierfile1
. Il peut ainsi accéder en lecture et écriture au fichierfile1
contenu dans leROOT_TREE
delogin1
. Notez qu'il peut aussi créer de nouveaux fichiers et des répertoires sousROOT_TREE
delogin1
grâce aux ACLrwx
. De plus, il peut aussi voir et modifier le contenu des sous-répertoires tel queSUB_DIR
pour lesquels les droits Unix (champ other) l'y autorisent. - Le groupe propriétaire (
grp
) a les ACLr-x
surROOT_TREE
et les droits Unixr-x
(champ group) sur le fichierfile1
. Les membres du groupegrp
peuvent donc traverserROOT_TREE
et lirefile1
mais pas y écrire (donc pas le modifier). De plus, ils ne peuvent rien créer directement dansROOT_TREE
delogin1
(ACLr-x
). Mais ils peuvent voir et modifier le contenu des sous-répertoires tel queSUB_DIR
pour lesquels les droits Unix (champ group) les y autorisent. - Par contre le groupe
bbb
a les ACLr-x
surROOT_TREE
et les droits Unixrwx
(champ other) sur le fichierfile1
. Les membres du groupebbb
peuvent donc traverserROOT_TREE
et lire ou écrire (donc modifier ou écraser)file1
, ce qui n'est peut-être pas souhaité. Mais, commegrp
, ils ne peuvent rien créer directement dans leROOT_TREE
delogin1
(ACLr-x
). Mais ils peuvent voir et modifier le contenu des sous-répertoires tel queSUB_DIR
pour lesquels les droits Unix (champ other) les y autorisent. - Pour éviter que le groupe
bbb
puisse écraserfile1
, on peut être tenté de supprimer le droit Unix d'écriture dans le champ other avec la commandechmod 755 file1
. Mais ceci empêcherait alors aussilogin3
de modifier le fichier.
Dans ce cas, il faut aussi positionner une ACL surfile1
:$ setfacl --set=u::rwx,u:login3:rwx,g::r-x,g:bbb:r-x,o::---,m::rwx file1 $ getfacl file1 # file: file1 # owner: login1 # group: grp user::rwx user:login3:rwx group::r-x group:bbb:r-x mask::rwx 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 ACL. La commande setfacl
modifie les ACL mais aussi les droits Unix. Par contre, la commande Unix chmod
ne modifie que certains champs des ACL.
Pour bien comprendre cette interdépendance il faut détailler la fonctionnalité du masque d'une ACL (champ mask::...
). En effet, les droits effectifs des utilisateurs concernés par les champs user:login:...
, group::...
et group:bbb:...
peuvent être restreints par les droits présents dans le masque.
Action des ACL sur les droits Unix
Par exemple, si l'on positionne des ACL sur le répertoire courant (dans lequel vous êtes) comme indiqué ci-dessous :
$ setfacl --set=u::rwx,u:login3:rwx,g::rwx,g:bbb:rwx,o::---,m::r-x . $ ls -ld . drwxr-x---+ 0 login1 grp 4096 2014-03-30 16:28 . $ getfacl . # file: . # owner: login1 # group: grp user::rwx # indépendant du masque ACL user:login3:rwx # mais droits effectifs r-x en raison du masque ACL group::rwx # mais droits effectifs r-x en raison du masque ACL group:bbb:rwx # mais droits effectifs r-x en raison du masque ACL mask::r-x # masque ACL other::--- # indépendant du masque ACL
Remarques concernant les droits ACL :
- L'utilisateur
login3
, les membres du groupe propriétairegrp
ainsi que ceux du groupebbb
ont comme droits effectifsr-x
et non pasrwx
comme espéré en raison du masque ACL demandém::r-x
. La commandesetfacl
effectue un ET logique bit à bit entre leurs droits ACL respectifs demandésu:login3:rwx
,g::rwx
,g:bbb:rwx
et le masque ACL demandém::r-x
. - Par contre, le masque ACL ne s'applique pas pour déterminer les droits
user::rwx
du propriétaire et les droitsother::---
des utilisateurs qui ne sont pas concernés par les champsuser:login3:rwx
,group::rwx
etgroup:bbb:rwx
. Ce sont les droits ACL demandés viasetfacl
qui s'appliquent (u::rwx
eto::---
).
Remarques concernant les droits Unix :
- Le propriétaire
login1
du répertoire a les droitsrwx
ce qui correspond au champ ACLuser::rwx
. - Le groupe propriétaire
grp
a les droitsr-x
ce qui correspond au masque ACLmask::r-x
lequel définit les droits maximaux des utilisateurs concernés par les champsuser:login3:rwx
,group::rwx
ougroup:bbb:rwx
, - Les utilisateurs n'appartenant pas aux catégories précédentes n'ont aucun droit
---
ce qui correspond au champ ACLother::---
.
Action des droits Unix sur les ACL
Inversement, pour mieux comprendre l'action de la commande chmod
sur le répertoire courant (dans lequel vous êtes) dont l'accès est supposé être contrôlé par ACL, on part de la situation suivante :
$ setfacl --set=u::r-x,u:login3:rwx,g::---,g:bbb:r-x,o::---,m::--- . $ ls -ld . dr-x------+ 15 login1 grp 4096 2014-03-30 16:28 . $ getfacl . # file: . # owner: login1 # group: grp user::r-x # indépendant du masque ACL user:login3:rwx # mais droits effectifs --- en raison du masque ACL group::--- # droits effectifs --- car demandés via setfacl (g::---) group:bbb:r-x # mais droits effectifs --- en raison du masque ACL mask::--- # masque ACL vide other::--- # indépendant du masque ACL
Remarques :
- Vous noterez que les droits effectifs sont vides (car le masque ACL est vide) : le login
login3
et le groupebbb
n'ont donc aucun droit sur le répertoire malgré les champs ACLu:login3:rwx
etg:bbb:r-x
demandés. - Les droits Unix indiqués par la commande
ls -ld .
montrent bien que seul le propriétaire peut accéder au répertoire.
Ensuite, on constate que la commande Unix chmod
modifie les ACLs suivant les options utilisées :
chmod u+rwx
modifie le champuser::...
de l'ACL :$ chmod u+w . $ ls -ld . drwx------+ 15 login1 grp 4096 2014-03-30 16:28 . $ getfacl . # file: . # owner: login1 # group: grp user::rwx # indépendant du masque ACL mais modifié par chmod u+... user:login3:rwx # mais droits effectifs --- en raison du masque ACL group::--- # droits effectifs --- car demandés initialement via setfacl (g::---) group:bbb:r-x # mais droits effectifs --- en raison du masque ACL mask::--- # masque ACL vide other::---
chmod g+rwx
modifie le masque ACL (mask::...
) mais pas le champ ACLgroup::...
. Mais comme le masque influence les droits effectifs des champs ACLgroup::...
,group:bbb:rwx
etuser:login3:rwx
des ACL, le loginlogin3
et le groupebbb
retrouvent leurs droits respectifs initialement demandés dans la commandesetfacl
(champsu:login3:rwx
etg:bbb:r-x
) :$ chmod g+rwx . $ ls -ld . drwxrwx---+ 15 login1 grp 4096 2014-03-30 16:28 . $ getfacl . # file: . # owner: login1 # group: grp user::rwx user:login3:rwx # et droits effectifs rwx en raison du masque ACL modifié group::--- # pas modifié par chmod g+... ! group:bbb:r-x # et droits effectifs r-x en raison du masque ACL modifié mask::rwx # masque ACL modifié par chmod g+... other::---
Remarque : les droits concernant le champ
group::...
des ACL ne peuvent être modifiés que par la commandesetfacl
:$ setfacl -m g::r-x . $ ls -ld . drwxrwx---+ 15 login1 grp 4096 2014-03-30 16:29 . $ getfacl . # file: . # owner: login1 # group: grp user::rwx user:login3:rwx group::r-x # modifiable uniquement par setfacl ! group:bbb:r-x mask::rwx other::---
- La commande
chmod o+rx
modifie le champother::...
des ACL :$ chmod o+rx . $ ls -ld . drwxrwxr-x+ 15 login1 grp 4096 2014-03-30 16:29 . $ getfacl . # file: . # owner: login1 # group: grp user::rwx user:login3:rwx group::r-x group:bbb:r-x mask::rwx other::r-x # modifié par chmod o+...