Définition de listes de contrôle d'accès différentes sur les répertoires et fichiers

15

Je veux configurer des autorisations par défaut pour un partage de fichiers afin que tout le monde puisse rwxtous les répertoires et que tous les fichiers nouvellement créés le soient rw.

Tous ceux qui accèdent à ce partage sont dans le même groupe, donc ce n'est pas un problème.

J'ai envisagé de le faire via des ACL sans changer tous les umasks des utilisateurs et autres. Voici mes invocations actuelles:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Mon problème est que même si je veux que tous les sous-répertoires nouvellement créés soient rwx, je veux seulement que les fichiers nouvellement créés le soient rw.

Quelqu'un at-il une meilleure méthode pour atteindre le résultat final souhaité? Existe-t-il un moyen de définir des listes de contrôle d'accès sur les répertoires séparément des fichiers, dans la même veine que chmod +xcontre chmod +X?

Merci

durandal
la source

Réponses:

12

Comme le souligne Gilles, les setfaclautorisations par défaut spécifient les autorisations maximales, remplaçant essentiellement le umask. Ainsi, les fichiers nouvellement créés le seront rwsauf si l'application qui a créé le fichier a demandé spécialement qu'il soit exécutable.

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

Notez les perms effectifs ci-dessus. (Il n'y a que quelques programmes qui demanderont de définir le bit d'exécution sur les fichiers qu'il crée, par exemple gccpour les exécutables et cpsi le fichier copié était exécutable.)

Ou vouliez-vous dire que la première commande setfacl fonctionnait comme vous le vouliez, mais pas la seconde? En d'autres termes, vous cherchez à corriger les autorisations sur les anciens fichiers, en vous assurant que les répertoires sont traversables, sans donner à d'autres fichiers réguliers des autorisations d'exécution?

Ma version de setfaclpermet Xexactement ce que vous voulez, par exemple:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

Si votre version de setfaclne prend pas en charge cela, pourquoi ne pas l'utiliser find?

remplacer les autorisations, en les définissant sur rw pour les fichiers et rwx pour les répertoires

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

définir les autorisations ACL mygroup en fonction des autorisations de groupe existantes

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Vous voudrez probablement vérifier que le masque de groupe fournit des autorisations effectives. Sinon, vous devrez également exécuter ceci:

$ find . -type d -exec chmod g+rwX '{}' ';'
Mikel
la source
4

Pour les futurs lecteurs, à utiliser setfaclsur des fichiers / dossiers existants sans ajouter le bit exécutable à vos fichiers, la solution est cette partie de la réponse de @ Mikel :

Ma version de setfacl autorise X exactement comme vous le souhaitez, par exemple:

setfacl g:mygroup:rwX

Extrait pertinent de la setfacldocumentation :

Le champ perms est une combinaison de caractères qui indiquent les autorisations: lecture (r), écriture (w), exécution (x), exécution uniquement si le fichier est un répertoire ou dispose déjà d'une autorisation d'exécution pour un utilisateur (X) .

Erik Koopmans
la source
2

Pour autant que je comprends les ACL Linux, setfacl -Rdm g:mygroup:rwx share_namefait exactement ce que vous voulez. Expérience:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

Puis en tant qu'utilisateur différent dans le groupe mygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

Que se passe-t-il?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

L'ACL effective pour mygroupest le résultat de l' ACL_GROUPentrée de for mygroup( rwx) avec l'entrée ACL_MASK ( rw-).

La page de manuel acl (5) explique le calcul sous «Algorithmes de contrôle d'accès». Il n'explique pas comment les ACL_MASKentrées sont générées, mais en pratique, la bonne chose semble se produire.

Gilles 'SO- arrête d'être méchant'
la source