Organizacija višekorisničkog pristupa GIT serveru

Prilikom instaliranja i konfigurisanja Git servera postavlja se pitanje organiziranja pristupa za više korisnika na nekoliko projekata. Istražio sam problem i pronašao rješenje koje ispunjava sve moje zahtjeve: jednostavno, sigurno, pouzdano.

Moje želje su:

  • svaki korisnik se povezuje sa svojim nalogom
  • Više korisnika može raditi na istom projektu
  • isti korisnik može raditi na više projekata
  • svaki korisnik ima pristup samo onim projektima na kojima radi
  • trebalo bi da bude moguće povezivanje preko komandne linije, a ne samo preko neke vrste veb interfejsa

Također bi bilo odlično:

  • dodijeliti prava samo za čitanje kontrolnim osobama
  • jednostavno administrirati korisničke dozvole u Gitu

Pregled mogućih opcija za pristup GIT serveru

Prije svega, morate znati šta odabrati, pa kratak pregled Git protokola.

  • ssh - posebno kreiran korisnički nalog se koristi za pristup serveru.
    • čudno je da Git ne preporučuje korištenje jednog računa za pristup svim spremištima. Ovo uopšte ne ispunjava moje zahteve.
    • Možete koristiti više naloga, ali kako možete ograničiti pristup korisnika samo određenim direktorijima?
      • Zatvaranje matičnog direktorija nije prikladno, jer je tamo teško organizirati pristup pisanju za druge korisnike
      • Korištenje simboličkih veza iz matičnog direktorija je također nezgodno jer ih Git ne tumači kao veze.
      • Ograničite pristup prevodiocu, pa, možete, ali ne postoji potpuna garancija da će to uvijek funkcionirati
        • Općenito možete povezati svoj vlastiti tumač komandi za takve korisnike, ali,
          • prvo, ovo je već neka teška odluka,
          • i 2, može se zaobići.

    Ali možda nije problem što će korisnik moći izvršiti bilo koju komandu?.. Općenito, ovaj metod se ne može isključiti ako shvatite kako ga točno koristiti. Kasnije ćemo se vratiti na ovu metodu, ali za sada ćemo ukratko razmotriti preostale alternative, možda će biti nešto jednostavnije.

  • git lokalni protokol se može koristiti u kombinaciji sa sshfs-om, može se koristiti više korisnika, ali je u suštini isto kao i prethodni slučaj
  • http - samo za čitanje
  • git je samo za čitanje
  • https je teško instalirati, potreban vam je dodatni softver, neka vrsta kontrolne ploče za organizaciju pristupa korisnika... izgleda izvodljivo, ali nekako je sve komplikovano.

Korištenje ssh protokola za organiziranje višekorisničkog pristupa Git serveru

Vratimo se na ssh protokol.

Pošto se ssh pristup koristi za git, podaci servera moraju biti sigurni. Korisnik koji se povezuje preko ssh-a koristi vlastitu prijavu na Linux server, tako da se može povezati preko ssh klijenta i pristupiti komandnoj liniji servera.
Ne postoji potpuna zaštita od dobijanja takvog pristupa.

Ali korisnika ne bi trebalo da zanimaju Linux fajlovi. Značajne informacije se pohranjuju samo u git spremištu. Stoga ne možete ograničiti pristup preko komandne linije, ali pomoću Linuxa zabraniti korisniku da gleda projekte, osim onih u kojima sudjeluje.
Očigledno je koristiti Linux sistem dozvola.

Kao što je već pomenuto, moguće je koristiti samo jedan nalog za ssh pristup. Ova konfiguracija nije bezbedna za nekoliko korisnika, iako je uključena u git-ovu listu preporučenih opcija.

Da bi se implementirali zahtjevi dati na početku članka, kreirana je sljedeća struktura imenika sa dodjelom prava i vlasnika:

1) imenici projekata

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
gdje
dir1, dir2, dir3 - direktoriji projekta: projekat 1, projekat 2, projekat 3.

proj1:proj1, proj2:proj2, proj3:proj3 su posebno kreirani Linux korisnici koji su dodijeljeni kao vlasnici odgovarajućih projektnih direktorija.

prava na sve direktorije su postavljena na 0770 - potpuni pristup za vlasnika i njegovu grupu, i potpuna zabrana za sve ostale.

2) računi programera

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

Ključna stvar je da se programerima dodjeljuje dodatna grupa korisnika sistema koji posjeduje odgovarajući projekat. Ovo radi administrator Linux servera jednom komandom.

U ovom primjeru, programer 1 radi na projektima proj1 i proj2, a programer 2 radi na projektima proj2 i proj3.

Ako se bilo koji od programera poveže preko ssh-a preko komandne linije, tada njegova prava neće biti dovoljna čak ni za pregled sadržaja direktorija projekata u kojima ne sudjeluje. On to sam ne može promijeniti.

Pošto je osnova ovog principa osnovna sigurnost Linux prava, ova šema je pouzdana. Osim toga, shema je vrlo jednostavna za administraciju.

Hajde da vežbamo.

Kreiranje Git repozitorija na Linux serveru

Provjeravamo.

[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

umoran od kucanja...

[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

Uvjereni smo da je nemoguće pristupiti tuđim repozitorijumima iz komandne linije, pa čak ni pregledati njihov sadržaj.

[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

Saradnja u Gitu nekoliko programera na jednom projektu

Ostaje jedno pitanje, ako jedan programer uvede novu datoteku, onda je drugi programeri ne mogu promijeniti, jer je on sam njen vlasnik (na primjer, dev1), a ne korisnik koji posjeduje projekat (na primjer, proj1). Pošto imamo serversko spremište, prije svega moramo znati kako je .git direktorij uređen i da li se kreiraju novi fajlovi.

Kreirajte lokalno Git spremište i pritisnite na Git server

Pređimo na klijentsku mašinu.

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>

Istovremeno, na serveru se generišu novi fajlovi, koji pripadaju korisniku koji je izvršio 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]$

Kada se promjene učitaju na Git server, kreiraju se dodatne datoteke i direktoriji koji su zapravo u vlasništvu otpremaoca. Ali tada grupa ovih datoteka i direktorija također odgovara glavnoj grupi ovog korisnika, odnosno dev1 grupi za dev1 korisnika i dev2 grupi za dev2 korisnika (promjena glavne grupe korisnika programera neće pomoći, jer tada kako raditi na više projekata?). U ovom slučaju, korisnik dev2 neće moći mijenjati datoteke koje je kreirao korisnik dev1, a to je prepuno kršenja funkcionalnosti.

Linux chown - promjena vlasnika datoteke od strane normalnog korisnika

Vlasnik fajla ne može promijeniti njegovo vlasništvo. Ali on može promijeniti grupu datoteke koja mu pripada, a onda ovaj fajl mogu mijenjati drugi korisnici koji su u istoj grupi. To je ono što nam treba.

Korištenje Git Hook-a

Radni direktorij za zakačicu je korijenski direktorij projekta. hook je izvršna datoteka koja se pokreće pod korisnikom koji vrši push. znajući ovo, možemo izvršiti naše planove.

[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

bilo samo

vi hooks/post-update

Vratimo se na klijentsku mašinu.

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

Na Git serveru provjerite rad skripte zakačivanja nakon ažuriranja nakon urezivanja

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

- prazno, sve je u redu.

Povezivanje drugog programera na Git

Hajde da simuliramo rad drugog programera.

Na klijenta

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

I u isto vreme, na serveru...

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

- opet prazno, sve radi.

Brisanje Git projekta i učitavanje projekta sa Git servera

Pa, možete se još jednom uvjeriti da su sve promjene sačuvane.

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

- da biste uklonili Git projekat, jednostavno potpuno obrišite direktorij. Pomirimo se sa datom greškom, jer je nemoguće izbrisati trenutni direktorij ovom naredbom, ali je upravo takvo ponašanje potrebno.

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"

Dijeljenje pristupa u Gitu

Sada se uvjerimo da drugi programer ne može pristupiti projektu Proj1 preko Gita, na kojem ne radi.

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.

Sada dozvolite pristup

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

i nakon toga sve radi.

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

Za više informacija,

Osim toga, ako postoji problem sa zadanim dozvolama prilikom kreiranja datoteka i direktorija, na CentOS-u možete koristiti naredbu

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

Također u članku možete naići na male korisne stvari:

  • kako napraviti stablo direktorija u linuxu
  • kako proslijediti raspon adresa od određene linije do kraja datoteke u sed, odnosno napraviti zamjenu u sed u svim redovima osim u prvom redu
  • Kako invertirati uvjet pretraživanja u Linux find
  • kako proći više redova kroz jednoliner u linux ljusci
  • kako izbjeći jednostruke navodnike u bash-u
  • kako obrisati direktorij sa svim sadržajem u Windows komandnoj liniji
  • Kako preimenovati datoteku koristeći bash mv bez ponovnog pisanja

Hvala na pažnji.

izvor: www.habr.com

Dodajte komentar