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

131

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

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

étudiant
la source

Réponses:

91

Vous pouvez contrôler les bits d'autorisation attribués avec umask, et le groupe en faisant le répertoire setgid à 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/ chmodpour chaque sous-répertoire; il ne se propage pas automatiquement (c’est-à-dire que ni les répertoires existants, ni ceux créés par la suite dans un répertoire setgid ne seront setgid , bien que ce dernier soit dans un groupe GROUPNAME).

Notez également qu’il umasks’agit d’un attribut de processus et s’applique à tous les fichiers créés par ce processus et ses enfants (qui héritent de l’ umaskeffet actif dans leur parent à la fork()fois). Les utilisateurs peuvent avoir besoin de définir ceci ~/.profile, et de faire attention aux éléments non liés à votre répertoire qui nécessitent des autorisations différentes. les modules peuvent être utiles si vous avez besoin de paramètres différents pour différentes tâches.

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 propager de manière sensée. La prise en charge des ACL POSIX est toutefois quelque peu variable.

geekosaur
la source
6
Les sous-répertoires créés après la définition de setgid sur le répertoire parent auront setgid défini automatiquement.
Arrowmaster
2
@Arrowmaster: Sur certains systèmes, peut-être, mais pas tous; J'ai testé sur OSX et cela ne se propage pas, du moins pour les utilisateurs non root.
geekosaur
2
Bien sur Debian (et je suppose que la plupart des autres distributions Linux), le setgid et le nom du groupe se propagent.
Arrowmaster
3
Sous OS X, le bit setgid d’un répertoire est simplement ignoré; les nouveaux fichiers et répertoires ont toujours le groupe de leurs répertoires.
John Flatness
Est-il également possible que les fichiers copiés ou déplacés vers foo (à l'aide de cp ou mv) obtiennent automatiquement les autorisations souhaitées ( -rwxrwx--- A G)?
étudiant
106

Si possible, utilisez des 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 listes de contrôle d'accès: avec ext2 / ext3 / ext4, vous devez spécifier l' acloption de montage de manière explicite; l'entrée /etc/fstabdoit donc ressembler à /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Exécuter mount -o remount,acl /pour activer les ACL sans redémarrer. Installez également les outils de ligne de commande ACL getfaclet 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 attribuer des autorisations d'écriture au groupe et pour rendre ces autorisations héritées des nouveaux fichiers créés. Sous Linux:

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

Si ACLs ne sont pas une option, rendre le répertoire propriété du groupe GROUPNAME, et définir ses autorisations à 2775 ou 2770: chmod g+rwxs /path/to/directory. Le sici signifie le bit setgid; pour un répertoire, cela signifie que les fichiers créés dans ce répertoire appartiendront au groupe qui en est le propriétaire.

Vous devez également configurer umask d’ Alice et Bob pour que tous leurs fichiers puissent être écrits en groupe par défaut. La valeur par défaut umask sur la plupart des systèmes est 022, ce qui signifie que les fichiers peuvent avoir toutes les autorisations sauf écrire par groupe et autre. Changez cela en 002, ce qui signifie d'interdire uniquement les autorisations 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
Gilles
la source
6
+1 - Réponse très complète. Je n'ai jamais su que l'on pourrait remonter / à la volée. Bon à savoir.
boehj
1
Cette commande setfacl -d ne fonctionne pas pour moi car les fichiers contenus dans ce répertoire ont un masque r-- qui annule toutes les autorisations en écriture. J'aimerais de l'aide. Voir unix.stackexchange.com/questions/71743/…
Ben McCann
2
@its_me Q1: Je montre une mountcommande avec l' remountoption, donc elle ne l'utilise pas fstab. Avoir acldeux fois signifie que le système de fichiers a déjà été monté avec l' acloption, ce qui est inoffensif. Soit dit en passant, acl la valeur par défaut pour ext4 dans les noyaux récents (le correctif était encore neuf à l'époque où j'ai écrit cette réponse). Q2: Vous pouvez exécuter les commandes dans l'un ou l'autre ordre.
Gilles
1
@its_me Oui, votre compréhension est correcte, c'est juste que l'ordre dans lequel vous ajoutez les entrées n'a pas d'importance
Gilles
8
vous devriez améliorer la réponse puis utiliser à la GROUPNAMEplace de G, pour la rendre plus claire
knocte
24

Cette question est un bon moyen pour Linux acl. Puisque vous n’indiquez pas votre système d’exploitation, je présumerai que Linux est la suivante. Voici un exemple de session.

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

Notez que le aclcomportement par défaut se comporte comme un umask local. Comme au moins sous Linux, les masques sont appliqués globalement, c’est le seul moyen que je connaisse pour obtenir l’effet d’un umask local. Pour une raison quelconque, cette caractéristique est peu connue. Le réseau est encombré de personnes qui demandent des informations sur une substitution umask locale, mais presque personne ne semble penser à les utiliser acl.

Notez également que vous devez monter la partition sur laquelle vous travaillez 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 foosur staffet les paramètres acl du groupe et de l'utilisateur foosur 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 valeurs par défaut de l'utilisateur et du groupe rwx. Cela définit les autorisations dont les fichiers et les répertoires héritent 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::---

Maintenant, créez des fichiers en footant qu’utilisateurs faheemet john.

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

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Liste des fichiers. Notez que les fichiers appartenant à faheemet aux fichiers appartenant à johnsont créés avec des 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
Faheem Mitha
la source