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.
- Općenito možete povezati svoj vlastiti tumač komandi za takve korisnike, ali,
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