Kur ndodhe instalimi dhe konfigurimi i një serveri Git, ngrihet pyetja për organizimin e qasjes së disa përdoruesve në disa projekte. Kam bërë një hulumtim mbi këtë çështje dhe kam gjetur një zgjidhje që përmbush të gjitha kërkesat e mia: e thjeshtë, të sigurt dhe të besueshme.
Dëshirat e mia janë si më poshtë:
- çdo përdorues lidhet me llogarinë e tij personale
- mbi një projekt mund të punojnë disa përdorues
- i njëjti përdorues mund të punojë mbi disa projekte
- çdo përdorues ka qasje vetëm në projektet mbi të cilat punon
- duhet të ketë mundësinë e lidhjes përmes komandës, jo vetëm përmes një ndërfaqeje web
Gjithashtu do të ishte mirë:
- të ofrohen të drejtat vetëm për lexim për personat që mbikëqyrin
- të jetë e lehtë për të menaxhuar të drejtat e përdoruesve në Git
Konsiderata mbi mundësitë e qasjes në serverin GIT
Para së gjithash, është e nevojshme të kuptohet se nga çfarë duhet të zgjedhim, prandaj një përmbledhje e shkurtër e protokolleve Git.
- ssh â pĂ«r qasje nĂ« server pĂ«rdoret njĂ« llogari pĂ«rdoruesi e caktuar.
- e çuditshme, që Git nuk përjashton nga rekomandimet përdorimin e një llogarie për qasje në të gjitha repozitat. Kjo nuk i përputhet kërkesave të mia.
- mund të përdoren disa llogari, por si mund të kufizohet qasja e përdoruesit vetëm në drejtoritë e caktuara?
- Mbyllja në drejtorinë e shtëpisë nuk është e përshtatshme, sepse është e vështirë të organizohet qasje shkruese për përdoruesit e tjerë.
- Përdorimi i lidhjeve simbolike nga direktorët e shtëpisë është gjithashtu i nd tricky për shkak se Git nuk i interpreton ato si lidhje.
- Kufizimi i qasjes në interpretuese, mundet, por nuk ka një garanci të plotë se do të funksionojë gjithmonë.
- Mund të lidhet për këta përdorues një interpretuese komande e veçantë, por
- në radhë të parë, kjo është një zgjidhje mjaft e komplikuar,
- dhe në radhë të dytë, mund të anashkalohet.
- Mund të lidhet për këta përdorues një interpretuese komande e veçantë, por
Por, ndoshta, kjo nuk është një problem që përdoruesi mund të ekzekutojë çfarëdo komandash?.. Në përgjithësi, nuk mund të përjashtohet ky metodë, nëse mendojmë se si të përdoret. Le të kthehemi te ky metodë më vonë, ndërkohë le të shqyrtojmë alternativat e tjera, ndoshta aty do të gjejmë diçka më të thjeshtë.
- protokolli git local mund të përdoret në kombinim me sshfs, mund të përdoren disa përdorues, por në thelb, është e njëjta gjë si rasti i mëparshëm.
- http â vetĂ«m pĂ«r lexim
- git â vetĂ«m pĂ«r lexim
- https â i vĂ«shtirĂ« pĂ«r tâu instaluar, ka nevojĂ« pĂ«r ekstra software, ndonjĂ« paneli i menaxhimit pĂ«r organizimin e qasjes sĂ« pĂ«rdoruesve⊠duket e realizueshme, por gjithçka duket e komplikuar.
Përdorimi i protokollit ssh për organizimin e qasjes me disa përdorues në serverin Git
Le të kthehemi në protokollin ssh.
Duke qenë se përdoret qasja përmes ssh në git, duhet të sigurohet sigurimi i të dhënave të serverit. Përdoruesi që lidhet përmes ssh përdor identifikimin e tij në serveri Linux, për këtë arsye mund të lidhë përmes klientit ssh dhe të ketë qasje në komandën e serverit.
Nuk ka një mbrojtje të plotë nga marrja e tillë e qasjes.
Por për përdoruesin nuk duhet të jenë interesante skedarët e Linux. Informacioni thelbësor ruhet vetëm në repozitorin git. Prandaj nuk është e nevojshme të kufizohet qasja përmes komandës, por me mjetet e Linux duhet të ndalohet përdoruesi të shikojë projektet, përveç atyre në të cilat merr pjesë.
Pa dyshim duhet të përdoret sistemi i të drejtave të qasjes të Linux.
Siç përmendëm më parë, është e mundur të përdoret vetëm një llogari për qasjen ssh. Kjo konfigurim është jo e sigurt për disa përdorues, megjithatë ky metodë është përfshirë në listën e mundësive të rekomanduara nga git.
Për të realizuar kërkesat e përmendura në fillim të artikullit, do të krijohet struktura e mëposhtme e direktorive me të drejtat dhe pronarët të caktuar:
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 â janĂ« pĂ«rdoruesit e krijuar posaçërisht nĂ« Linux, tĂ« cilĂ«ve u caktohen pronarĂ«t e direktorĂ«ve tĂ« projekteve pĂ«rkatĂ«se.
tĂ« drejtat pĂ«r tĂ« gjitha direktorĂ«t janĂ« caktuar 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 kryesore është që zhvilluesve u caktohet një grup shtesë i përdoruesit sistematik pronar i projektit përkatës. Kjo bëhet nga administratori i serverit Linux me një komandë.
Në këtë shembull, "Zhvilluesi 1" punon mbi projektin proj1 dhe proj2, ndërsa "Zhvilluesi 2" punon mbi projektet proj2 dhe proj3.
Nëse ndonjë nga Zhvilluesit lidhet përmes ssh përmes komandës, ai do të ketë të drejta të pamjaftueshme 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 qenë se baza e këtij principi është siguria themelore e të drejtave Linux, ky skemë është e besueshme. Për më tepër, skema është shumë e lehtë për t'u administruar.
Le të kalojmë në praktikë.
Krijimi i git repositorive 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
e kam të mërzitshme 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 dev2Jemi të sigurt se, nga linjëja e komandës, nuk është e mundur të aksesosh repo të të tjerëve dhe madje as të shohësh përmbajtjen e tyre.
[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 deniedPuna në grup në Git nga disa zhvillues mbi një projekt të vetëm
Ka mbetur njĂ« pyetje, nĂ«se njĂ« zhvillues shton njĂ« skedh tĂ« ri, zhvilluesit e tjerĂ« nuk mund ta ndryshojnĂ« atĂ«, sepse ai vetĂ« Ă«shtĂ« pronari i saj (pĂ«r shembull, dev1), dhe jo pĂ«rdoruesi-pronar i projektit (pĂ«r shembull, proj1). Duke qenĂ« se kemi njĂ« repozitor tĂ« serverit, para sĂ« gjithash, duhet tĂ« dimĂ« si funksionon direktoria â.gitâ dhe nĂ«se krijohen skedarĂ« tĂ« rinj.
Krijimi i një repozitor lokal Git dhe push në serverin Git
Le të kalojmë në makinën klient.
Microsoft Windows [Version 6.1.7601]
(c) Korporata Microsoft (Microsoft Corp.), 2009. Të gjithë të drejtat e rezervuara.
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 ..." 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://dev1@10.1.1.11/var/gitservertest/proj2"
C:gittest>git push origin master
dev1:dev1@10.1.1.11'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>Në të njëjtën kohë, në server krijohen skedarë 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 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]$Kur ngarkoni ndryshimet në server, Git krijon skedarë dhe drejtorë shtesë, dhe pronari i tyre është saktësisht përdoruesi që bën ngarkimin. Por atëherë grupi i këtyre skedarëve dhe drejtorive gjithashtu i përket grupit 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 zhvillues nuk ndihmon, pasi si mund të punoni me 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 do të shkaktojë probleme funksionaliteti.
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, dhe atëherë ky skedar mund të jetë i aksesueshëm për ndryshim nga përdoruesit e tjerë që janë në të njëjtin grup. Ky ë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, i cili ekzekutohet nga përdoruesi që bëri push. Duke e ditur këtë, ne mund ta 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-updateLe të kthehemi në makinën klient.
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 komitimit funksionimin e skriptit hook post-update
[dev1@server proj2]$ find . ! -group proj2
â bosh, gjithçka Ă«shtĂ« nĂ« rregull.
Kyçja e zhvilluesit të dytë në Git
Do të imitojmë 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
Dhe në të njëjtën kohë, 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
Mund të sigurohemi sërish që të gjitha ndryshimet janë ruajtur.
C:gittest>rd /S /Q .
Procesi nuk mund tĂ« qaset nĂ« skedarin, sepse ky skedar Ă«shtĂ« i angazhuar nga njĂ« proces tjetĂ«r.â pĂ«r tĂ« fshirĂ« projektin Git, thjesht pastroni direktorinĂ« plotĂ«sisht. Do tĂ« pajtohemi me gabimin e dhĂ«nĂ«, pasi nuk Ă«shtĂ« e mundur tĂ« fshihet direktoria aktuale me kĂ«tĂ« komandĂ«, por nĂ« tĂ« vĂ«rtetĂ« na nevojitet ky funksionim.
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
Cloning into '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"Bashkimi i aksesit në Git
Tani do të sigurohemi se edhe përmes Git zhvilluesi i dytë nuk mund të aksesojë projektin Proj1, në të cilin ai nuk 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 duket si një depo git
fatal: Nuk mund të lexoj nga depoja remote.
Ju lutem 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:
NĂ« ssh://10.1.1.11/var/gitservertest/proj1
* [një degë e re] master -> masterInformacione të tjera
Për më tepër, nëse ka një problem me të drejtat e paracaktuar gjatë krijimit të skedarëve dhe drejtorive, në CentOS mund të përdorni komandën
setfacl -Rd -m o::5 -m g::7 /var/gitservertestNë këtë artikull gjithashtu mund të gjeni disa gjëra të dobishme:
- si të ndërtoni një pemë katalogësh në Linux
- si të dërgoni një diapazon adresash në sed nga një rresht i caktuar deri në fund të skedarit, pra, të bëni në sed zëvendësim në të gjitha rreshtat përveç rreshtit të parë
- Si të invertoni kushte kërkimi me find në Linux
- si të dërgoni disa rreshta në një cikël përmes një linje të vetme në shell-in Linux
- si të ekranuar njëzit e vetme në bash
- si të fshini një direktori me të gjithë përmbajtjen në komandën e linjës në Windows
- Si me bash mv të riemëroni një skedar, pa e ripërvjetuar atë
Faleminderit për vëmendjen.
Burimi: habr.com
