Organisation av flermansÄtkomst pÄ GIT-servern

NÀr man installerar och konfigurerar en Git-server uppstÄr frÄgan om hur man organiserar Ätkomst för flera anvÀndare till flera projekt. Jag har undersökt Àmnet och funnit en lösning som uppfyller alla mina krav: enkel, sÀker och tillförlitlig.

Mina önskemÄl Àr följande:

  • varje anvĂ€ndare ska logga in med sitt eget konto
  • flera anvĂ€ndare ska kunna arbeta med ett projekt
  • samma anvĂ€ndare ska kunna arbeta med flera projekt
  • varje anvĂ€ndare ska endast ha Ă„tkomst till de projekt som de arbetar med
  • det ska finnas möjlighet att ansluta via kommandoraden, och inte bara genom nĂ„got webbgrĂ€nssnitt

Det skulle ocksÄ vara bra:

  • att endast ge lĂ€sbehörighet för granskande personer
  • att det ska vara enkelt att administrera anvĂ€ndarbehörigheter i Git

Översikt över möjliga Ă„tkomstalternativ pĂ„ GIT-servern

Först och frÀmst mÄste man veta vad man har att vÀlja pÄ, sÄ hÀr Àr en kort översikt över Git-protokoll.

  • ssh - för Ă„tkomst till servern anvĂ€nds ett speciellt skapat anvĂ€ndarkonto.
    • Det Ă€r mĂ€rkligt att Git inte utesluter rekommendationen att anvĂ€nda ett konto för Ă„tkomst till alla förrĂ„d. Detta motsvarar inte mina krav.
    • man kan anvĂ€nda flera konton, men hur begrĂ€nsar man en anvĂ€ndares Ă„tkomst till vissa kataloger?
      • Att stĂ€nga in dem i hemkatalogen fungerar inte, eftersom det Ă€r svĂ„rt att ge andra anvĂ€ndare skrivĂ„tkomst dĂ€r.
      • Att anvĂ€nda symboliska lĂ€nkar frĂ„n hemkatalogen Ă€r ocksĂ„ komplicerat eftersom Git inte tolkar dem som lĂ€nkar.
      • Att begrĂ€nsa Ă„tkomsten till tolkaren kan fungera, men det finns inga garantier för att det alltid fungerar.
        • Man kan faktiskt ansluta en egen kommandotolk för sĂ„dana anvĂ€ndare, men
          • för det första, det blir en komplicerad lösning,
          • och för det andra, det kan kringgĂ„s.

    Men kanske Àr det inte ett problem att anvÀndaren kan köra vilka kommandon som helst? DÀrför kan vi inte utesluta denna metod om vi kan komma pÄ hur den ska anvÀndas. LÄt oss Äterkomma till den hÀr metoden senare, och först titta pÄ andra alternativ, kanske det finns nÄgot enklare dÀr.

  • Git lokalt protokoll kan anvĂ€ndas i kombination med sshfs, flera anvĂ€ndare kan anvĂ€ndas, men i grund och botten Ă€r det samma som det tidigare fallet.
  • HTTP — endast för lĂ€sning.
  • Git — endast för lĂ€sning.
  • HTTPS — svĂ„rt att installera, krĂ€ver ytterligare programvara, nĂ„got. kontrollpanel För att organisera anvĂ€ndartillgĂ„ng... verkar genomförbart, men pĂ„ nĂ„got sĂ€tt Ă€r allt komplicerat.

AnvÀndning av ssh-protokollet för att organisera fleranvÀndartillgÄng till Git-servern.

LÄt oss gÄ tillbaka till ssh-protokollet.

Eftersom Ätkomst via ssh anvÀnds för git, mÄste serverdata skyddas. AnvÀndaren som ansluter via ssh anvÀnder sin egen inloggning pÄ servern Linux, sÄ att han kan ansluta via ssh-klient och fÄ tillgÄng till serverns kommandorad.
Det finns ingen fullstÀndig skydd mot sÄdan Ätkomst.

Men för anvÀndaren bör Linux-filer inte vara av intresse. Betydelsefull information lagras endast i git-repositoriet. DÀrför kan Ätkomst via kommandoraden vara oreglerad, men med Linux-mekanismer förbjuda anvÀndaren att se projekt, utom de han deltar i.
Det Àr uppenbart att anvÀnda Linux behörighetssystem.

Som nÀmnts tidigare kan endast ett konto anvÀndas för ssh-Ätkomst. Denna konfiguration Àr osÀker för flera anvÀndare, Àven om denna metod finns med bland rekommenderade git-alternativ.

För att uppfylla kraven som nÀmndes i början av artikeln, skapas följande katalogstruktur med rÀttigheter och Àgare:

1) projektkataloger

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)


w
dir1, dir2, dir3 — projektkataloger: projekt 1, projekt 2, projekt 3.

proj1:proj1, proj2:proj2, proj3:proj3 — sĂ€rskilt skapade Linux-anvĂ€ndare som utses som Ă€gare av motsvarande projektkataloger.

RĂ€ttigheterna pĂ„ alla kataloger stĂ€lls in pĂ„ 0770 — full Ă„tkomst för Ă€garen och hans grupp och fullstĂ€ndig förbud för alla andra.

2) utvecklarkonton

Utvecklare 1: dev1:dev1,proj1,proj2
Utvecklare 2: dev2:dev2,proj2,proj3

En nyckelpunkten Àr att utvecklarna tilldelas en extra grupp av systemanvÀndaren-Àgaren för motsvarande projekt. Detta görs av Linux-serveradministratören med ett enda kommando.

I det hÀr exemplet arbetar "Utvecklare 1" med projekten proj1 och proj2, medan "Utvecklare 2" arbetar med projekten proj2 och proj3.

Om nÄgon av utvecklarna ansluter via ssh genom kommandoraden, kommer deras rÀttigheter att vara otillrÀckliga Àven för att se innehÄllet i de projektmappar dÀr de inte deltar. De kan inte Àndra detta sjÀlva.

Eftersom grunden för denna princip Àr den grundlÀggande sÀkerheten i Linux-rÀttigheter Àr detta schema pÄlitligt. Dessutom Àr schemat mycket lÀtt att administrera.

LÄt oss gÄ över till praktiken.

Skapa Git-repositorier pÄ Linux-servern

Vi kontrollerar.

[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

trött pÄ att skriva för hand...

[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

Vi försÀkrar oss om att det Àr omöjligt att fÄ tillgÄng till andras repositories frÄn kommandoraden och till och med att se deras innehÄll.

[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Åtkomst nekad
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: kan inte öppna katalogen /var/gitservertest/proj3: Åtkomst nekad

Samarbete i Git mellan flera utvecklare i ett enda projekt

Det ÄterstÄr en frÄga: om en utvecklare lÀgger till en ny fil, kan de andra utvecklarna inte Àndra den eftersom de inte Àger den (till exempel dev1) utan istÀllet Àr anvÀndaren projektÀgaren (till exempel proj1). Eftersom vi har ett serverrepository, mÄste vi först veta hur katalogen " .git " fungerar och om nya filer skapas.

Skapa ett lokalt Git-repository och push till Git-servern

LÄt oss gÄ till klientmaskinen.

Microsoft Windows [Version 6.1.7601]
(c) Microsoft Corporation, 2009. Alla rÀttigheter förbehÄlls.

C:gittest>git init .
Initierade ett tomt Git-repo i C:‍/gittest/.git/

C:gittest>echo "test dev1 to proj2" > test1.txt

C:gittest>git add .

C:gittest>git status
PĂ„ branch master
Inga commits Ànnu
Ändringar som ska begĂ„s:
  (anvÀnd "git rm --cached <fil>..." för att ta bort i staging)
        ny fil:   test1.txt

C:gittest>git commit -am "ny testfil tillagd"
[master (root-commit) a7ac614] ny testfil tillagd
 1 fil Àndrad, 1 insÀttning(+)
 skapa lÀge 100644 test1.txt
 
C:gittest>git remote add origin "ssh://dev1@10.1.1.11/var/gitservertest/proj2"

C:gittest>git push origin master
dev1:dev1@10.1.1.11's lösenord:
RĂ€knar objekt: 3, klart.
Skriver objekt: 100% (3/3), 243 bytes | 243.00 KiB/s, klart.
Totalt 3 (delta 0), ÄteranvÀnt 0 (delta 0)
Till ssh://10.1.1.11/var/gitservertest/proj2
 * [ny branch]      master -> master

C:gittest>

Samtidigt skapas nya filer pÄ servern, och de tillhör anvÀndaren som gjorde 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 kataloger, 18 filer
[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]$

NÀr Àndringar laddas upp till servern skapas ytterligare filer och kataloger i Git, och deras Àgare Àr faktiskt den anvÀndare som laddar upp. Men dÄ motsvarar Àven gruppen för dessa filer och kataloger den primÀra gruppen för denna anvÀndare, det vill sÀga, gruppen dev1 för anvÀndaren dev1 och gruppen dev2 för anvÀndaren dev2 (att byta huvudgruppen för utvecklaranvÀndaren hjÀlper inte, eftersom hur skulle man dÄ arbeta med flera projekt?). I sÄ fall kan anvÀndaren dev2 inte Àndra filer som skapats av anvÀndaren dev1, och detta kan leda till funktionsproblem.

Linux chown — Ă€ndra Ă€gare av fil som en vanlig anvĂ€ndare

Filens Àgare kan inte Àndra dess ÀganderÀtt. Men han kan Àndra gruppen för filen, som tillhör honom, och dÄ kan den filen bli tillgÀnglig för Àndring av andra anvÀndare som finns i samma grupp. Det Àr precis vad vi behöver.

AnvÀnda Git hook

Arbetskatalogen för hook Àr projektets rotkatalog. Hook Àr en körbar fil som körs av anvÀndaren som gör push. Med denna vetskap kan vi genomföra det avsedda.

[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<> hooks/post-update

eller bara

vi hooks/post-update

LÄt oss ÄtervÀnda till klientmaskinen.

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 fil Àndrad, 1 insÀttning(+)

C:gittest>git push origin master
dev1:dev1@10.1.1.11's password:
   d22c66e..b045e22 master -> master

PĂ„ Git-servern kontrollerar vi efter commit att hook post-update-skriptet fungerar

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

— tomt, allt Ă€r okej.

Ansluta den andra utvecklaren i Git

Vi simulerar den andra utvecklarens arbete.

PĂ„ klienten

C:gittest>git remote remove origin

C:gittest>git remote add origin "ssh://dev2@10.1.1.11/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 filer Àndrade, 2 insÀttningar(+)
 skapa lÀge 100644 test2.txt

C:gittest>git push origin master
dev2@10.1.1.11's password:
   b045e22..55d49a6 master -> master

Och samtidigt, pÄ servern


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

— Ă„terigen tomt, allt fungerar.

Ta bort Git-projektet och ladda upp projektet frÄn Git-servern

Vi kan Ànnu en gÄng bekrÀfta att alla Àndringar har sparats.

C:gittest>rd /S /Q .
Processen kan inte fÄ Ätkomst till filen eftersom den Àr upptagen av en annan process.

— för att ta bort Git-projektet, raderar vi helt katalogen. Vi accepterar det visade felet eftersom det Ă€r omöjligt att ta bort den aktuella katalogen med detta kommando, men vi behöver just detta beteende.

C:gittest>dir
 InnehÄllet i mappen C:gittest

21.06.2019  08:43              .
21.06.2019  08:43              ..

C:gittest>git clone ssh://dev2@10.1.1.11/var/gitservertest/proj2
Klonar in i 'proj2'...
dev2@10.1.1.11's password:

C:gittest>cd proj2

C:gittestproj2>dir
 InnehÄllet i mappen C:gittestproj2

21.06.2019  08:46              .
21.06.2019  08:46              ..
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"

Separering av tillgÄng i Git

Nu kontrollerar vi att Àven genom Git kan den andra utvecklaren inte fÄ Ätkomst till projektet Proj1, som han inte arbetar med.

C:gittestproj2>git remote remove origin

C:gittestproj2>git remote add origin "ssh://dev2@10.1.1.11/var/gitservertest/proj1"

C:gittestproj2>git push origin master
dev2@10.1.1.11's password:
fatal: '/var/gitservertest/proj1' verkar inte vara ett git-repository
fatal: Kunde inte lÀsa frÄn det fjÀrrrepositoryt.

Kontrollera att du har rÀtt ÄtkomstrÀttigheter
och att repositoryt finns.

Nu tillÄter vi Ätkomst

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

och efter det fungerar allt.

C:gittestproj2>git push origin master
dev2@10.1.1.11's password:
Till ssh://10.1.1.11/var/gitservertest/proj1
 * [new branch]      master -> master

Ytterligare information

Dessutom, om det finns problem med standardrÀttigheterna vid skapande av filer och kataloger, kan man i CentOS anvÀnda kommandot

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

I artikeln kan du ocksÄ stöta pÄ smÄ anvÀndbara saker:

  • hur man skapar en katalogstruktur i Linux
  • hur man i sed anger en adressintervall frĂ„n en viss rad till slutet av filen, det vill sĂ€ga, gör en ersĂ€ttning i sed i alla rader förutom första raden
  • Hur man i Linux finner upphĂ€va sökvillkoret
  • hur man i Linux-shell överför flera rader till en loop via en one-liner
  • hur man i bash skyddar enkla citat
  • hur man raderar en katalog med allt innehĂ„ll frĂ„n kommandoraden i Windows
  • Hur man med bash mv omdöper en fil utan att skriva över den

Tack för uppmÀrksamheten.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster