web-dev-qa-db-fra.com

Rendre tous les nouveaux fichiers d'un répertoire accessibles à un groupe

Supposons que j'ai deux utilisateurs Alice et Bob et un groupe GROUPNAME et un dossier foo, les deux utilisateurs sont membres de GROUPNAME (utilisant Linux et ext3).

Si j'enregistre en tant qu'utilisateur Alice un fichier sous foo, les autorisations sont: -rw-r--r-- Alice Alice. Cependant, est-il possible de réaliser que chaque fichier enregistré sous un sous-répertoire de foo dispose d'autorisations -rwxrwx--- Alice GROUPNAME (c'est-à-dire propriétaire Alice, groupe GROUPNAME)?

132
student

Vous pouvez contrôler les bits d'autorisation attribués avec umask et le groupe en définissant le répertoire setgid sur GROUPNAME.

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

Notez que vous devez faire le chgrp/chmod pour chaque sous-répertoire; il ne se propage pas automatiquement (c'est-à-dire, ni les répertoires existants ni créés ultérieurement sous un répertoire setgid sera setgid , bien que ce dernier soit dans le groupe GROUPNAME).

Notez également que umask est un attribut de processus et s'applique à tous les fichiers créés par ce processus et ses enfants (qui héritent du umask en vigueur dans leur parent à fork() heure) . Les utilisateurs peuvent avoir besoin de définir cela dans ~/.profile, Et peuvent avoir besoin de faire attention aux choses sans rapport avec votre répertoire qui nécessitent des autorisations différentes. modules peut être utile si vous avez besoin de paramètres différents lorsque vous faites des choses différentes.

Vous pouvez mieux contrôler les choses si vous pouvez utiliser les ACL POSIX; il devrait être possible de spécifier à la fois un masque d'autorisations et un groupe, et de les faire se propager de manière sensible. La prise en charge des ACL POSIX est cependant quelque peu variable.

96
geekosaur

Si possible, utilisez listes de contrôle d'accès (ACL) .

Sous Linux, assurez-vous que le système de fichiers que vous utilisez prend en charge les ACL (la plupart des systèmes de fichiers Unix le font). Vous devrez peut-être modifier les options de montage pour activer les ACL: avec ext2/ext3/ext4, vous devez spécifier explicitement l'option de montage acl, donc l'entrée dans /etc/fstab devrait ressembler à /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Courir mount -o remount,acl / pour activer les ACL sans redémarrer. Installez également les outils de ligne de commande ACL getfacl et setfacl, généralement fournis dans un package appelé acl.

Maintenant que la configuration unique est terminée, modifiez la liste de contrôle d'accès du répertoire pour accorder au groupe des autorisations d'écriture et pour que ces autorisations soient héritées par les fichiers nouvellement créés. Sous Linux:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

Si les ACL ne sont pas une option, rendez le répertoire appartenant au groupe GROUPNAME et définissez ses autorisations sur 2775 ou 2770: chmod g+rwxs /path/to/directory. s signifie ici le bit setgid; pour un répertoire, cela signifie que les fichiers créés dans ce répertoire appartiendront au groupe propriétaire du répertoire.

Vous devrez également définir Alice et Bob's mask pour rendre tous leurs fichiers inscriptibles en groupe par défaut. Le umask par défaut sur la plupart des systèmes est 022, ce qui signifie que les fichiers peuvent avoir toutes les autorisations sauf l'écriture par groupe et autres. Remplacez-le par 002, ce qui signifie interdire uniquement l'autorisation d'écriture par un autre. Vous mettriez généralement ce paramètre dans votre ~/.profile:

umask 002    # or 007 to have files not readable by others

Cette question convient parfaitement à linux acl . Puisque vous ne précisez pas votre système d'exploitation, je suppose que Linux dans ce qui suit. Voici un exemple de session.

Je ne connais pas de très bon tutoriel acl, mais vous pourriez faire pire que http://www.vanemery.com/Linux/ACL/linux-acl.html

Notez que le acl par défaut se comporte comme un umask local. Puisqu'au moins sous Linux, les umasks sont appliqués globalement, c'est le seul moyen que je connaisse pour obtenir l'effet d'un umask local. Pour une raison quelconque, c'est une fonctionnalité peu connue. Le net est jonché de gens qui demandent une surcharge umask locale, mais presque personne ne semble penser à utiliser acl.

Notez également que vous devez monter la partition dans laquelle vous travaillez avec le support acl, par exemple.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

La session suit:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Définissez le groupe de foo sur staff et définissez acl de groupe et utilisateur de foo sur rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Définissez également les acls par défaut de l'utilisateur et du groupe sur rwx. Cela définit les autorisations que les fichiers et répertoires héritent de foo. Ainsi, tous les fichiers et répertoires créés sous foo auront des autorisations de groupe rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Créez maintenant des fichiers dans foo en tant qu'utilisateurs faheem et john.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Lister les fichiers. Notez que les fichiers appartenant à faheem et les fichiers appartenant à john sont créés avec les autorisations de groupe rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
24
Faheem Mitha