Lors de l'installation et de la configuration d'un serveur Git, la question de l'organisation de l'accÚs pour plusieurs utilisateurs à plusieurs projets se pose. J'ai mené des recherches et trouvé une solution qui répond à toutes mes exigences : simple, sécurisée et fiable.
Mes souhaits sont les suivants :
- chaque utilisateur se connecte avec son propre compte
- plusieurs utilisateurs peuvent travailler sur un mĂȘme projet
- un mĂȘme utilisateur peut travailler sur plusieurs projets
- chaque utilisateur a accĂšs uniquement aux projets sur lesquels il travaille
- il doit ĂȘtre possible de se connecter via la ligne de commande, et pas seulement par une interface web
Il serait également bien de :
- fournir des droits en lecture seule pour les superviseurs
- administrer facilement les droits d'accĂšs des utilisateurs dans Git
Aperçu des options d'accÚs au serveur GIT
Tout d'abord, il faut savoir ce qu'il y a Ă choisir, d'oĂč une brĂšve prĂ©sentation des protocoles Git.
- ssh - un compte utilisateur spécifiquement créé est utilisé pour accéder au serveur.
- Il est étrange que Git ne recommande pas l'utilisation d'un seul compte pour accéder à tous les dépÎts. Cela ne correspond pas à mes exigences.
- Il est possible d'utiliser plusieurs comptes, mais comment restreindre l'accÚs d'un utilisateur à seulement certains répertoires ?
- Limiter l'accÚs au répertoire personnel n'est pas adéquat, car il est difficile d'organiser l'accÚs en écriture pour d'autres utilisateurs.
- L'utilisation de liens symboliques depuis le répertoire personnel est également difficile car Git ne les interprÚte pas comme des liens.
- Restreindre l'accÚs à l'interpréteur, c'est possible, mais il n'y a pas de garantie que cela fonctionnera toujours.
- On peut mĂȘme connecter un interprĂ©teur de commandes spĂ©cifique pour ces utilisateurs, mais,
- d'une part, c'est déjà une solution complexe,
- et d'autre part, cela peut ĂȘtre contournĂ©.
- On peut mĂȘme connecter un interprĂ©teur de commandes spĂ©cifique pour ces utilisateurs, mais,
Mais peut-ĂȘtre que ce n'est pas un problĂšme que l'utilisateur puisse exĂ©cuter n'importe quelle commande ?... En tout cas, on ne peut pas exclure ce moyen, il suffit de trouver comment l'utiliser. Revenons Ă cette mĂ©thode plus tard, pour l'instant, examinons briĂšvement les autres alternatives, peut-ĂȘtre qu'il y a quelque chose de plus simple.
- Le protocole git local peut ĂȘtre utilisĂ© en conjonction avec sshfs, permettant plusieurs utilisateurs, mais en essence, c'est la mĂȘme chose que le cas prĂ©cĂ©dent.
- http â en lecture seule
- git â en lecture seule
- https â difficile Ă installer, nĂ©cessite un logiciel supplĂ©mentaire, quelque chose. le panneau de contrĂŽle Pour organiser l'accĂšs des utilisateurs⊠cela semble rĂ©alisable, mais c'est un peu compliquĂ©.
Utilisation du protocole ssh pour organiser l'accĂšs multi-utilisateurs au serveur Git
Retour au protocole ssh.
Ătant donnĂ© que l'accĂšs ssh est utilisĂ© pour git, il est nĂ©cessaire d'assurer la sĂ©curitĂ© des donnĂ©es du serveur. L'utilisateur qui se connecte via ssh utilise son propre identifiant sur le serveur Linux, donc il peut se connecter via un client ssh et accĂ©der Ă la ligne de commande du serveur.
Il n'y a pas de protection complĂšte contre l'accĂšs ainsi obtenu.
Mais pour l'utilisateur, les fichiers Linux ne doivent pas ĂȘtre intĂ©ressants. Les informations significatives ne sont stockĂ©es que dans le dĂ©pĂŽt git. Par consĂ©quent, l'accĂšs via la ligne de commande peut ne pas ĂȘtre limitĂ©, mais les moyens Linux devraient interdire Ă l'utilisateur de voir les projets, sauf ceux auxquels il participe.
Il est évident d'utiliser le systÚme de droits d'accÚs Linux.
Comme déjà mentionné, il est possible d'utiliser un seul compte pour l'accÚs ssh. Cette configuration est peu sûre pour plusieurs utilisateurs, bien que cette méthode soit incluse dans la liste des options recommandées par git.
Pour réaliser les exigences énoncées au début de l'article, la structure de répertoires suivante est créée avec des droits et des propriétaires attribués :
1) répertoires des projets
dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
âŠ
oĂč
dir1, dir2, dir3 â rĂ©pertoires des projets : projet 1, projet 2, projet 3.
proj1:proj1, proj2:proj2, proj3:proj3 â utilisateurs Linux spĂ©cialement créés, qui sont dĂ©signĂ©s comme propriĂ©taires des rĂ©pertoires des projets correspondants.
Les droits sur tous les rĂ©pertoires sont fixĂ©s Ă 0770 â accĂšs complet pour le propriĂ©taire et son groupe et interdiction totale pour tous les autres.
2) comptes des développeurs
Développeur 1 : dev1:dev1,proj1,proj2
Développeur 2 : dev2:dev2,proj2,proj3
Le point clé est que des groupes supplémentaires sont attribués aux développeurs pour le systÚme utilisateur propriétaire du projet correspondant. Cela est fait par l'administrateur du serveur Linux en une seule commande.
Dans cet exemple, « Développeur 1 » travaille sur les projets proj1 et proj2, tandis que « Développeur 2 » travaille sur les projets proj2 et proj3.
Si l'un des DĂ©veloppeurs se connecte via ssh en ligne de commande, ses droits seront insuffisants mĂȘme pour afficher le contenu des rĂ©pertoires des projets auxquels il ne participe pas. Il ne peut pas changer cela lui-mĂȘme.
Ătant donnĂ© que la base de ce principe est la sĂ©curitĂ© fondamentale des droits Linux, ce schĂ©ma est fiable. De plus, il est trĂšs facile Ă administrer.
Passons Ă la pratique.
Création de dépÎts Git sur un serveur Linux
Vérification en cours.
[root@server ~]# cd /var/
[root@server var]# useradd gitowner
[root@server var]# mkdir gitservertest
[root@server var]# chown gitowner:gitowner gitservertest
[root@server var]# adduser proj1
[root@server var]# adduser proj2
[root@server var]# adduser proj3
[root@server var]# adduser dev1
[root@server var]# adduser dev2
[root@server var]# passwd dev1
[root@server var]# passwd dev2
fatigué de taper à la main...
[root@server gitservertest]# sed "s/ /n/g" <<< "proj1 proj2 proj3" | while read u; do mkdir $u; chown $u:$u $u; chmod 0770 $u; done
[root@server gitservertest]# usermod -aG proj1 dev1
[root@server gitservertest]# usermod -aG proj2 dev1
[root@server gitservertest]# usermod -aG proj2 dev2
[root@server gitservertest]# usermod -aG proj3 dev2Nous nous assurons qu'il est impossible d'accĂ©der aux dĂ©pĂŽts d'autres depuis la ligne de commande, mĂȘme pour voir leur contenu.
[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Permission denied
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: impossible d'ouvrir le rĂ©pertoire /var/gitservertest/proj3: Permission deniedCollaboration dans Git entre plusieurs dĂ©veloppeurs sur un mĂȘme projet
Une seule question demeure : si un dĂ©veloppeur ajoute un nouveau fichier, les autres dĂ©veloppeurs ne peuvent pas le modifier, car il en est le propriĂ©taire (par exemple, dev1), et non l'utilisateur-propriĂ©taire du projet (par exemple, proj1). Ătant donnĂ© que nous avons un dĂ©pĂŽt serveur, il est essentiel de comprendre comment est structurĂ©e le rĂ©pertoire « .git » et si de nouveaux fichiers sont créés.
Création d'un dépÎt Git local et push vers le serveur Git
Passons Ă la machine cliente.
Microsoft Windows [Version 6.1.7601]
(c) Microsoft Corporation, 2009. Tous droits réservés.
C:gittest>git init .
DépÎt Git vide initialisé dans C:/gittest/.git/
C:gittest>echo "test dev1 to proj2" > test1.txt
C:gittest>git add .
C:gittest>git status
Sur la branche master
Aucun commit encore
Modifications Ă valider :
(utilisez "git rm --cached ..." pour désélectionner)
nouveau fichier : test1.txt
C:gittest>git commit -am "nouveau fichier de test ajouté"
[master (root-commit) a7ac614] nouveau fichier de test ajouté
1 fichier modifié, 1 insertion(+)
mode de création 100644 test1.txt
C:gittest>git remote add origin "ssh://dev1@10.1.1.11/var/gitservertest/proj2"
C:gittest>git push origin master
dev1:dev1@10.1.1.11's password:
Comptage des objets : 3, fait.
Ăcriture des objets : 100% (3/3), 243 octets | 243.00 KiB/s, fait.
Total 3 (delta 0), réutilisé 0 (delta 0)
Pour ssh://10.1.1.11/var/gitservertest/proj2
* [nouvelle branche] master -> master
C:gittest>En mĂȘme temps, de nouveaux fichiers sont créés sur le serveur, et ils appartiennent Ă l'utilisateur qui a effectuĂ© le push.
[dev1@server proj2]$ tree
.
âââ 1.txt
âââ branches
âââ config
âââ description
âââ HEAD
âââ hooks
â âââ applypatch-msg.sample
â âââ commit-msg.sample
â âââ post-update.sample
â âââ pre-applypatch.sample
â âââ pre-commit.sample
â âââ prepare-commit-msg.sample
â âââ pre-push.sample
â âââ pre-rebase.sample
â âââ update.sample
âââ info
â âââ exclude
âââ objects
â âââ 75
â â âââ dcd269e04852ce2f683b9eb41ecd6030c8c841
â âââ a7
â â âââ ac6148611e69b9a074f59a80f356e1e0c8be67
â âââ f0
â â âââ 82ea1186a491cd063925d0c2c4f1c056e32ac3
â âââ info
â âââ pack
âââ refs
âââ heads
â âââ master
âââ tags
12 répertoires, 18 fichiers
[dev1@server proj2]$ ls -l objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
-r--r--r--. 1 dev1 dev1 54 Jun 20 14:34 objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
[dev1@server proj2]$Lors du téléchargement des modifications vers le serveur, des fichiers et des répertoires supplémentaires sont créés, et leur propriétaire est effectivement l'utilisateur qui effectue le téléchargement. Mais alors, le groupe de ces fichiers et répertoires correspond également au groupe principal de cet utilisateur, c'est-à -dire, le groupe dev1 pour l'utilisateur dev1 et le groupe dev2 pour l'utilisateur dev2 (changer le groupe principal de l'utilisateur développeur ne sera pas utile, car comment alors travailler sur plusieurs projets?). Dans ce cas, l'utilisateur dev2 ne pourra pas modifier les fichiers créés par l'utilisateur dev1, ce qui peut nuire à la fonctionnalité.
Linux chown â changement de propriĂ©taire de fichier par un utilisateur ordinaire
Le propriĂ©taire du fichier ne peut pas modifier son appartenance. Mais il peut changer le groupe du fichier qui lui appartient, et alors ce fichier peut ĂȘtre accessible Ă d'autres utilisateurs qui se trouvent dans ce mĂȘme groupe. C'est exactement ce dont nous avons besoin.
Utilisation de Git hook
Le répertoire de travail pour hook est le répertoire racine du projet. hook est un fichier exécutable qui s'exécute sous l'utilisateur qui effectue le push. En tenant compte de cela, nous pouvons réaliser ce qui est prévu.
[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<> hooks/post-updateou simplement
vi hooks/post-updateRevenons sur la machine cliente.
C:gittest>echo "dev1 3rd line" >> test1.txt
C:gittest>git commit -am "3rd from dev1, testing server hook"
[master b045e22] 3rd from dev1, testing server hook
1 fichier modifié, 1 insertion(+)
C:gittest>git push origin master
dev1:dev1@10.1.1.11's password:
d22c66e..b045e22 master -> masterSur le serveur Git, vérifions aprÚs le commit le fonctionnement du script hook post-update.
[dev1@server proj2]$ find . ! -group proj2
â vide, tout va bien.
Connexion du deuxiÚme développeur dans Git
Simulons le travail du deuxiÚme développeur.
Sur le client
C:gittest>git remote remove origin
C:gittest>git remote add origin "ssh://dev2@10.1.1.11/var/gitservertest/proj2"
C:gittest>echo "!!! dev2 added this" >> test1.txt
C:gittest>echo "!!! dev2 wrote" > test2.txt
C:gittest>git add test2.txt
C:gittest>git commit -am "dev2 added to test1 and created test2"
[master 55d49a6] dev2 added to test1 and created test2
2 fichiers modifiés, 2 insertions(+)
mode de création 100644 test2.txt
C:gittest>git push origin master
dev2@10.1.1.11's password:
b045e22..55d49a6 master -> master
Et en mĂȘme temps, sur le serveurâŠ
[dev1@server proj2]$ find . ! -group proj2
â encore vide, tout fonctionne.
Suppression d'un projet Git et chargement d'un projet depuis le serveur Git
Eh bien, nous pouvons encore une fois nous assurer que tous les changements sont sauvegardés.
C:gittest>rd /S /Q .
Le processus ne peut pas accĂ©der au fichier car ce fichier est occupĂ© par un autre processus.â pour supprimer un projet Git, nous nettoyons simplement le rĂ©pertoire complĂštement. Acceptons l'erreur gĂ©nĂ©rĂ©e, car il est impossible de supprimer le rĂ©pertoire actuel avec cette commande, mais ce comportement est prĂ©cisĂ©ment ce dont nous avons besoin.
C:gittest>dir
Contenu du dossier C:gittest
21.06.2019 08:43 .
21.06.2019 08:43 ..
C:gittest>git clone ssh://dev2@10.1.1.11/var/gitservertest/proj2
Clonage dans 'proj2'...
dev2@10.1.1.11's password:
C:gittest>cd proj2
C:gittestproj2>dir
Contenu du dossier C:gittestproj2
21.06.2019 08:46 .
21.06.2019 08:46 ..
21.06.2019 08:46 114 test1.txt
21.06.2019 08:46 19 test2.txt
C:gittestproj2>type test1.txt
"test dev1 to proj2"
"dev1 added some omre"
"dev1 3rd line"
"!!! dev2 added this"
C:gittestproj2>type test2.txt
"!!! dev2 wrote"Séparation des accÚs dans Git
Assurons-nous maintenant que mĂȘme via Git, le deuxiĂšme dĂ©veloppeur ne peut pas accĂ©der au projet Proj1, sur lequel il ne travaille pas.
C:gittestproj2>git remote remove origin
C:gittestproj2>git remote add origin "ssh://dev2@10.1.1.11/var/gitservertest/proj1"
C:gittestproj2>git push origin master
dev2@10.1.1.11's password:
fatal: '/var/gitservertest/proj1' ne semble pas ĂȘtre un dĂ©pĂŽt git
fatal: Impossible de lire depuis le dépÎt distant.
Veuillez vous assurer que vous disposez des droits d'accĂšs corrects
et que le dépÎt existe.Maintenant, nous donnons accÚs
[root@server ~]# usermod -aG proj1 dev2et aprĂšs cela, tout fonctionne.
C:gittestproj2>git push origin master
dev2@10.1.1.11's password:
Pour ssh://10.1.1.11/var/gitservertest/proj1
* [nouvelle branche] master -> masterInformations supplémentaires
De plus, s'il y a un problÚme avec les droits par défaut lors de la création de fichiers et de répertoires, dans CentOS, on peut utiliser la commande
setfacl -Rd -m o::5 -m g::7 /var/gitservertestVous pouvez également trouver de petites choses utiles dans l'article :
- comment construire un arbre de répertoires en Linux
- comment, dans sed, passer une plage d'adresses d'une certaine ligne jusqu'Ă la fin du fichier, c'est-Ă -dire effectuer une substitution dans sed dans toutes les lignes sauf la premiĂšre ligne
- Comment, dans Linux find, inverser la condition de recherche
- comment, dans le shell Linux, passer plusieurs lignes Ă une boucle via une ligne unique
- comment, dans bash, échapper des guillemets simples
- comment, dans la ligne de commande Windows, supprimer un répertoire avec tout son contenu
- Comment, avec bash mv, renommer un fichier sans le réécrire
Merci pour votre attention.
Source : habr.com
