Organisatioun vu Multi-User Zougang zum GIT Server

Wann Dir e Git Server installéiert an konfiguréiert, stellt sech d'Fro iwwer d'Organisatioun vun Zougang fir verschidde Benotzer op verschidde Projeten. Ech hunn d'Thema recherchéiert an eng Léisung fonnt déi all meng Ufuerderunge entsprécht: einfach, sécher, zouverlässeg.

Meng Wënsch sinn:

  • all Benotzer verbënnt mat hiren eegene Kont
  • Verschidde Benotzer kënnen un engem Projet schaffen
  • dee selwechte Benotzer kann op verschidde Projete schaffen
  • all Benotzer huet Zougang nëmmen zu deene Projeten op déi hie schafft
  • Et sollt méiglech sinn iwwer d'Kommandozeil ze verbannen, an net nëmmen duerch eng Aart vu Webinterface

Et wier och flott:

  • ginn nëmmen liesen Permissiounen ze kontrolléieren Persounen
  • Gemittlech Benotzer Zougangsrechter am Git verwalten

Iwwersiicht iwwer méiglech Optiounen fir Zougang zum GIT Server

Als éischt musst Dir wësse wat fir ze wielen, also hei ass e séieren Iwwerbléck iwwer Git Protokoller.

  • ssh - e speziell erstallt Benotzerkont gëtt benotzt fir op de Server ze kommen.
    • Et ass komesch datt Git net aus senge Empfehlungen d'Benotzung vun engem Kont ausschléisst fir Zougang zu all Repositories. Dëst entsprécht meng Ufuerderunge guer net.
    • Dir kënnt verschidde Konte benotzen, awer wéi kënnt Dir den Zougang zum Benotzer op nëmme bestëmmte Verzeichnisser limitéieren?
      • An den Heemverzeichnis zoumaachen ass net gëeegent, well et schwéier ass fir de Schreifzougang do fir aner Benotzer z'organiséieren
      • D'Benotzung vun Symlinks aus Ärem Heemverzeechnes ass och schwéier well Git se net als Linken interpretéiert
      • Et ass méiglech den Zougang zum Dolmetscher ze beschränken, awer et gëtt keng voll Garantie datt et ëmmer funktionnéiert
        • Dir kënnt allgemeng Är eege Kommando Dolmetscher fir esou Benotzer konnektéieren, mä
          • éischtens, dëst ass schonn eng Zort schwiereg Entscheedung,
          • an zweetens, dëst kann ëmgoen.

    Awer vläicht ass et kee Problem datt de Benotzer fäeg ass all Kommandoen auszeféieren? .. Am Allgemengen kann dës Method net ausgeschloss ginn wann Dir genau erausfënnt wéi se se benotzen. Mir kommen méi spéit op dës Method zréck, awer fir de Moment wäerte mir déi aner Alternativen kuerz betruechten, vläicht gëtt et eppes méi einfach.

  • De git lokale Protokoll kann a Kombinatioun mat sshfs benotzt ginn, verschidde Benotzer kënne benotzt ginn, awer am Wesentlechen d'selwecht wéi de fréiere Fall
  • http - nëmme liesen
  • git ass nëmme liesen
  • https - schwéier z'installéieren, Dir braucht zousätzlech Software, eng Aart vu Kontrollpanel fir de Benotzer Zougang ze organiséieren ... et gesäit machbar aus, awer iergendwéi ass alles komplizéiert.

Benotzt de ssh Protokoll fir Multi-User Zougang zum Git Server ze organiséieren

Loosst eis zréck op de ssh Protokoll.

Well Dir ssh Zougang fir git benotzt, musst Dir d'Sécherheet vun de Serverdaten garantéieren. De Benotzer, deen iwwer ssh verbënnt, benotzt hiren eegene Login um Linux Server, sou datt se iwwer den ssh Client verbannen an op d'Kommando Linn vum Server kommen.
Et gëtt kee komplette Schutz géint esou Zougang.

Awer de Benotzer sollt net un Linux Dateien interesséiert sinn. Wichteg Informatioun gëtt nëmmen am Git Repository gespäichert. Dofir ass et méiglech den Zougang net iwwer d'Kommandozeil ze beschränken, awer Linux Tools ze benotzen fir de Benotzer ze verbidden Projeten ze gesinn, ausser déi un deenen hien deelhëlt.
Déi offensichtlech Wiel ass de Linux Permissiounssystem ze benotzen.

Wéi scho gesot, ass et méiglech nëmmen ee Kont fir ssh Zougang ze benotzen. Dës Konfiguratioun ass onsécher fir verschidde Benotzer, obwuel et an der Lëscht vun de recommandéierte Git Optiounen abegraff ass.

Fir d'Ufuerderungen ëmzesetzen, déi am Ufank vum Artikel uginn sinn, gëtt déi folgend Verzeechnesstruktur erstallt mat der Uerdnung vu Rechter a Besëtzer:

1) Projet Verzeechnes

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
wou
dir1, dir2, dir3 - project directories: project 1, project 2, project 3.

proj1: proj1, proj2: proj2, proj3: proj3 si speziell erstallt Linux Benotzer, déi als Besëtzer vun den entspriechende Projetsverzeichnisser zougewisen sinn.

Permissiounen fir all Verzeechnes sinn op 0770 gesat - voll Zougang fir de Besëtzer a säi Grupp an e komplette Verbuet fir all aner.

2) Entwéckler Konten

Разработчик 1: dev1:dev1,proj1,proj2
Разработчик 2: dev2:dev2,proj2,proj3

De Schlësselpunkt ass datt d'Entwéckler eng zousätzlech Grupp vum System Benotzer Besëtzer vum entspriechende Projet zougewisen ginn. Dëst gëtt vum Linux Server Administrateur mat engem Kommando gemaach.

An dësem Beispill, "Entwéckler 1" schafft op Projeten proj1 an proj2, an "Entwéckler 2" schafft op Projeten proj2 an proj3.

Wann ee vun den Entwéckler iwwer ssh iwwer d'Kommandozeil verbënnt, da wäerten hir Rechter net genuch sinn, och fir den Inhalt vu Projetsverzeichnisser ze gesinn, an deenen se net matmaachen. Hie kann dëst net selwer änneren.

Zënter der Basis vun dësem Prinzip ass d'Basis Sécherheet vu Linux Rechter, ass dëst Schema zouverlässeg. Zousätzlech ass de Schema ganz einfach ze administréieren.

Loosst eis weiderhi bewegen.

Git Repositories op engem Linux Server erstellen

Iwwerpréiwen.

[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

Ech sinn midd mat der Hand ze tippen ...

[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 dev2

Mir sinn iwwerzeegt datt et onméiglech ass op aner Leit hir Repositories vun der Kommandozeil ze kommen a souguer hiren Inhalt ze gesinn.

[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Permission denied
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: cannot open directory /var/gitservertest/proj3: Permission denied

Kollaboréiert mat méi Entwéckler um selwechte Projet am Git

Eng Fro bleift, wann een Entwéckler en neie Fichier virstellt, kënnen aner Entwéckler se net änneren, well hien selwer säi Besëtzer ass (zum Beispill dev1), an net de Benotzer Besëtzer vum Projet (zum Beispill proj1). Well mir e Server-Säit Repository hunn, musse mir als éischt wësse wéi de ".git" Verzeichnis strukturéiert ass an ob nei Dateien erstallt ginn.

E lokale Git Repository erstellen an op de Git Server drécken

Loosst eis op d'Clientmaschinn goen.

Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:gittest>git init .
Initialized empty Git repository in C:/gittest/.git/

C:gittest>echo "test dev1 to proj2" > test1.txt

C:gittest>git add .

C:gittest>git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   test1.txt

C:gittest>git commit -am "new test file added"
[master (root-commit) a7ac614] new test file added
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
 
C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>git push origin master
dev1:[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://10.1.1.11/var/gitservertest/proj2
 * [new branch]      master -> master

C:gittest>

Zur selwechter Zäit ginn nei Dateien um Server erstallt, a si gehéieren zum Benotzer deen de Push gemaach huet

[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 directories, 18 files
[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]$

Wann Dir Ännerungen op de Git Server eropluet, ginn zousätzlech Dateien a Verzeichnisser erstallt, an hire Besëtzer ass tatsächlech de Benotzer deen den Eroplueden mécht. Awer dann entsprécht d'Grupp vun dësen Dateien an Verzeichnisser och der Haaptgrupp vun dësem Benotzer, dat heescht d'dev1 Grupp fir den dev1 Benotzer an d'dev2 Grupp fir den dev2 Benotzer (d'Haaptgrupp vum Entwéckler Benotzer änneren hëlleft net, well dann, wéi kënnt Dir op verschidde Projete schaffen?). An dësem Fall kann de Benotzer dev2 net Dateien änneren, déi vum Benotzer dev1 erstallt sinn, wat zu engem Decompte an der Funktionalitéit féieren kann.

Linux chown - de Besëtzer vun enger Datei vun engem normale Benotzer änneren

De Besëtzer vun engem Fichier kann seng Besëtzer net änneren. Mä hien kann d'Grupp vun engem Fichier änneren, datt him gehéiert, an dann kann dës Fichier vun anere Benotzer geännert ginn, déi an der selwechter Grupp sinn. Dat brauche mer.

Benotzt Git Hook

Den Aarbechtsverzeechnes fir Hook ass de Root Verzeechnes vum Projet. Hook ass en ausführbar deen ënner dem Benotzer leeft deen de Push mécht. Wann Dir dëst wësst, kënne mir eis Pläng ëmsetzen.

[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<< 'find . -group $(whoami) -exec chgrp proj2 '"'"'{}'"'"' ;' >> hooks/post-update

entweder just

vi hooks/post-update

Loosst eis zréck op d'Clientmaschinn.

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 file changed, 1 insertion(+)

C:gittest>git push origin master
dev1:[email protected]'s password:
   d22c66e..b045e22  master -> master

Um Git Server kontrolléiere mir d'Operatioun vum Hook Post-Update Skript nom Engagement

[dev1@server proj2]$ find . ! -group proj2

- eidel, alles ass gutt.

En zweeten Entwéckler an Git verbannen

Loosst eis d'Aarbecht vum zweeten Entwéckler simuléieren.

Op de Client

C:gittest>git remote remove origin

C:gittest>git remote add origin "ssh://[email protected]/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 files changed, 2 insertions(+)
 create mode 100644 test2.txt

C:gittest>git push origin master
[email protected]'s password:
   b045e22..55d49a6  master -> master

A gläichzäiteg um Server ...

[dev1@server proj2]$ find . ! -group proj2

- erëm eidel, alles funktionnéiert.

E Git Projet läschen an de Projet vum Git Server eroflueden

Gutt, Dir kënnt nach eng Kéier sécherstellen datt all d'Ännerunge gespäichert sinn.

C:gittest>rd /S /Q .
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

- fir e Git-Projet ze läschen, einfach de Verzeechnes komplett läschen. Loosst eis mat de Feeler deen generéiert gëtt, well et onméiglech ass den aktuellen Verzeechnes mat dësem Kommando ze läschen, awer dat ass genau dat Verhalen dat mir brauchen.

C:gittest>dir
 Содержимое папки C:gittest

21.06.2019  08:43    <DIR>          .
21.06.2019  08:43    <DIR>          ..

C:gittest>git clone ssh://[email protected]/var/gitservertest/proj2
Cloning into 'proj2'...
[email protected]'s password:

C:gittest>cd proj2

C:gittestproj2>dir
 Содержимое папки C:gittestproj2

21.06.2019  08:46    <DIR>          .
21.06.2019  08:46    <DIR>          ..
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"

Deelen Zougang zu Git

Loosst eis elo sécherstellen datt souguer duerch Git den zweeten Entwéckler net op de Proj1 Projet zougräifen, op deem hien net funktionnéiert.

C:gittestproj2>git remote remove origin

C:gittestproj2>git remote add origin "ssh://[email protected]/var/gitservertest/proj1"

C:gittestproj2>git push origin master
[email protected]'s password:
fatal: '/var/gitservertest/proj1' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Elo erlaben mir Zougang

[root@server ~]# usermod -aG proj1 dev2

an duerno klappt alles.

C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
 * [new branch]      master -> master

Fir méi Informatiounen,

Zousätzlech, wann et e Problem mat de Standard Permissiounen ass wann Dir Dateien a Verzeichnisser erstellt, an CentOS kënnt Dir de Kommando benotzen

setfacl -Rd -m o::5 -m g::7 /var/gitservertest

Och am Artikel kënnt Dir op kleng nëtzlech Saachen stousse:

  • wéi een e Verzeichnisbaum am Linux bauen
  • wéi een eng Rei vun Adressen an sed vun enger bestëmmter Linn bis zum Enn vun der Datei passéiert, dat heescht en Ersatz an sed an all Zeilen ausser déi éischt Zeil maachen
  • Wéi een e Sichbedingung am Linux fannt
  • Wéi Dir verschidde Linnen an eng Loop passéiert mat engem One-Liner an der Linux Shell
  • Wéi flüchten eenzel Zitater am Bash
  • wéi e Verzeechnes mat all sengem Inhalt an der Windows Kommandozeil ze läschen
  • Wéi benotzt Dir bash mv fir eng Datei ëmbenennen ouni se erëm nei ze schreiwen

Merci fir Är Opmierksamkeet.

Source: will.com

Setzt e Commentaire