Comment accorder la lecture / écriture à un utilisateur spécifique dans un sous-répertoire existant ou futur d'un répertoire donné?

8

J'héberge mon propre référentiel git sur un VPS. Disons que mon utilisateur est John.

J'utilise le protocole ssh pour accéder à mon référentiel git, donc mon URL ressemble à quelque chose ssh://[email protected]/path/to/git/myrepo/.

Root est le propriétaire de tout ce qui est sous /path/to/git

J'essaie de donner un accès en lecture / écriture à John à tout ce qui est sous /path/to/git/myrepo

J'ai essayé les deux chmodet setfaclcontrôler l'accès, mais les deux échouent de la même manière: ils appliquent les droits de manière récursive (avec les bonnes options) à tous les sous - répertoires existants actuels/path/to/git/myrepo , mais dès qu'un nouveau répertoire est créé, mon utilisateur ne peut pas écrire dans le nouveau répertoire.

Je sais qu'il y a des hooks dans git qui me permettraient de réappliquer les droits après chaque commit, mais je commence à penser que je vais dans le mauvais sens car cela semble trop compliqué pour un objectif très basique.

Q : Comment dois-je configurer mon droit d'accorder l'accès rw à john à tout ce qui se trouve en dessous /path/to/git/myrepoet le rendre résistant aux changements de structure d'arbre?

Q2 : Si je devais prendre du recul pour changer l'approche générale, dites-le moi.

Edit : La question a été répondue telle quelle, mais ce n'était pas la bonne question. La bonne question aurait été "Comment configurer un dépôt bare git sur le serveur pour l'utiliser avec un accès ssh?". Voir ma propre réponse.

Samuel Rossille
la source

Réponses:

5

créez un groupe myrepouserspar exemple, et ajoutez vos utilisateurs git à ce groupe.

Ensuite, changez le groupe de tout sous / path / en / git / myrepo en myrepousers:

chown -R .myrepousers /path/to/git/myrepo

Ensuite, corrigez les autorisations:

chmod -R g+w /path/to/git/myrepo
find /path/to/git/myrepo -type d -exec chmod -R {} g+s \;

Doit être réglé.

Serge
la source
2
Si vous voulez comprendre ce qui se passe ici Samuel, Google pour "setgid". La magie est ici dans le g+s. Bien sûr, vous devrez d'abord comprendre les bases de chmodtrop.
iconoclaste
Je pensais que j'avais compris comment faire cela avec + s sur le répertoire mais il ne faisait pas ce que j'attendais: les autorisations n'étaient pas transmises aux nouveaux répertoires. Que signifient les derniers et troisièmes derniers jetons: {} et \ Merci d'avance.
Samuel Rossille
{}- est un espace réservé pour la substitution de nom de fichier. ;est le terminateur de la commande exécutée par -exec. Comme cela ;a une signification particulière, bashil doit être échappé avec \. voir man findpour plus de détails
Serge
4

En fait, ce n'était pas la bonne approche. Après des recherches supplémentaires, j'ai découvert que dans mon cas, je dois utiliser les fonctionnalités de build de git pour gérer le droit du système de fichiers dans le référentiel.

Cela se fait essentiellement avec l' sharedoption de git init, qui peut avoir (entre autres) les valeurs suivantes:

  • group: initialise le référentiel pour que les fichiers et les répertoires aient un accès en écriture aux utilisateurs et aux groupes, et que tout le monde ait un accès en lecture
  • 0660: même mais sans accès en lecture pour les autres.

Les répertoires et fichiers nouvellement créés disposent automatiquement des autorisations appropriées. Vous pouvez également utiliser git initsur un référentiel existant pour le reconfigurer sans perdre son contenu.

Donc à la fin ce que je devais faire:

  • Créer un groupe mygitrepo
  • Ajoutez-y des utilisateurs
  • chmod -R le dépôt git pour root:mygitrepo

Et maintenant, tous les utilisateurs du groupe peuvent tirer / pousser, et personne d'autre ne le peut, et cela sans se soucier des droits du système de fichiers.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html pour plus d'informations.

Samuel Rossille
la source
2

Si les ACL sont prises en charge, vous pouvez le faire avec les ACL par défaut. Attention, il est facile de les oublier car ils n'apparaissent pas lorsque vous faites un ls -l.

find /path/to/git/myrepo -type d -exec setfacl -m d:u:john:rwx {} +

Mais je suppose que vous voudrez peut-être faire quelque chose d'un peu plus organisé. Le déploiement de gitolite peut fournir une meilleure solution.

Stéphane Chazelas
la source
1
Au moins avec Debian Wheezy ls(et je pense que Squeeze aussi), vous obtenez +à la fin des autorisations de dire qu'il y a une ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert
Merci, cela fonctionne, mais pourriez-vous s'il vous plaît clarifier la signification des deux derniers jetons: {} +
Samuel Rossille
C'est la find ... -exec cmd {} +syntaxe, où {}est remplacé par autant de noms de fichiers trouvés que possible (comme oppsed à {} \;{}n'est remplacé que par un fichier trouvé à la fois)
Stéphane Chazelas