Organisasyon ng multi-user access sa GIT server

Kapag nag-i-install at nagko-configure ng isang Git server, ang tanong ay lumitaw tungkol sa pag-aayos ng access para sa ilang mga gumagamit sa ilang mga proyekto. Sinaliksik ko ang isyu at nakakita ng solusyon na nakakatugon sa lahat ng aking kinakailangan: simple, ligtas, maaasahan.

Ang aking mga hiling ay:

  • kumokonekta ang bawat user gamit ang kanilang sariling account
  • Ang ilang mga gumagamit ay maaaring magtrabaho sa isang proyekto
  • ang parehong user ay maaaring gumana sa maraming proyekto
  • ang bawat user ay may access lamang sa mga proyektong pinagtatrabahuhan niya
  • Posibleng kumonekta sa pamamagitan ng command line, at hindi lamang sa pamamagitan ng ilang uri ng web interface

Magiging mahusay din ito:

  • magbigay ng read-only na mga pahintulot sa mga taong kumokontrol
  • Maginhawang pamahalaan ang mga karapatan sa pag-access ng user sa Git

Pangkalahatang-ideya ng mga posibleng opsyon para sa pag-access sa GIT server

Una sa lahat, kailangan mong malaman kung ano ang pipiliin, kaya narito ang isang mabilis na pangkalahatang-ideya ng mga protocol ng Git.

  • ssh - isang espesyal na nilikha na account ng gumagamit ay ginagamit upang ma-access ang server.
    • Kakaiba na hindi ibinubukod ng Git mula sa mga rekomendasyon nito ang paggamit ng isang account upang ma-access ang lahat ng mga repositoryo. Hindi nito natutugunan ang aking mga kinakailangan.
    • Maaari kang gumamit ng maraming account, ngunit paano mo malilimitahan ang pag-access ng user sa ilang partikular na direktoryo lamang?
      • Ang pagsasara sa home directory ay hindi angkop, dahil mahirap ayusin ang write access doon para sa ibang mga user
      • Ang paggamit ng mga symlink mula sa iyong home directory ay mahirap din dahil hindi binibigyang-kahulugan ng Git ang mga ito bilang mga link
      • Posibleng paghigpitan ang pag-access sa interpreter, ngunit walang ganap na garantiya na ito ay palaging gagana
        • Sa pangkalahatan maaari mong ikonekta ang iyong sariling command interpreter para sa mga naturang user, ngunit
          • una, ito ay isang uri ng mahirap na desisyon,
          • at pangalawa, ito ay maaaring iwasan.

    Ngunit marahil ito ay hindi isang problema na ang gumagamit ay magagawang magsagawa ng anumang mga utos?.. Sa pangkalahatan, ang pamamaraang ito ay hindi maaaring maalis kung alam mo nang eksakto kung paano ito gagamitin. Babalik tayo sa pamamaraang ito sa ibang pagkakataon, ngunit sa ngayon ay isasaalang-alang natin sandali ang iba pang mga alternatibo, marahil ay magkakaroon ng mas simple.

  • Ang git local protocol ay maaaring gamitin sa kumbinasyon ng mga sshfs, maraming user ang maaaring gamitin, ngunit mahalagang pareho sa nakaraang kaso
  • http - read-only
  • Ang git ay read-only
  • https - mahirap i-install, kailangan mo ng karagdagang software, ilang uri ng control panel upang ayusin ang pag-access ng gumagamit... mukhang magagawa, ngunit sa paanuman ang lahat ay kumplikado.

Gamit ang ssh protocol upang ayusin ang multi-user access sa Git server

Bumalik tayo sa ssh protocol.

Dahil gumagamit ka ng ssh access para sa git, kailangan mong tiyakin ang seguridad ng data ng server. Ang user na kumokonekta sa pamamagitan ng ssh ay gumagamit ng kanilang sariling pag-log in sa Linux server, para makakonekta sila sa pamamagitan ng ssh client at ma-access ang command line ng server.
Walang kumpletong proteksyon laban sa naturang pag-access.

Ngunit ang gumagamit ay hindi dapat maging interesado sa mga file ng Linux. Ang makabuluhang impormasyon ay nakaimbak lamang sa git repository. Samakatuwid, posibleng hindi paghigpitan ang pag-access sa pamamagitan ng command line, ngunit ang paggamit ng mga tool sa Linux upang pagbawalan ang user na tumingin ng mga proyekto, hindi kasama ang mga kung saan siya lumalahok.
Ang malinaw na pagpipilian ay ang paggamit ng Linux permissions system.

Tulad ng nabanggit na, posible na gumamit lamang ng isang account para sa pag-access sa ssh. Ang pagsasaayos na ito ay hindi ligtas para sa ilang mga gumagamit, bagama't ito ay kasama sa listahan ng mga inirerekomendang opsyon sa git.

Upang ipatupad ang mga kinakailangan na ibinigay sa simula ng artikulo, ang sumusunod na istraktura ng direktoryo ay nilikha na may pagtatalaga ng mga karapatan at may-ari:

1) mga direktoryo ng proyekto

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
saan
dir1, dir2, dir3 - mga direktoryo ng proyekto: proyekto 1, proyekto 2, proyekto 3.

Ang proj1:proj1, proj2:proj2, proj3:proj3 ay espesyal na nilikha ng mga user ng Linux na itinalaga bilang mga may-ari ng kaukulang mga direktoryo ng proyekto.

ang mga pahintulot para sa lahat ng mga direktoryo ay nakatakda sa 0770 - ganap na pag-access para sa may-ari at sa kanyang grupo at isang kumpletong pagbabawal para sa lahat.

2) mga developer account

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

Ang pangunahing punto ay ang mga developer ay itinalaga ng karagdagang grupo ng may-ari ng user ng system ng kaukulang proyekto. Ginagawa ito ng administrator ng server ng Linux na may isang utos.

Sa halimbawang ito, gumagana ang "Developer 1" sa mga proyektong proj1 at proj2, at ang "Developer 2" ay nagtatrabaho sa mga proyektong proj2 at proj3.

Kung ang alinman sa mga Developer ay kumonekta sa pamamagitan ng ssh sa pamamagitan ng command line, kung gayon ang kanilang mga karapatan ay hindi magiging sapat kahit na tingnan ang mga nilalaman ng mga direktoryo ng proyekto kung saan hindi sila nakikilahok. Hindi niya ito mababago sa kanyang sarili.

Dahil ang batayan ng prinsipyong ito ay ang pangunahing seguridad ng mga karapatan sa Linux, maaasahan ang pamamaraang ito. Bilang karagdagan, ang pamamaraan ay napakadaling pangasiwaan.

Magpatuloy tayo sa pagsasanay.

Paglikha ng mga repositoryo ng Git sa isang server ng Linux

Sinuri namin.

[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

Pagod na akong magtype ng kamay...

[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

Kami ay kumbinsido na imposibleng ma-access ang mga repository ng ibang tao mula sa command line at kahit na tingnan ang kanilang mga nilalaman.

[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

Makipagtulungan sa maraming developer sa parehong proyekto sa Git

Ang isang tanong ay nananatili, kung ang isang developer ay nagpapakilala ng isang bagong file, kung gayon ang ibang mga developer ay hindi maaaring baguhin ito, dahil siya mismo ang may-ari nito (halimbawa, dev1), at hindi ang user na may-ari ng proyekto (halimbawa, proj1). Dahil mayroon kaming isang server-side repository, una sa lahat, kailangan naming malaman kung paano nakabalangkas ang ".git" na direktoryo at kung ang mga bagong file ay nilikha.

Paglikha ng lokal na Git repository at pagtutulak sa Git server

Lumipat tayo sa makina ng kliyente.

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>

Kasabay nito, ang mga bagong file ay nilikha sa server, at sila ay nabibilang sa gumagamit na nagsagawa ng 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]$

Kapag nag-upload ka ng mga pagbabago sa Git server, ang mga karagdagang file at direktoryo ay gagawin, at ang may-ari ng mga ito ay ang user na gumagawa ng pag-upload. Ngunit ang pangkat ng mga file at direktoryo na ito ay tumutugma din sa pangunahing grupo ng user na ito, iyon ay, ang dev1 group para sa dev1 user at ang dev2 group para sa dev2 user (ang pagbabago sa pangunahing grupo ng developer user ay hindi makakatulong, dahil kung gayon paano ka makakagawa sa maraming proyekto?). Sa kasong ito, hindi magagawang baguhin ng user dev2 ang mga file na ginawa ng user dev1, na maaaring humantong sa isang breakdown sa functionality.

Linux chown - pagpapalit ng may-ari ng file ng isang regular na user

Hindi mababago ng may-ari ng file ang pagmamay-ari nito. Ngunit maaari niyang baguhin ang pangkat ng isang file na pagmamay-ari niya, at pagkatapos ay ang file na ito ay maaaring baguhin ng ibang mga user na nasa parehong grupo. Iyon ang kailangan natin.

Gamit ang Git hook

Ang gumaganang direktoryo para sa hook ay ang root directory ng proyekto. Ang hook ay isang executable na tumatakbo sa ilalim ng user na gumagawa ng push. Dahil alam natin ito, maipapatupad natin ang ating mga plano.

[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

o kaya lang

vi hooks/post-update

Bumalik tayo sa makina ng kliyente.

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

Sa Git server, sinusuri namin ang pagpapatakbo ng hook post-update script pagkatapos ng commit

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

- walang laman, maayos ang lahat.

Pagkonekta ng pangalawang developer sa Git

Gayahin natin ang gawain ng pangalawang developer.

Sa kliyente

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

At sa parehong oras, sa server...

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

— walang laman muli, gumagana ang lahat.

Pagtanggal ng proyekto ng Git at pag-download ng proyekto mula sa server ng Git

Well, maaari mong muling tiyakin na ang lahat ng mga pagbabago ay nai-save.

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

— para tanggalin ang isang proyekto ng Git, i-clear lang nang buo ang direktoryo. Pagtiisan natin ang error na nabuo, dahil imposibleng tanggalin ang kasalukuyang direktoryo gamit ang command na ito, ngunit ito mismo ang pag-uugali na kailangan natin.

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"

Pagbabahagi ng access sa Git

Ngayon, siguraduhin natin na kahit sa pamamagitan ng Git ay hindi ma-access ng pangalawang developer ang proyekto ng Proj1, kung saan hindi siya gumagana.

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.

Ngayon pinapayagan namin ang pag-access

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

at pagkatapos nito ay gumagana ang lahat.

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

Para sa karagdagang impormasyon,

Bilang karagdagan, kung may problema sa mga default na pahintulot kapag lumilikha ng mga file at direktoryo, sa CentOS maaari mong gamitin ang command

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

Gayundin sa artikulo maaari kang matisod sa maliliit na kapaki-pakinabang na bagay:

  • kung paano bumuo ng isang puno ng direktoryo sa Linux
  • kung paano magpasa ng isang hanay ng mga address sa sed mula sa isang tiyak na linya hanggang sa dulo ng file, iyon ay, gumawa ng kapalit sa sed sa lahat ng mga linya maliban sa unang linya
  • Paano baligtarin ang isang kondisyon sa paghahanap sa paghahanap ng Linux
  • Paano magpasa ng maraming linya sa isang loop gamit ang isang one-liner sa shell ng Linux
  • Paano makatakas sa mga single quotes sa bash
  • kung paano tanggalin ang isang direktoryo kasama ang lahat ng nilalaman nito sa command line ng windows
  • Paano gamitin ang bash mv upang palitan ang pangalan ng isang file nang hindi ito muling sinusulat

Salamat sa iyo para sa iyong pansin.

Pinagmulan: www.habr.com

Magdagdag ng komento