web-dev-qa-db-fra.com

Obtention de nouveaux fichiers pour hériter des autorisations de groupe sous Linux

J'ai un problème avec les autorisations sur un serveur Linux. Je suis habitué à BSD. Lorsqu'un répertoire appartient à un groupe, l'utilisateur qui le possède n'appartient pas à www-data, par exemple, les fichiers créés dans celui-ci appartiennent à ce groupe. Ceci est important car je veux que les fichiers soient lisibles par le serveur web (que je ne lancerai pas en tant que root) mais donc un utilisateur peut toujours mettre de nouveaux fichiers dans le répertoire. Je ne peux pas mettre les utilisateurs dans www-data car ils peuvent alors lire tous les sites Web des autres utilisateurs.

Je veux que le serveur Web lise tous les sites Web, je veux que les utilisateurs puissent changer les leurs.

Les autorisations sont définies comme ceci sur les dossiers en ce moment ....

drwxr-x--- 3 john www-data 4096 Feb 17 21:27 john

C'est un comportement standard sur BSD que les autorisations fonctionnent de cette façon. Comment puis-je demander à Linux de faire cela?

96
John Tate

Il semble que vous décriviez la fonctionnalité setgid bit où lorsqu'un répertoire qui l'a défini, forcera tous les nouveaux fichiers créés à l'intérieur d'avoir leur groupe défini sur le même groupe défini sur le répertoire parent .

Exemple

$ whoami
saml

$ groups
saml wheel wireshark

configurer un répertoire avec des perms + des propriétaires

$ Sudo mkdir --mode=u+rwx,g+rs,g-w,o-rwx somedir
$ Sudo chown saml.Apache somedir
$ ll -d somedir/
drwxr-s---. 2 saml Apache 4096 Feb 17 20:10 somedir/

touchez un fichier comme saml dans ce répertoire

$ whoami
saml

$ touch somedir/afile
$ ll somedir/afile 
-rw-rw-r--. 1 saml Apache 0 Feb 17 20:11 somedir/afile

Cela vous donnera approximativement ce que cela ressemble à ce que vous voulez. Si vous voulez vraiment exactement ce que vous avez décrit, je pense que vous devrez recourir à la fonctionnalité de listes de contrôle d'accès pour obtenir cela (ACL).

ACL

Si vous souhaitez obtenir un peu plus de contrôle sur les autorisations sur les fichiers qui sont créés dans le répertoire, somedir, vous pouvez ajouter la règle ACL suivante pour définir les autorisations par défaut comme ceci.

avant

$ ll -d somedir
drwxr-s---. 2 saml Apache 4096 Feb 17 20:46 somedir

définir les autorisations

$ Sudo setfacl -Rdm g:Apache:rx somedir
$ ll -d somedir/
drwxr-s---+ 2 saml Apache 4096 Feb 17 20:46 somedir/

Remarquez le + à la fin, cela signifie que ce répertoire a des listes de contrôle d'accès qui lui sont appliquées.

$ getfacl somedir
# file: somedir
# owner: saml
# group: Apache
# flags: -s-
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:Apache:r-x
default:mask::r-x
default:other::---

après

$ touch somedir/afile
$ ll somedir/afile 
-rw-r-----+ 1 saml Apache 0 Feb 17 21:27 somedir/afile
$ 

$ getfacl somedir/afile
# file: somedir/afile
# owner: saml
# group: Apache
user::rw-
group::r-x              #effective:r--
group:Apache:r-x        #effective:r--
mask::r--
other::---

Remarquez avec les autorisations par défaut (setfacl -Rdm) défini de sorte que les autorisations soient (r-x) par défaut (g:Apache:rx). Cela force tout nouveau fichier à avoir uniquement son bit r activé.

134
slm

TL: DR; pour que les fichiers new héritent du groupe du dossier conteneur, faites:

$ chmod g+s somefolder

Remarque: son implicite dans la réponse acceptée, ce n'est qu'un extrait.

49
alo Malbarez

En complément de la réponse de slm, notez que, sur un système de fichiers ext2/3/4, vous pouvez répliquer le comportement BSD que vous décrivez en utilisant l'option de montage bsdgroups sur la partition. Depuis la page de manuel mount(1):

grpid|bsdgroups and nogrpid|sysvgroups
              These options define what group id a newly  created  file  gets.
              When  grpid  is  set,  it takes the group id of the directory in
              which it is created; otherwise (the default) it takes the  fsgid
              of  the current process, unless the directory has the setgid bit
              set, in which case it takes the gid from the  parent  directory,
              and also gets the setgid bit set if it is a directory itself.
10
user60039