Egy Git szerver telepítésekor és konfigurálásakor felmerül a kérdés, hogy több felhasználó hozzáférését kell-e megszervezni több projekthez. Kutattam a kérdést, és olyan megoldást találtam, amely minden követelményemnek megfelel: egyszerű, biztonságos, megbízható.
A kívánságaim a következők:
- minden felhasználó a saját fiókjához csatlakozik
- Egy projekten több felhasználó is dolgozhat
- ugyanaz a felhasználó több projekten is dolgozhat
- minden felhasználó csak azokhoz a projektekhez férhet hozzá, amelyeken dolgozik
- Lehetővé kell tenni a csatlakozást parancssoron keresztül, és nem csak valamilyen webes felületen keresztül
Az is szuper lenne:
- csak olvasási engedélyt ad az irányító személyeknek
- Kényelmesen kezelheti a felhasználói hozzáférési jogokat a Gitben
A GIT-szerver elérési lehetőségeinek áttekintése
Először is tudnod kell, hogy miből válassz, ezért itt egy gyors áttekintés a Git protokollokról.
- ssh - egy speciálisan létrehozott felhasználói fiókot használnak a szerver eléréséhez.
- Furcsa, hogy a Git nem zárja ki ajánlásai közül egy fiók használatát az összes adattárhoz való hozzáféréshez. Ez egyáltalán nem felel meg a követelményeimnek.
- Több fiókot is használhat, de hogyan korlátozhatja a felhasználói hozzáférést csak bizonyos könyvtárakra?
- A saját könyvtárba való bezárás nem megfelelő, mert ott nehéz megszervezni az írási hozzáférést a többi felhasználó számára
- A saját könyvtárból származó szimbolikus hivatkozások használata azért is nehéz, mert a Git nem értelmezi őket hivatkozásként
- Lehetséges korlátozni a tolmácshoz való hozzáférést, de nincs teljes garancia arra, hogy mindig működni fog
- Általában csatlakoztathatja saját parancsértelmezőjét az ilyen felhasználókhoz, de
- először is, ez már egyfajta nehéz döntés,
- másodszor pedig ez megkerülhető.
- Általában csatlakoztathatja saját parancsértelmezőjét az ilyen felhasználókhoz, de
De talán az sem baj, hogy a felhasználó képes lesz bármilyen parancsot végrehajtani?.. Általánosságban elmondható, hogy ez a módszer nem zárható ki, ha pontosan kitaláljuk, hogyan kell használni. Erre a módszerre később még visszatérünk, de most röviden átgondoljuk a többi alternatívát, talán lesz valami egyszerűbb.
- A git helyi protokoll használható sshfs-el kombinálva, több felhasználó is használható, de lényegében ugyanaz, mint az előző eset
- http – csak olvasható
- A git csak olvasható
- https - nehéz telepíteni, kell hozzá kiegészítő szoftver, valami vezérlőpult a felhasználói hozzáférés megszervezéséhez... kivitelezhetőnek tűnik, de valahogy minden bonyolult.
Az ssh protokoll használata a többfelhasználós hozzáférés megszervezéséhez a Git szerverhez
Térjünk vissza az ssh protokollhoz.
Mivel ssh hozzáférést használ a githez, gondoskodnia kell a kiszolgáló adatainak biztonságáról. Az ssh-n keresztül csatlakozó felhasználó a saját bejelentkezési adatait használja a Linux szerveren, így az ssh-kliensen keresztül csatlakozhat, és elérheti a szerver parancssorát.
Nincs teljes védelem az ilyen hozzáférés ellen.
De a felhasználót ne érdekeljék a Linux-fájlok. A jelentős információk csak a git tárolóban tárolódnak. Ezért lehetőség van arra, hogy ne a parancssoron keresztül korlátozzuk a hozzáférést, hanem Linux-eszközökkel tiltsuk meg a felhasználó számára a projektek megtekintését, kivéve azokat, amelyekben részt vesz.
A kézenfekvő választás a Linux engedélyrendszer használata.
Mint már említettük, csak egy fiók használható az ssh-hozzáféréshez. Ez a konfiguráció több felhasználó számára nem biztonságos, bár szerepel az ajánlott git-beállítások listáján.
A cikk elején megadott követelmények megvalósításához a következő címtárszerkezet jön létre a jogok és tulajdonosok hozzárendelésével:
1) projektkönyvtárak
dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
ahol
dir1, dir2, dir3 - projektkönyvtárak: 1. projekt, 2. projekt, 3. projekt.
A proj1:proj1, proj2:proj2, proj3:proj3 speciálisan létrehozott Linux-felhasználók, akik a megfelelő projektkönyvtárak tulajdonosaiként vannak hozzárendelve.
az összes könyvtár engedélye 0770 - teljes hozzáférés a tulajdonos és csoportja számára, és teljes kitiltás mindenki más számára.
2) fejlesztői fiókok
Разработчик 1: dev1:dev1,proj1,proj2
Разработчик 2: dev2:dev2,proj2,proj3
A lényeg az, hogy a fejlesztők hozzá vannak rendelve a megfelelő projekt rendszerfelhasználóinak egy további csoportjához. Ezt a Linux szerver rendszergazdája egy paranccsal végzi el.
Ebben a példában a „Fejlesztő 1” a proj1 és a proj2 projekteken, a „Developer 2” pedig a proj2 és a proj3 projekteken dolgozik.
Ha a Fejlesztők bármelyike ssh-n keresztül csatlakozik a parancssoron keresztül, akkor a jogai még olyan projektkönyvtárak tartalmának megtekintéséhez sem lesznek elegendőek, amelyekben nem vesznek részt. Ezen ő maga nem tud változtatni.
Mivel ennek az elvnek az alapja a Linux jogok alapvető biztonsága, ez a séma megbízható. Ezenkívül a rendszer nagyon egyszerűen kezelhető.
Menjünk a gyakorlatba.
Git-tárolók létrehozása Linux-kiszolgálón
Ellenőrizzük.
[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
elegem van a kézzel gépelésből...
[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
Meggyőződésünk, hogy a parancssorból lehetetlen hozzáférni mások adattáraihoz, és még a tartalmát sem lehet megtekinteni.
[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
Együttműködhet több fejlesztővel ugyanazon a projekten a Gitben
Egy kérdés marad, ha egy fejlesztő bevezet egy új fájlt, akkor azt a többi fejlesztő nem tudja megváltoztatni, mert ő maga a tulajdonosa (például dev1), és nem a projekt felhasználó tulajdonosa (például proj1). Mivel szerveroldali tárolóval rendelkezünk, mindenekelőtt tudnunk kell, hogyan épül fel a „.git” könyvtár, és hogy jönnek-e létre új fájlok.
Helyi Git-lerakat létrehozása és leküldése a Git-kiszolgálóra
Térjünk át a kliens gépre.
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>
Ezzel egyidejűleg új fájlok jönnek létre a szerveren, és azok a leküldést végrehajtó felhasználóhoz tartoznak
[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]$
Amikor feltölti a módosításokat a Git-kiszolgálóra, további fájlok és könyvtárak jönnek létre, amelyek tulajdonosa valójában a feltöltést végző felhasználó. De akkor ezeknek a fájloknak és könyvtáraknak a csoportja megfelel a felhasználó főcsoportjának is, vagyis a dev1 csoportnak a dev1 felhasználónak és a dev2 csoportnak a dev2 felhasználónak (a fejlesztő felhasználó főcsoportjának megváltoztatása nem segít, mert akkor hogyan lehet több projekten dolgozni?). Ebben az esetben a dev2 felhasználó nem tudja módosítani a dev1 felhasználó által létrehozott fájlokat, ami a funkcionalitás meghibásodásához vezethet.
Linux chown - egy fájl tulajdonosának megváltoztatása egy normál felhasználó által
A fájl tulajdonosa nem változtathatja meg a tulajdonjogát. De módosíthatja a hozzá tartozó fájl csoportját, majd ezt a fájlt más, ugyanabban a csoportban lévő felhasználók módosíthatják. Erre van szükségünk.
Git hook használata
A hook munkakönyvtára a projekt gyökérkönyvtára. A hook egy végrehajtható fájl, amely a push felhasználó alatt fut. Ennek ismeretében megvalósíthatjuk terveinket.
[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
akár csak
vi hooks/post-update
Térjünk vissza a kliens géphez.
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
A Git szerveren ellenőrizzük a hook post-update script működését a véglegesítés után
[dev1@server proj2]$ find . ! -group proj2
- üres, minden rendben.
Egy második fejlesztő csatlakoztatása a Gitben
Szimuláljuk a második fejlesztő munkáját.
Az ügyfélen
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
És ugyanakkor a szerveren...
[dev1@server proj2]$ find . ! -group proj2
- újra üres, minden működik.
Egy Git-projekt törlése és a projekt letöltése a Git-kiszolgálóról
Nos, ismét megbizonyosodhat arról, hogy az összes módosítást elmentette.
C:gittest>rd /S /Q .
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
- Git-projekt törléséhez egyszerűen törölje teljesen a könyvtárat. Tűrjük meg a keletkező hibát, mivel ezzel a paranccsal nem lehet törölni az aktuális könyvtárat, de pontosan erre van szükségünk.
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"
Hozzáférés megosztása a Gitben
Most pedig győződjünk meg arról, hogy a második fejlesztő még a Giten keresztül sem férhet hozzá a Proj1 projekthez, amelyen nem dolgozik.
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.
Most engedélyezzük a hozzáférést
[root@server ~]# usermod -aG proj1 dev2
és utána minden működik.
C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
* [new branch] master -> master
További információ
Ezenkívül, ha probléma van az alapértelmezett engedélyekkel a fájlok és könyvtárak létrehozásakor, a CentOS-ben használhatja a parancsot
setfacl -Rd -m o::5 -m g::7 /var/gitservertest
A cikkben apró hasznos dolgokra is bukkanhat:
- hogyan készítsünk könyvtárfát Linuxban
- hogyan lehet egy címtartományt sed-ben átadni egy bizonyos sorból a fájl végére, azaz cserélni a sed-ben minden sorban, kivéve az első sort
- Hogyan lehet megfordítani a keresési feltételt a Linux keresőben
- Hogyan lehet több sort átadni egy ciklusnak egy soros vonallal a Linux shellben
- Hogyan lehet elkerülni az egyetlen idézőjeleket a bash-ban
- hogyan lehet törölni egy könyvtárat annak teljes tartalmával a Windows parancssorban
- Hogyan lehet a bash mv-vel átnevezni egy fájlt anélkül, hogy újra át kellene írni
Köszönöm a figyelmet.
Forrás: will.com