Organizzazzjoni ta 'aċċess multi-utenti għas-server GIT

Meta tinstalla u tikkonfigura server Git, tqum il-mistoqsija dwar l-organizzazzjoni tal-aċċess għal diversi utenti għal diversi proġetti. Irriċerkajt il-kwistjoni u sibt soluzzjoni li laħqet ir-rekwiżiti kollha tiegħi: sempliċi, sigura, affidabbli.

Ix-xewqat tiegħi huma:

  • kull utent jgħaqqad mal-kont tiegħu stess
  • Diversi utenti jistgħu jaħdmu fuq proġett wieħed
  • l-istess utent jista 'jaħdem fuq proġetti multipli
  • kull utent għandu aċċess biss għal dawk il-proġetti li fuqhom jaħdem
  • Għandu jkun possibbli li tikkonnettja permezz tal-linja tal-kmand, u mhux biss permezz ta 'xi tip ta' interface tal-web

Ikun tajjeb ukoll:

  • tagħti permessi ta' qari biss lill-persuni li jikkontrollaw
  • Immaniġġja b'mod konvenjenti d-drittijiet tal-aċċess tal-utent f'Git

Ħarsa ġenerali lejn l-għażliet possibbli għall-aċċess għas-server GIT

L-ewwelnett, trid tkun taf minn xiex tagħżel, għalhekk hawn ħarsa ġenerali mgħaġġla tal-protokolli Git.

  • ssh - jintuża kont tal-utent maħluq apposta biex jaċċessa s-server.
    • Hija stramba li Git ma teskludix mir-rakkomandazzjonijiet tagħha l-użu ta’ kont wieħed biex jaċċessa r-repożitorji kollha. Dan ma jissodisfax ir-rekwiżiti tiegħi għal kollox.
    • Tista' tuża diversi kontijiet, imma kif tista' tillimita l-aċċess tal-utent għal ċerti direttorji biss?
      • L-għeluq fid-direttorju tad-dar mhuwiex adattat, minħabba li huwa diffiċli li jiġi organizzat aċċess għall-kitba hemmhekk għal utenti oħra
      • L-użu ta' symlinks mid-direttorju tad-dar tiegħek huwa wkoll diffiċli għax Git ma jinterpretahomx bħala links
      • Tista' tirrestrinġi l-aċċess għall-interpretu, iżda m'hemm l-ebda garanzija sħiħa li se taħdem dejjem
        • Ġeneralment tista' tqabbad l-interpretu tal-kmand tiegħek għal utenti bħal dawn, iżda
          • l-ewwelnett, din diġà hija xi tip ta 'deċiżjoni diffiċli,
          • u t-tieni, dan jista 'jiġi evitat.

    Imma forsi mhix problema li l-utent ikun jista 'jesegwixxi xi kmandi?.. B'mod ġenerali, dan il-metodu ma jistax jiġi eskluż jekk inti figura eżattament kif tużah. Nirritornaw għal dan il-metodu aktar tard, iżda għalissa nikkunsidraw fil-qosor l-alternattivi l-oħra, forsi jkun hemm xi ħaġa aktar sempliċi.

  • Il-protokoll lokali git jista 'jintuża flimkien ma' sshfs, jistgħu jintużaw utenti multipli, iżda essenzjalment l-istess bħall-każ preċedenti
  • http - read-only
  • git huwa jinqara biss
  • https - diffiċli biex tinstalla, għandek bżonn softwer addizzjonali, xi tip ta 'pannell tal-kontroll biex torganizza l-aċċess tal-utent... jidher fattibbli, iżda b'xi mod kollox huwa kkumplikat.

Bl-użu tal-protokoll ssh biex torganizza aċċess għal diversi utenti għas-server Git

Ejja nerġgħu lura għall-protokoll ssh.

Peress li tuża aċċess ssh għal git, għandek bżonn tiżgura s-sigurtà tad-dejta tas-server. L-utent li jgħaqqad permezz ssh juża l-login tiegħu stess fuq is-server Linux, sabiex ikunu jistgħu jgħaqqdu permezz tal-klijent ssh u jaċċessaw il-linja tal-kmand tas-server.
M'hemm l-ebda protezzjoni sħiħa kontra tali aċċess.

Iżda l-utent m'għandux ikun interessat fil-fajls Linux. Informazzjoni sinifikanti hija maħżuna biss fir-repożitorju git. Għalhekk, huwa possibbli li ma tirrestrinġix l-aċċess permezz tal-linja tal-kmand, iżda tuża għodod Linux biex tipprojbixxi lill-utent milli jara proġetti, esklużi dawk li jipparteċipa fihom.
L-għażla ovvja hija li tuża s-sistema tal-permessi tal-Linux.

Kif diġà ssemma, huwa possibbli li tuża kont wieħed biss għall-aċċess ssh. Din il-konfigurazzjoni mhix sikura għal diversi utenti, għalkemm hija inkluża fil-lista ta 'għażliet git rakkomandati.

Biex timplimenta r-rekwiżiti mogħtija fil-bidu tal-artikolu, l-istruttura tad-direttorju li ġejja hija maħluqa bl-assenjazzjoni tad-drittijiet u s-sidien:

1) direttorji tal-proġett

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
fejn
dir1, dir2, dir3 - direttorji tal-proġett: proġett 1, proġett 2, proġett 3.

proj1:proj1, proj2:proj2, proj3:proj3 huma utenti Linux maħluqa apposta li huma assenjati bħala sidien tad-direttorji tal-proġett korrispondenti.

il-permessi għad-direttorji kollha huma ssettjati għal 0770 - aċċess sħiħ għas-sid u l-grupp tiegħu u projbizzjoni sħiħa għal kulħadd.

2) kontijiet tal-iżviluppatur

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

Il-punt ewlieni huwa li l-iżviluppaturi huma assenjati grupp addizzjonali tas-sid tal-utent tas-sistema tal-proġett korrispondenti. Dan isir mill-amministratur tas-server Linux bi kmand wieħed.

F'dan l-eżempju, "Developer 1" qed jaħdem fuq proġetti proj1 u proj2, u "Developer 2" qed jaħdem fuq proġetti proj2 u proj3.

Jekk xi wieħed mill-Iżviluppaturi jgħaqqad permezz ssh permezz tal-linja tal-kmand, allura d-drittijiet tagħhom ma jkunux biżżejjed anki biex tara l-kontenut tad-direttorji tal-proġett li ma jipparteċipawx fihom. Ma jistax ibiddel dan hu stess.

Peress li l-bażi ta 'dan il-prinċipju hija s-sigurtà bażika tad-drittijiet tal-Linux, din l-iskema hija affidabbli. Barra minn hekk, l-iskema hija faċli ħafna biex tiġi amministrata.

Ejja mmorru għall-prattika.

Ħolqien ta' repożitorji Git fuq server Linux

Aħna niċċekkjaw.

[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

Għajjien nittajpja bl-idejn...

[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

Aħna konvinti li huwa impossibbli li wieħed jaċċessa r-repożitorji ta' nies oħra mil-linja tal-kmand u anke tara l-kontenut tagħhom.

[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

Ikkollabora ma 'żviluppaturi multipli fuq l-istess proġett f'Git

Mistoqsija waħda tibqa ', jekk żviluppatur wieħed jintroduċi fajl ġdid, allura żviluppaturi oħra ma jistgħux ibiddluh, minħabba li hu stess huwa s-sid tiegħu (per eżempju, dev1), u mhux is-sid tal-utent tal-proġett (per eżempju, proj1). Peress li għandna repożitorju fuq in-naħa tas-server, l-ewwelnett, irridu nkunu nafu kif id-direttorju ".git" huwa strutturat u jekk jinħolqux fajls ġodda.

Ħolqien ta 'repożitorju Git lokali u imbuttar lejn is-server Git

Ejja nimxu fuq il-magna tal-klijent.

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>

Fl-istess ħin, jinħolqu fajls ġodda fuq is-server, u jappartjenu lill-utent li wettaq l-imbottatura

[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]$

Meta ttella’ bidliet fis-server Git, jinħolqu fajls u direttorji addizzjonali, u s-sid tagħhom huwa fil-fatt l-utent li jagħmel it-upload. Iżda mbagħad il-grupp ta 'dawn il-fajls u direttorji jikkorrispondi wkoll għall-grupp ewlieni ta' dan l-utent, jiġifieri, il-grupp dev1 għall-utent dev1 u l-grupp dev2 għall-utent dev2 (li tbiddel il-grupp ewlieni tal-utent tal-iżviluppatur mhux se jgħin, għax allura kif tista’ taħdem fuq proġetti multipli?). F'dan il-każ, l-utent dev2 mhux se jkun jista 'jbiddel fajls maħluqa mill-utent dev1, li jista' jwassal għal tqassim fil-funzjonalità.

Linux chown - tibdel is-sid ta 'fajl minn utent regolari

Is-sid ta' fajl ma jistax ibiddel is-sjieda tiegħu. Iżda huwa jista 'jbiddel il-grupp ta' fajl li jappartjeni lilu, u mbagħad dan il-fajl jista 'jiġi modifikat minn utenti oħra li huma fl-istess grupp. Dak hu li għandna bżonn.

Bl-użu tal-ganċ Git

Id-direttorju tax-xogħol għall-ganċ huwa d-direttorju tal-għeruq tal-proġett. ganċ huwa eżekutibbli li jimxi taħt l-utent li jagħmel l-imbottatura. Billi nkunu nafu dan, nistgħu nimplimentaw il-pjanijiet tagħna.

[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

jew biss

vi hooks/post-update

Ejja nerġgħu lura għall-magna tal-klijent.

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

Fuq is-server Git, aħna niċċekkjaw it-tħaddim tal-iskript ta 'wara l-aġġornament tal-ganċ wara l-kommit

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

- vojta, kollox tajjeb.

Konnessjoni tat-tieni żviluppatur f'Git

Ejja nisimulaw ix-xogħol tat-tieni żviluppatur.

Fuq il-klijent

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

U fl-istess ħin, fuq is-server...

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

— vojta mill-ġdid, kollox jaħdem.

Tħassar proġett Git u tniżżel il-proġett mis-server Git

Ukoll, tista 'terġa' tiżgura li l-bidliet kollha ġew salvati.

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

— biex tħassar proġett Git, sempliċiment ċara d-direttorju kompletament. Ejja npoġġu l-iżball li jiġi ġġenerat, peress li huwa impossibbli li tħassar id-direttorju attwali billi tuża dan il-kmand, iżda din hija eżattament l-imġieba li għandna bżonn.

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"

Qsim tal-aċċess f'Git

Issa ejja niżguraw li anke permezz ta 'Git it-tieni żviluppatur ma jistax jaċċessa l-proġett Proj1, li fuqu mhux qed jaħdem.

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.

Issa nħallu aċċess

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

u wara kollox jaħdem.

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

Għal aktar informazzjoni,

Barra minn hekk, jekk ikun hemm problema bil-permessi default meta toħloq fajls u direttorji, f'CentOS tista' tuża l-kmand

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

Ukoll fl-artiklu tista’ tfixkel affarijiet żgħar utli:

  • kif tibni siġra tad-direttorju fil-Linux
  • kif tgħaddi firxa ta’ indirizzi f’sed minn ċerta linja sat-tmiem tal-fajl, jiġifieri, tagħmel sostituzzjoni f’sed fil-linji kollha ħlief fl-ewwel linja
  • Kif taqleb kundizzjoni ta' tfittxija f'Linux find
  • Kif tgħaddi linji multipli f'linja bl-użu ta 'liner wieħed fil-qoxra tal-Linux
  • Kif taħrab kwotazzjonijiet singoli f'bash
  • kif tħassar direttorju bil-kontenut kollu tiegħu fil-linja tal-kmand tat-twieqi
  • Kif tuża bash mv biex tibdel l-isem ta' fajl mingħajr ma terġa' tiktebha

Grazzi għall-attenzjoni tiegħek.

Sors: www.habr.com

Żid kumment