Vairāku lietotāju piekļuves organizÄ“Å”ana GIT serverim

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.

    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

Pievieno komentāru