Urganizazione di l'accessu multi-utilizatori à u servitore GIT

Quandu si stallanu è cunfigurà un servitore Git, a quistione di urganizà l'accessu per parechji utilizatori à parechji prughjetti. Aghju fattu una ricerca nantu à u prublema è truvaru una suluzione chì risponde à tutti i mo bisogni: simplice, sicuru, affidabile.

I mo desideri sò:

  • ogni utilizatore si cunnetta cù u so contu
  • Diversi utilizatori ponu travaglià nant'à u listessu prughjettu
  • u listessu utilizatore pò travaglià nant'à parechji prughjetti
  • ogni utilizatore hà accessu solu à quelli prughjetti nantu à quale ellu travaglia
  • duverebbe esse pussibule di cunnette cù a linea di cummanda, è micca solu per un tipu d'interfaccia web

Saria ancu bellu:

  • dà diritti di sola lettura à e persone di cuntrollu
  • amministra convenientemente i permessi di l'utilizatori in Git

Panoramica di e pussibuli opzioni per accede à u servitore GIT

Prima di tuttu, avete bisognu di sapè da quale sceglite, cusì una breve panoramica di i protokolli Git.

  • ssh - un contu d'utilizatore creatu apposta hè utilizatu per accede à u servitore.
    • hè stranu chì Git ùn ricumande micca di utilizà un contu per accede à tutti i repositori. Questu ùn risponde micca à i mo bisogni.
    • Pudete aduprà parechje cunti, ma cumu pudete limità l'accessu di un utilizatore solu à certi cartulari?
      • Chiusu in u cartulare di casa ùn hè micca adattatu, perchè hè difficiule d'urganizà l'accessu di scrittura per altri utilizatori
      • Utilizà ligami simbolichi da u cartulare di casa hè ancu difficiule perchè Git ùn li interpreta micca cum'è ligami.
      • Limite l'accessu à l'interprete, bè, pudete, ma ùn ci hè micca una garantia cumpleta chì questu sempre travaglià
        • Pudete generalmente cunnette u vostru propiu interprete di cumandamentu per tali utilizatori, ma
          • prima, questu hè digià una sorta di decisione difficiule,
          • è in segundu, questu pò esse aggiratu.

    Ma forsi ùn hè micca un prublema chì l'utilizatore hà da pudè eseguisce qualsiasi cumandamenti? .. In generale, stu metudu ùn pò micca esse escludutu s'ellu si capisce esattamente cumu si usa. Riturneremu à stu metudu più tardi, ma per ora cunsideremu brevemente l'altri alternattivi, forse ci sarà qualcosa di più simplice.

  • git protokollu lucale pò esse usatu in cumminazione cù sshfs, parechji utilizatori ponu esse utilizati, ma hè essenzialmente u listessu cum'è u casu precedente
  • http - leghje solu
  • git hè di sola lettura
  • https hè difficiule di stallà, avete bisognu di software supplementu, un tipu di pannellu di cuntrollu per urganizà l'accessu di l'utilizatori ... pare fattibile, ma in ogni modu tuttu hè cumplicatu.

Utilizà u protocolu ssh per urganizà l'accessu multi-utilizatori à u servitore Git

Riturnemu à u protocolu ssh.

Siccomu utilizate l'accessu ssh per git, avete bisognu di assicurà a sicurità di e dati di u servitore. L'utilizatore chì si cunnetta via ssh usa u so propiu login in u servitore Linux, cusì ponu cunnette via u cliente ssh è accede à a linea di cummanda di u servitore.
Ùn ci hè micca una prutezzione cumpleta contru à ottene tali accessu.

Ma l'utilizatore ùn deve esse interessatu à i schedari Linux. L'infurmazione significativa hè guardata solu in u repository git. Per quessa, ùn pudete micca limità l'accessu attraversu a linea di cummanda, ma per mezu di Linux, pruibite l'utilizatori di vede i prughjetti, escludendu quelli in quale ellu participa.
Hè ovvi à utilizà u sistema di permessi Linux.

Comu digià dettu, hè pussibule di utilizà un solu contu per l'accessu ssh. Questa cunfigurazione ùn hè micca sicura per parechji utilizatori, ancu s'ellu hè inclusu in a lista di git di l'opzioni cunsigliate.

Per implementà e esigenze date à l'iniziu di l'articulu, a seguente struttura di repertoriu hè creata cù l'assignazione di diritti è pruprietarii:

1) repertorii di prughjettu

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
induve
dir1, dir2, dir3 - repertorii di prughjettu: prughjettu 1, prughjettu 2, prughjettu 3.

proj1: proj1, proj2: proj2, proj3: proj3 sò utilizatori Linux creati apposta chì sò attribuiti cum'è i pruprietarii di i rispettivi repertorii di prughjettu.

i diritti à tutti i cartulari sò stabiliti à 0770 - accessu cumpletu per u pruprietariu è u so gruppu, è una interdizzione cumpleta per tutti l'altri.

2) cunti di sviluppatore

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

U puntu chjave hè chì i sviluppatori sò attribuiti un gruppu supplementu di l'utilizatori di u sistema chì pussede u prughjettu currispundente. Questu hè fattu da l'amministratore di u servitore Linux cun un cumandamentu.

In questu esempiu, u Sviluppatore 1 travaglia nantu à i prughjetti proj1 è proj2, è u Sviluppatore 2 travaglia nantu à i prughjetti proj2 è proj3.

Se qualchissia di i Sviluppatori cunnetta via ssh via a linea di cummanda, allora i so diritti ùn saranu micca abbastanza ancu per vede u cuntenutu di i repertorii di prughjetti in quale ùn participa micca. Ùn pò micca cambià ellu stessu.

Siccomu a basa di stu principiu hè a sicurità di basa di i diritti Linux, stu schema hè affidabile. Inoltre, u schema hè assai faciule d'amministrari.

Passemu à a pratica.

Creazione di repositori Git in un servitore Linux

Avemu verificatu.

[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

stancu di scrive...

[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

Semu cunvinti chì hè impussibile di accede à i repositori di l'altri da a linea di cummanda è ancu vede u so cuntenutu.

[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

Cullaburazione in Git di parechji sviluppatori nantu à un prughjettu

Una quistione resta, se un sviluppatore introduce un novu schedariu, altri sviluppatori ùn ponu micca cambià, perchè ellu stessu hè u so pruprietariu (per esempiu, dev1), è micca u pruprietariu di u prugettu (per esempiu, proj1). Siccomu avemu un repository di u servitore, prima di tuttu, avemu bisognu di sapè cumu hè strutturatu u repertoriu ".git" è se sò creati novi schedari.

Crea un repository Git locale è spinghja à un servitore Git

Passemu à a macchina cliente.

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>

À u listessu tempu, novi schedarii sò generati nantu à u servitore, è appartenenu à l'utilizatore chì hà realizatu u 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]$

Quandu i cambiamenti sò caricati in u servitore Git, i schedarii è i cartulari supplementari sò creati è sò in realtà posseduti da u uploader. Ma allora u gruppu di questi schedari è cartulari currisponde ancu à u gruppu principale di questu utilizatore, vale à dì, u gruppu dev1 per l'utilizatore dev1 è u gruppu dev2 per l'utilizatore dev2 (cambià u gruppu principale di l'utilizatori di sviluppatore ùn aiuterà micca, perchè allora. cumu travaglià in parechji prughjetti?). In questu casu, l'utilizatore dev2 ùn serà micca capaci di mudificà i schedari creati da l'utilizatore dev1, è questu hè pienu di una violazione di funziunalità.

Linux chown - cambià u pruprietariu di un schedariu da un usu normale

U pruprietariu di un schedariu ùn pò micca cambià a so pruprietà. Ma ellu pò cambià u gruppu di un schedariu chì appartene à ellu, è dopu stu schedariu pò esse cambiatu da altri utilizatori chì sò in u stessu gruppu. Hè ciò chì avemu bisognu.

Utilizà u Git Hook

U repertoriu di travagliu per u ganciu hè u cartulare radicale di u prugettu. hook hè un eseguibile chì corre sottu à l'utilizatore chì face a spinta. sapendu questu, pudemu rializà i nostri piani.

[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

sia solu

vi hooks/post-update

Riturnemu à a macchina cliente.

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

In u servitore Git, verificate u travagliu di l'script post-update di u ganciu dopu à l'impegnu

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

- viotu, tuttu va bè.

Cunnettendu un secondu sviluppatore à Git

Simulemu u travagliu di u sicondu sviluppatore.

Nantu à u cliente

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

È à u stessu tempu, nantu à u servitore ...

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

- torna viotu, tuttu funziona.

Eliminazione di un Prughjettu Git è Caricà un Prughjettu da un Servitore Git

Ebbè, pudete dinò una volta assicuratevi chì tutti i cambiamenti sò stati salvati.

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

- per sguassà un prughjettu Git, basta à sguassate u cartulare cumpletamente. Pudemu cun l'errore chì hè generatu, postu chì hè impussibile di sguassà u repertoriu attuale cù questu cumandamentu, ma questu hè esattamente u cumpurtamentu chì avemu bisognu.

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"

Sparte l'accessu in Git

Avà assicuremu chì ancu attraversu Git u sicondu sviluppatore ùn pò micca accede à u prughjettu Proj1, nantu à quale ùn hè micca travagliatu.

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.

Avà permette l'accessu

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

è dopu tuttu travaglia.

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

Per di più infurmazioni,

Inoltre, s'ellu ci hè un prublema cù i permessi predeterminati quandu creanu schedari è cartulari, in CentOS pudete aduprà u cumandamentu.

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

Ancu in l'articulu pudete sbattà in picculi cose utili:

  • cumu custruisce un arbulu di directory in linux
  • cumu passà una serie di indirizzi da una certa linea à a fine di u schedariu in sed, vale à dì per fà un rimpiazzamentu in sed in tutte e linee eccettu a prima linea
  • Cumu invertisce a cundizione di ricerca in Linux find
  • cumu passà parechje linee attraversu un lineru in una shell linux
  • cumu scappà di virgolette singole in bash
  • cumu sguassà un repertoriu cù tuttu u cuntenutu in a linea di cummanda di Windows
  • Cumu aduprà bash mv per rinominà un schedariu senza riscrivellu di novu

ti ringraziu per u vostru attinzioni.

Source: www.habr.com

Add a comment