Kur instalimin dhe konfigurimin e një serveri Git, ngrihet çështja e organizimit të aksesit të disa përdoruesve në disa projekte. Kam kryer një hulumtim mbi çështjen dhe kam gjetur një zgjidhje që përmbush të gjitha kërkesat e mia: e thjeshtë, e sigurt, e besueshme.
Dëshirat e mia janë këto:
- çdo përdorues lidhët me llogarinë e tij të vetme
- mbi një projekt mund të punojnë disa përdorues
- i njëjti përdorues mund të punojë në disa projekte
- çdo përdorues ka akses vetëm në projektet në të cilat ai punon
- duhet të ketë mundësinë e aksesit përmes komandës në linjë, jo vetëm përmes një ndërfaqeje të caktuar web
Gjithashtu do të ishte e shkëlqyer:
- të ofrohen të drejta vetëm për lexim për personat që kontrollojnë
- të jetë e lehtë të administrohen të drejtat e aksesit të përdoruesve në Git
Përmbledhje e mundësive të aksesit në serverin GIT
Para së gjithash, duhet të dihet se nga çfarë mund të zgjidhet, prandaj një përmbledhje e shkurtër e protokolleve Git.
- ssh â pĂ«r akses nĂ« server pĂ«rdoret njĂ« llogari e krijuar posaçërisht pĂ«r pĂ«rdoruesin.
- ĂshtĂ« e çuditshme qĂ« Git nuk pĂ«rjashton nga rekomandimet pĂ«rdorimin e njĂ« llogarie pĂ«r akses nĂ« tĂ« gjitha repozitat. Kjo nuk pĂ«rmbush kĂ«rkesat e mia.
- mund të përdoren disa llogari, por si të kufizosh aksesin e përdoruesit vetëm në disa direktoriume?
- Mbyllja në direktoriumin e shtëpisë nuk është e përshtatshme, sepse është e vështirë të organizohet akses për shkrim për përdorues të tjerë
- Përdorimi i lidhjeve simbolike nga direktoriumi i shtëpisë është gjithashtu i komplikuar sepse Git nuk i interpreton ato si lidhje
- Të kufizosh aksesin në interpretor, mund të bëhet, por nuk ka garanci të plotë që kjo do të funksionojë gjithmonë
- Mund të lidhen për përdoruesit e tillë interpretorë të komandave të tyre, por,
- në radhë të parë, ky është një zgjidhje e ndërlikuar,
- dhe në të dytë, kjo mund të anashkalohet.
- Mund të lidhen për përdoruesit e tillë interpretorë të komandave të tyre, por,
Por, ndoshta nuk është një problem që përdoruesi mund të ekzekutojë komanda të ndryshme? Në përgjithësi, nuk duhet përjashtuar ky metodë, nëse të përcaktojmë se si të përdoret. Të kthehemi te ky metodë më vonë, për tani le të shqyrtojmë alternativat e tjera, ndoshta aty do të ketë diçka më të thjeshtë.
- Protokolli git lokal mund të përdoret në kombinim me sshfs, mund të përdoren disa përdorues, por në thelb, është e njëjta gjë si rastin e mëparshëm.
- http â vetĂ«m pĂ«r lexim.
- git â vetĂ«m pĂ«r lexim.
- https â e vĂ«shtirĂ« pĂ«r tu instaluar, kĂ«rkon softuer shtesĂ«, ndonjĂ«herĂ«. panairi i menaxhimit pĂ«r organizimin e qasjes sĂ« pĂ«rdoruesve... duket realizueshĂ«m, por ndonjĂ«herĂ« Ă«shtĂ« e komplikuar.
Përdorimi i protokollit ssh për organizimin e qasjes shumëpërdorueshe në serverin Git.
Kthehemi te protokolli ssh.
Duke qenë se përdoret qasja përmes ssh për git, duhen siguruar të dhënat e serverit. Përdoruesi që lidhet përmes ssh, përdor identifikuesin e vet në server Linux, prandaj ai mund të lidhet përmes klientit ssh dhe të ketë qasje në komandën e serverit.
Nuk ka mbrojtje të plotë nga qasja e tillë.
Por për përdoruesin nuk duhet të jenë interesante skedarët Linux. Informacioni i rëndësishëm ruhet vetëm në repositorin git. Prandaj, nuk është e nevojshme të kufizohet qasja përmes komandës, por me ndihmën e Linux-it mund të ndalohet përdoruesi të shohë projektet, përveç atyre në të cilat ai merr pjesë.
Padyshim është e qartë të përdoret sistemi i të drejtave të aksesit në Linux.
Siç është thënë më parë, është e mundur të përdoret vetëm një llogari për akses ssh. Kjo konfigurim është e pasigurt për disa përdorues, megjithëse ky mënyrë është përfshirë në listën e rekomandimeve për git.
Për realizimin e kërkesave të përmendura në fillim të artikullit, krijohet struktura e mëposhtme e direktorive me caktimin e të drejtave dhe pronarëve:
1) direktorët e projekteve
dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
âŠ
ku
dir1, dir2, dir3 â janĂ« direktorĂ«t e projekteve: projekti 1, projekti 2, projekti 3.
proj1:proj1, proj2:proj2, proj3:proj3 â pĂ«rdoruesit e krijuar posaçërisht nĂ« Linux, tĂ« cilĂ«t emĂ«rohen pronarĂ« tĂ« direktorĂ«ve pĂ«rkatĂ«s tĂ« projekteve.
tĂ« drejtat nĂ« tĂ« gjitha direktorĂ«t caktosen nĂ« 0770 â qasje e plotĂ« pĂ«r pronarin dhe grupin e tij dhe ndalim tĂ« plotĂ« pĂ«r tĂ« gjithĂ« tĂ« tjerĂ«t.
2) llogaritë e zhvilluesve
Zhvilluesi 1: dev1:dev1,proj1,proj2
Zhvilluesi 2: dev2:dev2,proj2,proj3
Pika kyçe është se zhvilluesve u caktohet një grup shtesë i përdoruesit sistem pronar për projektin përkatës. Kjo bëhet nga administratori i serverit Linux me një komandë.
Në këtë shembull, "Zhvilluesi 1" po punon mbi projektin proj1 dhe proj2, ndërsa "Zhvilluesi 2" po punon mbi projektet proj2 dhe proj3.
Nëse ndonjë nga Zhvilluesit lidhet përmes ssh nëpërmjet komandës, të drejtat e tij do të jenë të pamjaftueshme edhe për të parë përmbajtjen e drejtorive të projekteve në të cilat nuk merr pjesë. Ai nuk mund ta ndryshojë këtë vetë.
Duke pasur parasysh se themeli i këtij principi është siguria bazë e të drejtave Linux, kjo skemë është e besueshme. Për më tepër, skema administrohet shumë lehtë.
Të kalojmë në praktikë.
Krijimi i repozitoreve Git në serverin Linux
Po kontrollojmë.
[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
më ka ngelë të shkruaj me dorë...
[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 dev2Sigurohemi se nga komanda nuk është e mundur të aksesosh repozitorët e të tjerëve dhe as të shikosh përmbajtjen e tyre.
[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Leje e refuzuar
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: nuk mund të hapësh drejtorinë /var/gitservertest/proj3: Leje e refuzuarBashkëpunimi në Git i disa zhvilluesve mbi një projekt të vetëm
Nuk mbetet tjetër pyetje, nëse një zhvillues fut një skedar të ri, zhvilluesit e tjerë nuk mund ta ndryshojnë atë, sepse ai vetë është pronar (për shembull, dev1), dhe jo përdorues-pronar i projektit (për shembull, proj1). Duke pasur parasysh që kemi një repozitor serveri, para së gjithash, duhet të dimë si është strukturuar direktoria " .git" dhe nëse krijohen skedarë të rinj.
Krijimi i një repozitori lokal Git dhe push në serverin Git
Të kalojmë në makinën klient.
Microsoft Windows [Version 6.1.7601]
(c) Korporata Microsoft (Microsoft Corp.), 2009. Të gjitha të drejtat e rezervuara.
C:gittest>git init .
Repository i ri Git u inicializua në C: /gittest/ .git/
C:gittest>echo "test dev1 to proj2" > test1.txt
C:gittest>git add .
C:gittest>git status
Në degën master
Nuk ka komitë deri tani
Ndryshimet për t'u angazhuar:
(përdorni "git rm --cached <file>..." për të hequr angazhimin)
skedar i ri: test1.txt
C:gittest>git commit -am "skedari i ri i testit u shtua"
[master (root-commit) a7ac614] skedari i ri i testit u shtua
1 skedar ndryshuar, 1 shtesë (+)
krijo gjendjen 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:
Numërimi i objekteve: 3, përfunduar.
Shkruaj objektet: 100% (3/3), 243 bytes | 243.00 KiB/s, përfunduar.
Totali 3 (delta 0), e ripërdorur 0 (delta 0)
NĂ« ssh://10.1.1.11/var/gitservertest/proj2
* [dega e re] master -> master
C:gittest>Në të njëjtën kohë, në server krijohen skedare të rinj, dhe ata i përkasin përdoruesit që bëri 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 katalogë, 18 skedare
[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]$Kur ngarkohen ndryshime në server, krijohen skedare dhe katalogë shtesë, dhe pronari i tyre në të vërtetë është ai përdorues që bën ngarkimin. Por atëherë, grupi i këtyre skedarëve dhe katalogëve gjithashtu përputhet me grupin kryesor të këtij përdoruesi, dmth, grupi dev1 për përdoruesin dev1 dhe grupi dev2 për përdoruesin dev2 (ndryshimi i grupit kryesor të përdoruesit të zhvilluesit nuk do të ndihmojë, sepse si mund të punosh mbi disa projekte?). Në këtë rast, përdoruesi dev2 nuk do të jetë në gjendje të ndryshojë skedarët e krijuar nga përdoruesi dev1, dhe kjo rrezikon funksionalitetin.
Linux chown â ndryshimi i pronarit tĂ« skedarit nga njĂ« pĂ«rdorues i zakonshĂ«m.
Pronari i skedarit nuk mund të ndryshojë përkatësinë e tij. Por ai mund të ndryshojë grupin e skedarit, që i përket atij, dhe atëherë ky skedar mund të jetë në dispozicion për ndryshim nga përdorues të tjerë që janë në të njëjtin grup. Kjo është ajo që na nevojitet.
Përdorimi i Git hook
Direktoria e punës për hook është direktoria kryesore e projektit. Hook është një skedar ekzekutiv që ekzekutohet nën përdoruesin që bën push. Duke e ditur këtë, ne mund të realizojmë atë që kemi planifikuar.
[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<> hooks/post-updateose thjesht
vi hooks/post-updateKthehemi në makinën e klientit.
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:dev1@10.1.1.11's password:
d22c66e..b045e22 master -> masterNë serverin Git kontrollojmë pas commit-it punën e skriptit hook post-update
[dev1@server proj2]$ find . ! -group proj2
â bosh, gjithçka Ă«shtĂ« nĂ« rregull.
Përfshirja e zhvilluesit të dytë në Git
Do të simulojmë punën e zhvilluesit të dytë.
NĂ« klient
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 files changed, 2 insertions(+)
create mode 100644 test2.txt
C:gittest>git push origin master
dev2@10.1.1.11's password:
b045e22..55d49a6 master -> master
NdĂ«rkohĂ«, nĂ« serverâŠ
[dev1@server proj2]$ find . ! -group proj2
â pĂ«rsĂ«ri bosh, gjithçka funksionon.
Fshirja e projektit Git dhe ngarkimi i projektit nga serveri Git
Mirë, mund të sigurohemi përsëri që të gjitha ndryshimet janë ruajtur.
C:gittest>rd /S /Q .
Procesi nuk mund tĂ« aksesojĂ« skedarin sepse ky skedar Ă«shtĂ« i angazhuar nga njĂ« proces tjetĂ«r.â pĂ«r tĂ« fshirĂ« projektin Git, thjesht pastrojmĂ« plotĂ«sisht direktorinĂ«. TĂ« pajtohemi me gabimin e shfaqur, sepse nuk Ă«shtĂ« e mundur tĂ« fshihet direktoria aktuale me kĂ«tĂ« komandĂ«, por na duhet pikĂ«risht ky sjellje.
C:gittest>dir
Përmbajtja e dosjes 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
Klonimi në 'proj2'...
dev2@10.1.1.11's password:
C:gittest>cd proj2
C:gittestproj2>dir
Përmbajtja e dosjes 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"Ndara e qasjes në Git
Tani le të sigurohemi që edhe përmes Git, zhvilluesi i dytë nuk mund të aksesojë projektin Proj1, për të cilin ai nuk po punon.
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' nuk ka dukur si një deposh git
fatal: Nuk mund të lexoj nga depoja e largët.
Ju lutemi sigurohuni që keni të drejtat e duhura të aksesit
dhe depoja ekziston.Tani lejojmë aksesin
[root@server ~]# usermod -aG proj1 dev2dhe pas kësaj gjithçka funksionon.
C:gittestproj2>git push origin master
dev2@10.1.1.11's password:
To ssh://10.1.1.11/var/gitservertest/proj1
* [new branch] master -> masterInformacione shtesë
Nëse ka një problem me të drejtat e parazgjedhura në krijimin e skedarëve dhe dosjeve, në CentOS mund të përdorni komandën
setfacl -Rd -m o::5 -m g::7 /var/gitservertestGjithashtu, në artikull mund të hasni në gjëra të vogla të dobishme:
- si të ndërtosh një pemë katalogësh në Linux
- si në sed të kalosh një gamë adresash nga një rresht i caktuar deri në fund të skedarit, dmth, të bësh zëvendësim në sed në të gjitha rreshtat përveç rreshtit të parë
- Si në Linux të inversosh kushtin e kërkimit me find
- si në shellin e Linux të kalosh disa rreshta në një cikël përmes një njëlinjëshi
- si në bash të ekranoje citatet e vetme
- si në komandën e Windows të fshish një dosje me të gjitha përmbajtjet
- Si me bash mv të rinomosh një skedare pa e shkruar atë nga e para
Faleminderit për vëmendjen.
Burimi: habr.com
