Définition de plusieurs groupes en tant que propriétaires d'annuaire

31

Sur mon serveur, j'ai un répertoire /srv/svn.

Est-il possible de définir ce répertoire pour avoir plusieurs propriétaires de groupe, par exemple devFirmA, devFirmBet devFirmC?

Le point est, je veux subversioncontrôler la version gérer plusieurs utilisateurs sur plusieurs référentiels et je ne sais pas comment fusionner /srv/svn , le répertoire racine des référentiels, les autorisations. J'ai, par exemple, trois entreprises FirmA, FirmBet FirmC. Maintenant, à l' intérieur , /srv/svnje l' ai créé trois répertoires, FirmA, FirmB, FirmCet à l' intérieur eux , je l' ai créé pour référentiel chaque projet et maintenant je ne sais pas comment établir système d'autorisation puisque tous elementes intérieur /srv/svnappartiennent à root:root, ce qui est correct, ou suis - je faux?

KernelPanic
la source
1
Les groupes d'entreprises accèdent-ils mutuellement aux fichiers? Ou sont-ils complètement séparés, à part le partage d'un répertoire parent?
JM Becker
@TechZilla firm group DOIT Ne pas accéder les uns aux autres, il DOIT être séparé, seulement je dois avoir accès à tous les répertoires.
KernelPanic
OK, j'ai posté la bonne réponse, vous ne devez pas utiliser de listes de contrôle d'accès pour cela. Ils sont une option de dernier recours, ce problème est encore très courant.
JM Becker

Réponses:

16

Il s'agit d'un problème extrêmement courant, si je le comprends bien et que je le rencontre constamment. Si j'utilisais des listes de contrôle d'accès pour chaque problème de regroupement trivial, j'aurais des tonnes de systèmes ingérables. Ils utilisent les meilleures pratiques lorsque vous ne pouvez pas le faire autrement, pas pour cette situation. C'est la méthode que je recommande fortement.

Vous devez d'abord définir votre umask sur 002, afin qu'un groupe puisse partager avec lui-même. Je crée généralement un fichier comme /etc/profile.d/firm.sh, puis j'ajoute une commande de test avec l'umask.

[ $UID -gt 10000 ] && umask 002

Ensuite, vous devez définir les répertoires dans leurs groupes respectifs,

chgrp -R FirmA /srv/svn/FirmA 
chgrp -R FirmB /srv/svn/FirmB
chgrp -R FirmC /srv/svn/FirmC

Enfin, vous devez définir correctement le bit SGID, afin que le groupe reste toujours celui que vous avez défini. Cela empêchera un fichier écrit d'être défini sur le GID de l'auteur.

find /srv/svn/FirmA -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmB -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmC -type d -print0 | xargs -0 chmod 2775

find /srv/svn/FirmA -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmB -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmC -type f -print0 | xargs -0 chmod 664

Maintenant enfin si vous voulez empêcher les autres utilisateurs d'accéder aux répertoires.

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC
JM Becker
la source
2
Avertissement: cela devrait fonctionner mais supprime le bit de permission d'exécution sur tous les fichiers. C'est correct si votre arborescence de répertoires ne contient que des documents. S'il contient des fichiers exécutables, cela empêchera l'exécution, ce qui peut ruiner votre configuration.
Stéphane Gourichon
1
C'est peut-être aussi une bonne idée, mais cela ne répond pas du tout à la question.
ceving
Comme décrit, cela ne partitionne que les trois dossiers afin que seuls les membres de chaque entreprise puissent modifier uniquement leurs fichiers respectifs - cela ne donne pas à «svn» l'accès dont il a besoin.
riche p
C'est très proche cependant. Ce qui manque, c'est de vous donner accès à tous les groupes. Ajoutez cette étape, en supposant que votre connexion est svnadmin: sudo usermod -a -G FirmA,FirmB,FirmC svnadmin Cela s'ajoutera svnadminà tous ces groupes. Étant donné que les fichiers de tous ces groupes ont activé l'écriture de groupe (c'est chmod 664ce que vous avez fait), vous, ainsi que firmX, serez les seuls auteurs de fichiers appartenant à firmX.
riche p
1
Mieux - changez les permissions pour ajouter / soustraire ce que vous voulez ajouter / soustraire - par exemple fairefind /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
riche p
25

Vous ne pouvez avoir qu'un seul groupe en tant que propriétaire .

Cependant, en utilisant des listes de contrôle d'accès, vous pouvez définir des autorisations pour d'autres groupes.

Vérifiez si ACL est installé en émettant la commande getfacl. Si votre système n'a pas installé ACL, installez les outils de ligne de commande qui sont dans le aclpackage avec:sudo apt-get install acl

Avec getfaclvous pouvez lire les informations ACL d'un répertoire ou d'un autre fichier, et avec setfaclvous pouvez ajouter des groupes à un fichier.

Par exemple:

setfacl -m g:devFirmB:rwx /srv/svn/  

Ajoute le groupe devFirmBavec r ead, w rite, e x autorisations ecute au répertoire /srv/svn.

Si vous souhaitez également que les fichiers créés dans ce répertoire appartiennent à plusieurs groupes, définissez l'ACL comme ACL par défaut. L' Xentrée dans le groupe par défaut signifie «autoriser l'exécution si exécutable par le propriétaire (ou toute autre personne)».

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  
jcbermu
la source
6

Il n'est pas possible d'avoir un fichier appartenant à plusieurs groupes Linux avec des autorisations Unix traditionnelles. (Cependant, c'est possible avec ACL .)

Mais vous pouvez utiliser la solution de contournement suivante et créer un nouveau groupe (par exemple appelé devFirms) qui inclura tous les utilisateurs des groupes devFirmA, devFirmBet devFirmC.
Vous créez de nouveaux groupes d'utilisateurs avec:

sudo addgroup NEWGROUPNAME

Tout d'abord, vous devrez peut-être installer id-utilspour obtenir la lidcommande-:

sudo apt-get install id-utils

Ensuite , vous pouvez exécuter la ligne de code suivante pour copier facilement tous les utilisateurs de SOURCEGROUPà TARGETGROUP. Bien sûr, vous devez exécuter la commande une fois pour chaque groupe que vous souhaitez copier. N'oubliez pas de remplacer les espaces réservés capitalisés par les noms de groupe réels.

for u in $(lid -g -n SOURCEGROUP); do sudo usermod -a -G TARGETGROUP $u; done

Donc, dans votre cas, vous devrez exécuter la commande (toutes les lignes à la fois):

sudo addgroup devFirms &&
for u in $(lid -g -n devFirmA); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmB); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmC); do sudo usermod -a -G devFirms $u; done

Notez que ces commandes copient uniquement tous les utilisateurs qui sont actuellement membres des groupes source. Chaque utilisateur qui sera ajouté plus tard devra également être ajouté manuellement à votre groupe commun avec la addusercommande. Remplacez encore une fois les espaces réservés en majuscule par le nom d'utilisateur et de groupe réel ( devFirms):

sudo adduser NEWUSER TARGETGROUP

Merci à Justin Ethier pour sa réponse sur Unix & Linux.SE: Ajouter tous les utilisateurs d'un groupe à un autre groupe?

Byte Commander
la source
@Gilles pensez-vous que votre schéma fonctionnerait pour le serveur Subversion avec plusieurs référentiels avec plusieurs utilisateurs comme dans ma mise à jour de la question?
KernelPanic
2

Non, ce n'est pas possible.

Chaque fichier (et donc aussi les répertoires) ne peut avoir qu'un seul utilisateur et un seul groupe.

Uwe Plonus
la source
6
Fournir une approche alternative pour obtenir le même résultat ou un résultat similaire serait bien.
Byte Commander
2

Afin de fournir des droits différents à plusieurs groupes ou utilisateurs, utilisez les commandes suivantes (testées sur RHEL 6 et 7):

Pour faire un nouveau propriétaire du groupe:

setfacl -m g:<group_name>:<rights you want to give eg.rwx> -R <directory_name>

Pour vérifier les paramètres actuels d'ACL:

getfacl <directory_name>
Mr.H
la source
Testé, fonctionne également sur Ubuntu 16.04.3
Dmitry