En instal·lar i configurar un servidor Git, sorgeix la qüestió d'organitzar l'accés de diversos usuaris a diversos projectes. Vaig fer una mica de recerca sobre el problema i vaig trobar una solució que s'adaptava a tots els meus requisits: senzilla, segura, fiable.
Els meus desitjos són:
- cada usuari es connecta amb el seu propi compte
- Diversos usuaris poden treballar en el mateix projecte
- un mateix usuari pot treballar en diversos projectes
- cada usuari només té accés als projectes en què treballa
- hauria de ser possible connectar-se mitjançant la línia d'ordres, i no només mitjançant algun tipus d'interfície web
També seria genial:
- concedir drets de només lectura a les persones que controlen
- Administreu còmodament els permisos dels usuaris a Git
Visió general de les opcions possibles per accedir al servidor GIT
En primer lloc, heu de saber entre què triar, així que una breu visió general dels protocols Git.
- ssh: s'utilitza un compte d'usuari creat especialment per accedir al servidor.
- És estrany que Git no recomana utilitzar un compte per accedir a tots els dipòsits. Això no compleix en absolut els meus requisits.
- Podeu utilitzar diversos comptes, però com podeu limitar l'accés d'un usuari només a determinats directoris?
- Tancar-se al directori d'inici no és adequat, perquè és difícil organitzar l'accés d'escriptura per a altres usuaris allà
- L'ús d'enllaços simbòlics del directori d'inici també és complicat perquè Git no els interpreta com a enllaços.
- Restringeix l'accés a l'intèrpret, bé, pots, però no hi ha cap garantia total que això funcioni sempre
- En general, podeu connectar el vostre propi intèrpret d'ordres per a aquests usuaris, però,
- en primer lloc, aquesta ja és una mena de decisió difícil,
- i 2, es pot ometre.
- En general, podeu connectar el vostre propi intèrpret d'ordres per a aquests usuaris, però,
Però potser no és un problema que l'usuari pugui executar cap ordre?... En general, aquest mètode no es pot descartar si esbrineu exactament com utilitzar-lo. Tornarem a aquest mètode més endavant, però de moment analitzarem breument la resta d'alternatives, potser hi haurà alguna cosa més senzilla.
- El protocol local git es pot utilitzar en combinació amb sshfs, es poden utilitzar diversos usuaris, però és essencialment el mateix que el cas anterior
- http - només lectura
- git és només de lectura
- https és difícil d'instal·lar, necessites programari addicional, algun tipus de panell de control per organitzar l'accés dels usuaris... sembla factible, però d'alguna manera tot és complicat.
Utilitzant el protocol ssh per organitzar l'accés multiusuari al servidor Git
Tornem al protocol ssh.
Com que s'utilitza l'accés ssh per a git, les dades del servidor han de ser segures. L'usuari que es connecta mitjançant ssh utilitza el seu propi inici de sessió al servidor Linux, de manera que es pot connectar mitjançant el client ssh i accedir a la línia d'ordres del servidor.
No hi ha una protecció completa contra aquest accés.
Però l'usuari no hauria d'interessar els fitxers Linux. La informació significativa només s'emmagatzema al repositori git. Per tant, no es pot restringir l'accés a través de la línia d'ordres, sinó que mitjançant Linux, prohibir a l'usuari visualitzar projectes, excloent aquells en què participa.
És obvi utilitzar el sistema de permisos Linux.
Com ja s'ha esmentat, només és possible utilitzar un compte per a l'accés ssh. Aquesta configuració no és segura per a diversos usuaris, tot i que s'inclou a la llista d'opcions recomanades de git.
Per implementar els requisits indicats al principi de l'article, es crea la següent estructura de directoris amb l'assignació de drets i propietaris:
1) directoris de projectes
dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
on
dir1, dir2, dir3 - directoris del projecte: projecte 1, projecte 2, projecte 3.
proj1:proj1, proj2:proj2, proj3:proj3 són usuaris de Linux creats especialment que s'assignen com a propietaris dels directoris de projecte respectius.
els drets de tots els directoris s'estableixen en 0770: accés complet per al propietari i el seu grup, i prohibició total per a tots els altres.
2) comptes de desenvolupador
Разработчик 1: dev1:dev1,proj1,proj2
Разработчик 2: dev2:dev2,proj2,proj3
El punt clau és que als desenvolupadors se'ls assigna un grup addicional de l'usuari del sistema propietari del projecte corresponent. Això ho fa l'administrador del servidor Linux amb una ordre.
En aquest exemple, el desenvolupador 1 està treballant en els projectes proj1 i proj2, i el desenvolupador 2 està treballant en els projectes proj2 i proj3.
Si algun dels desenvolupadors es connecta mitjançant ssh a través de la línia d'ordres, els seus drets no seran suficients ni tan sols per veure el contingut dels directoris de projectes en què no participa. Ell mateix no pot canviar-ho.
Com que la base d'aquest principi és la seguretat bàsica dels drets de Linux, aquest esquema és fiable. A més, l'esquema és molt fàcil d'administrar.
Anem a practicar.
Creació de repositoris Git en un servidor Linux
Comprovem.
[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
cansat d'escriure...
[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
Estem convençuts que és impossible accedir als repositoris d'altres persones des de la línia d'ordres i fins i tot veure'n el contingut.
[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
Col·laboració en Git de diversos desenvolupadors en un projecte
Queda una pregunta: si un desenvolupador introdueix un fitxer nou, altres desenvolupadors no el poden canviar, perquè ell mateix n'és el propietari (per exemple, dev1) i no l'usuari propietari del projecte (per exemple, proj1). Com que tenim un repositori de servidor, primer de tot, hem de saber com està disposat el directori “.git” i si es creen nous fitxers.
Creeu un repositori Git local i envieu-lo a un servidor Git
Passem a la màquina client.
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>
Al mateix temps, es generen nous fitxers al servidor i pertanyen a l'usuari que ha realitzat l'empenta
[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]$
Quan es carreguen els canvis al servidor Git, es creen fitxers i directoris addicionals que són propietat de l'encarregat de pujar. Però aleshores el grup d'aquests fitxers i directoris també correspon al grup principal d'aquest usuari, és a dir, el grup dev1 per a l'usuari dev1 i el grup dev2 per a l'usuari dev2 (canviar el grup principal de l'usuari desenvolupador no ajudarà, perquè llavors com treballar en múltiples projectes?). En aquest cas, l'usuari dev2 no podrà modificar els fitxers creats per l'usuari dev1, i això està ple d'una violació de la funcionalitat.
Linux chown: canvia el propietari d'un fitxer per part d'un usuari normal
El propietari d'un fitxer no pot canviar-ne la propietat. Però pot canviar el grup d'un fitxer que li pertany, i després aquest fitxer pot ser modificat per altres usuaris que estiguin al mateix grup. Això és el que necessitem.
Utilitzant el Git Hook
El directori de treball per a hook és el directori arrel del projecte. hook és un executable que s'executa sota l'usuari que fa l'empenta. sabent això, podem dur a terme els nostres plans.
[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
o bé només
vi hooks/post-update
Tornem a la màquina client.
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
Al servidor Git, comproveu el treball de l'script posterior a l'actualització del ganxo després de la confirmació
[dev1@server proj2]$ find . ! -group proj2
- buit, tot està bé.
Connectant un segon desenvolupador a Git
Simulem el treball del segon desenvolupador.
Sobre el client
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 alhora, al servidor...
[dev1@server proj2]$ find . ! -group proj2
- de nou buit, tot funciona.
Suprimir un projecte Git i carregar un projecte des d'un servidor Git
Bé, podeu tornar a assegurar-vos que tots els canvis s'han desat.
C:gittest>rd /S /Q .
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
- per eliminar un projecte Git, simplement esborreu el directori completament. Suportem l'error donat, ja que és impossible esborrar el directori actual amb aquesta ordre, però aquest és exactament el comportament que necessitem.
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"
Compartint l'accés a Git
Ara assegurem-nos que el segon desenvolupador no pot accedir al projecte Proj1 a través de Git, en el qual no treballa.
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.
Ara permet l'accés
[root@server ~]# usermod -aG proj1 dev2
i després tot funciona.
C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
* [new branch] master -> master
Per obtenir més informació,
A més, si hi ha un problema amb els permisos predeterminats en crear fitxers i directoris, a CentOS podeu utilitzar l'ordre
setfacl -Rd -m o::5 -m g::7 /var/gitservertest
També a l'article podeu ensopegar amb petites coses útils:
- com construir un arbre de directoris a Linux
- com passar un rang d'adreces des d'una línia determinada fins al final del fitxer a sed, és a dir, fer un reemplaçament en sed a totes les línies excepte a la primera línia
- Com invertir la condició de cerca a la cerca de Linux
- com passar diverses línies a través d'una sola línia en un shell de Linux
- com escapar de cometes simples a bash
- com esborrar un directori amb tot el contingut a la línia d'ordres de Windows
- Com canviar el nom d'un fitxer amb bash mv sense tornar-lo a escriure
Gràcies per la seva atenció.
Font: www.habr.com