InstalÄjot un konfigurÄjot Git serveri, rodas jautÄjums par piekļuves organizÄÅ”anu vairÄkiem lietotÄjiem vairÄkiem projektiem. Es izpÄtÄ«ju problÄmu un atradu risinÄjumu, kas atbilst visÄm manÄm prasÄ«bÄm: vienkÄrÅ”s, droÅ”s, uzticams.
Manas vÄlmes ir:
- katrs lietotÄjs izveido savienojumu ar savu kontu
- Pie viena projekta var strÄdÄt vairÄki lietotÄji
- viens un tas pats lietotÄjs var strÄdÄt pie vairÄkiem projektiem
- katram lietotÄjam ir piekļuve tikai tiem projektiem, kuros viÅÅ” strÄdÄ
- JÄbÅ«t iespÄjai izveidot savienojumu, izmantojot komandrindu, nevis tikai caur kÄdu tÄ«mekļa saskarni
Būtu arī lieliski:
- pieŔķirt kontrolÄjoÅ”Äm personÄm tikai lasÄ«Å”anas atļaujas
- Ärti pÄrvaldiet lietotÄja piekļuves tiesÄ«bas pakalpojumÄ Git
PÄrskats par iespÄjamÄm iespÄjÄm piekļūt GIT serverim
PirmkÄrt, jums ir jÄzina, no kÄ izvÄlÄties, tÄpÄc Å”eit ir Ä«ss Git protokolu pÄrskats.
- ssh - lai piekļūtu serverim, tiek izmantots speciÄli izveidots lietotÄja konts.
- DÄ«vaini, ka Git no saviem ieteikumiem neizslÄdz viena konta izmantoÅ”anu, lai piekļūtu visÄm krÄtuvÄm. Tas nepavisam neatbilst manÄm prasÄ«bÄm.
- Varat izmantot vairÄkus kontus, bet kÄ ierobežot lietotÄju piekļuvi tikai noteiktiem direktorijiem?
- AizvÄrÅ”anÄs mÄjas direktorijÄ nav piemÄrota, jo citiem lietotÄjiem tur ir grÅ«ti organizÄt rakstÄ«Å”anas piekļuvi
- Sarežģīti ir arÄ« izmantot simsaites no mÄjas direktorija, jo Git tÄs neinterpretÄ kÄ saites
- Ir iespÄjams ierobežot piekļuvi tulkam, taÄu nav pilnÄ«gas garantijas, ka tas vienmÄr darbosies
- Parasti Å”Ädiem lietotÄjiem varat pieslÄgt savu komandu tulku, bet
- pirmkÄrt, tas jau ir kaut kÄds grÅ«ts lÄmums,
- un, otrkÄrt, to var apiet.
- Parasti Å”Ädiem lietotÄjiem varat pieslÄgt savu komandu tulku, bet
Bet varbÅ«t tÄ nav problÄma, ka lietotÄjs varÄs izpildÄ«t kÄdas komandas?.. KopumÄ Å”o metodi nevar izslÄgt, ja izdomÄ, kÄ tieÅ”i to izmantot. Pie Ŕīs metodes atgriezÄ«simies vÄlÄk, bet pagaidÄm Ä«si apsvÄrsim citas alternatÄ«vas, iespÄjams, bÅ«s kas vienkÄrÅ”Äks.
- VietÄjo protokolu git var izmantot kombinÄcijÄ ar sshfs, var izmantot vairÄkus lietotÄjus, bet bÅ«tÄ«bÄ tas pats, kas iepriekÅ”ÄjÄ gadÄ«jumÄ
- http ā tikai lasÄms
- git ir tikai lasÄms
- https - grÅ«ti uzinstalÄt, vajag papildus softu, kaut kÄdu vadÄ«bas paneli, lai organizÄtu lietotÄju pieeju... izskatÄs iespÄjams, bet kaut kÄ viss ir sarežģīti.
Ssh protokola izmantoÅ”ana, lai organizÄtu vairÄku lietotÄju piekļuvi Git serverim
Atgriezīsimies pie ssh protokola.
TÄ kÄ git izmantojat ssh piekļuvi, jums ir jÄnodroÅ”ina servera datu droŔība. LietotÄjs, kurÅ” izveido savienojumu, izmantojot ssh, izmanto savu pieteikÅ”anos Linux serverÄ«, lai viÅi varÄtu izveidot savienojumu, izmantojot ssh klientu, un piekļūt servera komandrindai.
PilnÄ«gas aizsardzÄ«bas pret Å”Ädu piekļuvi nav.
Bet lietotÄjam nevajadzÄtu interesÄties par Linux failiem. NozÄ«mÄ«ga informÄcija tiek glabÄta tikai git repozitorijÄ. TÄpÄc ir iespÄjams neierobežot piekļuvi caur komandrindu, bet izmantojot Linux rÄ«kus, lai aizliegtu lietotÄjam skatÄ«t projektus, izÅemot tos, kuros viÅÅ” piedalÄs.
AcÄ«mredzama izvÄle ir izmantot Linux atļauju sistÄmu.
KÄ jau minÄts, ssh piekļuvei ir iespÄjams izmantot tikai vienu kontu. Å Ä« konfigurÄcija ir nedroÅ”a vairÄkiem lietotÄjiem, lai gan tÄ ir iekļauta ieteicamo git opciju sarakstÄ.
Lai Ä«stenotu raksta sÄkumÄ norÄdÄ«tÄs prasÄ«bas, tiek izveidota Å”Äda direktoriju struktÅ«ra ar tiesÄ«bu un Ä«paÅ”nieku pieŔķirÅ”anu:
1) projektu katalogi
dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
kur
dir1, dir2, dir3 - projektu katalogi: projekts 1, projekts 2, projekts 3.
proj1:proj1, proj2:proj2, proj3:proj3 ir Ä«paÅ”i izveidoti Linux lietotÄji, kuri ir pieŔķirti kÄ attiecÄ«go projektu direktoriju Ä«paÅ”nieki.
atļaujas visiem direktorijiem ir iestatÄ«tas uz 0770 - pilnÄ«ga piekļuve Ä«paÅ”niekam un viÅa grupai un pilnÄ«gs aizliegums visiem pÄrÄjiem.
2) izstrÄdÄtÄju konti
Š Š°Š·ŃŠ°Š±Š¾ŃŃŠøŠŗ 1: dev1:dev1,proj1,proj2
Š Š°Š·ŃŠ°Š±Š¾ŃŃŠøŠŗ 2: dev2:dev2,proj2,proj3
Galvenais ir tas, ka izstrÄdÄtÄjiem tiek pieŔķirta papildu attiecÄ«gÄ projekta sistÄmas lietotÄja Ä«paÅ”nieku grupa. To veic Linux servera administrators ar vienu komandu.
Å ajÄ piemÄrÄ "IzstrÄdÄtÄjs 1" strÄdÄ pie projektiem proj1 un proj2, un "IzstrÄdÄtÄjs 2" strÄdÄ pie projektiem proj2 un proj3.
Ja kÄds no IzstrÄdÄtÄjiem izveido savienojumu, izmantojot ssh, izmantojot komandrindu, tad viÅu tiesÄ«bas nebÅ«s pietiekamas pat to projektu direktoriju satura apskatei, kuros viÅi nepiedalÄs. ViÅÅ” pats to nevar mainÄ«t.
TÄ kÄ Å”Ä« principa pamatÄ ir Linux tiesÄ«bu pamata droŔība, Ŕī shÄma ir uzticama. TurklÄt shÄmu ir ļoti viegli administrÄt.
PÄriet uz praksi.
Git repozitoriju izveide Linux serverī
PÄrbaudÄ«sim.
[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
Man ir apnicis rakstīt ar roku...
[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
MÄs esam pÄrliecinÄti, ka no komandrindas nav iespÄjams piekļūt citu cilvÄku krÄtuvÄm un pat apskatÄ«t to saturu.
[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
Sadarbojieties ar vairÄkiem izstrÄdÄtÄjiem vienÄ Git projektÄ
Paliek viens jautÄjums, ja viens izstrÄdÄtÄjs ievieÅ” jaunu failu, tad citi izstrÄdÄtÄji to nevar mainÄ«t, jo viÅÅ” pats ir tÄ Ä«paÅ”nieks (piemÄram, dev1), nevis projekta lietotÄjs (piemÄram, proj1). TÄ kÄ mums ir servera puses repozitorijs, vispirms mums ir jÄzina, kÄ ir strukturÄts ā.gitā direktorijs un vai tiek izveidoti jauni faili.
VietÄjÄs Git repozitorija izveide un nosÅ«tÄ«Å”ana uz Git serveri
PÄriesim pie klienta maŔīnas.
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>
TajÄ paÅ”Ä laikÄ serverÄ« tiek izveidoti jauni faili, un tie pieder lietotÄjam, kurÅ” veica 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]$
AugÅ”upielÄdÄjot izmaiÅas Git serverÄ«, tiek izveidoti papildu faili un direktoriji, un to Ä«paÅ”nieks faktiski ir lietotÄjs, kurÅ” veic augÅ”upielÄdi. Bet tad Å”o failu un direktoriju grupa atbilst arÄ« Ŕī lietotÄja galvenajai grupai, tas ir, dev1 grupai dev1 lietotÄjam un dev2 grupai dev2 lietotÄjam (izstrÄdÄtÄja lietotÄja galvenÄs grupas maiÅa nepalÄ«dzÄs, jo kÄ tad jÅ«s varat strÄdÄt pie vairÄkiem projektiem?). Å ÄdÄ gadÄ«jumÄ lietotÄjs dev2 nevarÄs mainÄ«t lietotÄja dev1 izveidotos failus, kas var izraisÄ«t funkcionalitÄtes traucÄjumus.
Linux chown - parasts lietotÄjs maina faila Ä«paÅ”nieku
Faila Ä«paÅ”nieks nevar mainÄ«t tÄ Ä«paÅ”umtiesÄ«bas. Bet viÅÅ” var mainÄ«t viÅam piederoÅ”Ä faila grupu, un tad Å”o failu var modificÄt citi lietotÄji, kas ir tajÄ paÅ”Ä grupÄ. Tas ir tas, kas mums vajadzÄ«gs.
Izmantojot Git ÄÄ·i
ÄÄ·a darba direktorijs ir projekta saknes direktorijs. hook ir izpildÄmÄ fails, kas darbojas zem lietotÄja, kas veic push. Zinot to, mÄs varam Ä«stenot savus plÄnus.
[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
vai vienkÄrÅ”i
vi hooks/post-update
Atgriezīsimies pie klienta maŔīnas.
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
Git serverÄ« mÄs pÄrbaudÄm ÄÄ·a pÄcatjauninÄÅ”anas skripta darbÄ«bu pÄc commit
[dev1@server proj2]$ find . ! -group proj2
- tukÅ”s, viss kÄrtÄ«bÄ.
Otra izstrÄdÄtÄja savienoÅ”ana pakalpojumÄ Git
SimulÄsim otrÄ izstrÄdÄtÄja darbu.
Uz klientu
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
Un tajÄ paÅ”Ä laikÄ serverÄ«...
[dev1@server proj2]$ find . ! -group proj2
ā atkal tukÅ”s, viss strÄdÄ.
Git projekta dzÄÅ”ana un projekta lejupielÄde no Git servera
Nu, jÅ«s varat vÄlreiz pÄrliecinÄties, ka visas izmaiÅas ir saglabÄtas.
C:gittest>rd /S /Q .
ŠŃŠ¾ŃŠµŃŃ Š½Šµ Š¼Š¾Š¶ŠµŃ ŠæŠ¾Š»ŃŃŠøŃŃ Š“Š¾ŃŃŃŠæ Šŗ ŃŠ°Š¹Š»Ń, ŃŠ°Šŗ ŠŗŠ°Šŗ ŃŃŠ¾Ń ŃŠ°Š¹Š» Š·Š°Š½ŃŃ Š“ŃŃŠ³ŠøŠ¼ ŠæŃŠ¾ŃŠµŃŃŠ¾Š¼.
ā lai izdzÄstu Git projektu, vienkÄrÅ”i pilnÄ«bÄ notÄ«riet direktoriju. SamierinÄsimies ar Ä£enerÄto kļūdu, jo, izmantojot Å”o komandu, paÅ”reizÄjo direktoriju nav iespÄjams dzÄst, taÄu tieÅ”i tÄ mums ir nepiecieÅ”ama.
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"
Piekļuves koplietoÅ”ana pakalpojumÄ Git
Tagad pÄrliecinÄsimies, ka pat caur Git otrais izstrÄdÄtÄjs nevar piekļūt Proj1 projektam, ar kuru viÅÅ” nestrÄdÄ.
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.
Tagad mÄs atļaujam piekļuvi
[root@server ~]# usermod -aG proj1 dev2
un pÄc tam viss darbojas.
C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
* [new branch] master -> master
Lai iegÅ«tu vairÄk informÄcijas,
TurklÄt, ja, veidojot failus un direktorijus, rodas problÄma ar noklusÄjuma atļaujÄm, CentOS varat izmantot komandu
setfacl -Rd -m o::5 -m g::7 /var/gitservertest
ArÄ« rakstÄ jÅ«s varat paklupt uz mazÄm noderÄ«gÄm lietÄm:
- kÄ izveidot direktoriju koku operÄtÄjsistÄmÄ Linux
- kÄ nodot sed adreÅ”u diapazonu no noteiktas rindiÅas lÄ«dz faila beigÄm, tas ir, veikt sed nomaiÅu visÄs rindÄs, izÅemot pirmo rindiÅu
- KÄ apgriezt meklÄÅ”anas nosacÄ«jumu Linux atraÅ”anÄ
- KÄ ievadÄ«t vairÄkas rindiÅas cilpÄ, izmantojot vienu lÄ«nijpÄrvadÄtÄju Linux apvalkÄ
- KÄ izvairÄ«ties no vienpÄdiÅiem bash
- kÄ izdzÄst direktoriju ar visu tÄ saturu Windows komandrindÄ
- KÄ izmantot bash mv, lai pÄrdÄvÄtu failu, nepÄrrakstot to vÄlreiz
Paldies par uzmanību.
Avots: www.habr.com