Òganizasyon aksè milti-itilizatè nan sèvè GIT la

Lè w enstale ak konfigirasyon yon sèvè Git, kesyon an rive sou òganize aksè pou plizyè itilizatè a plizyè pwojè. Mwen fè rechèch sou pwoblèm nan epi mwen jwenn yon solisyon ki satisfè tout kondisyon mwen yo: senp, san danje, serye.

Dezi mwen yo se:

  • chak itilizatè konekte ak pwòp kont yo
  • Plizyè itilizatè yo ka travay sou yon pwojè
  • itilizatè a menm ka travay sou plizyè pwojè
  • chak itilizatè gen aksè sèlman nan pwojè sa yo sou ki li ap travay
  • Li ta dwe posib yo konekte atravè liy lan lòd, epi yo pa sèlman atravè kèk kalite koòdone entènèt

Li ta bon tou:

  • bay pèmisyon pou lekti sèlman pou moun ki kontwole yo
  • Byen jere dwa aksè itilizatè yo nan Git

Apèsi sou opsyon posib pou jwenn aksè nan sèvè GIT la

Premye a tout, ou bezwen konnen ki sa yo chwazi nan, kidonk isit la nan yon BECA rapid nan pwotokòl Git.

  • ssh - se yon kont itilizatè ki kreye espesyalman pou jwenn aksè nan sèvè a.
    • Li etranj ke Git pa eskli nan rekòmandasyon li yo itilize nan yon sèl kont jwenn aksè nan tout depo. Sa a pa satisfè kondisyon mwen yo ditou.
    • Ou ka itilize plizyè kont, men ki jan ou ka limite aksè itilizatè a sèlman sèten anyè?
      • Fèmen nan anyè kay la pa apwopriye, paske li difisil pou òganize aksè ekri la pou lòt itilizatè yo
      • Sèvi ak lyen senbolik ki soti nan anyè lakay ou tou difisil paske Git pa entèprete yo kòm lyen
      • Li posib pou limite aksè nan entèprèt la, men pa gen okenn garanti total ke li pral toujou travay
        • Ou ka jeneralman konekte entèprèt pwòp lòd ou a pou itilizatè sa yo, men
          • premyèman, sa a se deja yon kalite desizyon difisil,
          • ak dezyèmman, sa a ka kontourne.

    Men, petèt li se pa yon pwoblèm ke itilizatè a pral kapab egzekite nenpòt kòmandman?.. An jeneral, metòd sa a pa ka regle si ou konnen egzakteman ki jan yo sèvi ak li. Nou pral retounen nan metòd sa a pita, men pou kounye a nou pral yon ti tan konsidere lòt altènativ yo, petèt pral gen yon bagay ki pi senp.

  • Pwotokòl lokal git la ka itilize nan konbinezon ak sshfs, plizyè itilizatè yo ka itilize, men esansyèlman menm jan ak ka anvan an.
  • http - lekti sèlman
  • git se lekti sèlman
  • https - difisil pou enstale, ou bezwen lojisyèl adisyonèl, kèk kalite panèl kontwòl pou òganize aksè itilizatè... li sanble posib, men yon jan kanmenm tout bagay se konplike.

Sèvi ak pwotokòl ssh la pou òganize aksè milti-itilizatè nan sèvè Git la

Ann retounen nan pwotokòl ssh la.

Depi ou itilize aksè ssh pou git, ou bezwen asire sekirite done sèvè a. Itilizatè a ki konekte atravè ssh sèvi ak pwòp login yo sou sèvè Linux la, pou yo ka konekte atravè kliyan an ssh epi jwenn aksè nan liy lòd sèvè a.
Pa gen okenn pwoteksyon konplè kont aksè sa yo.

Men, itilizatè a pa ta dwe enterese nan dosye Linux. Enfòmasyon enpòtan yo estoke sèlman nan depo git la. Se poutèt sa, li posib pa mete restriksyon sou aksè atravè liy lòd la, men lè l sèvi avèk zouti Linux yo entèdi itilizatè a soti nan gade pwojè, eksepte sa yo nan ki li patisipe.
Chwa a evidan se sèvi ak sistèm nan otorizasyon Linux.

Kòm deja mansyone, li posib pou itilize yon sèl kont pou aksè ssh. Konfigirasyon sa a pa an sekirite pou plizyè itilizatè, byenke li enkli nan lis opsyon git rekòmande yo.

Pou aplike egzijans yo bay nan kòmansman atik la, yo kreye estrikti anyè sa a ak plasman dwa ak pwopriyetè:

1) anyè pwojè

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
kote
dir1, dir2, dir3 - anyè pwojè: pwojè 1, pwojè 2, pwojè 3.

proj1:proj1, proj2:proj2, proj3:proj3 se itilizatè Linux ki te kreye espesyalman ke yo asiyen kòm pwopriyetè repèrtwar pwojè korespondan yo.

otorizasyon pou tout anyè yo mete sou 0770 - aksè konplè pou pwopriyetè a ak gwoup li a ak yon entèdiksyon konplè pou tout lòt moun.

2) kont pwomotè

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

Pwen kle a se ke devlopè yo asiyen yon gwoup adisyonèl nan pwopriyetè itilizatè sistèm nan pwojè ki koresponn lan. Se administratè sèvè Linux ki fè sa ak yon sèl kòmand.

Nan egzanp sa a, "Developer 1" ap travay sou pwojè proj1 ak proj2, ak "Developer 2" ap travay sou pwojè proj2 ak proj3.

Si nenpòt nan Devlopè yo konekte via ssh atravè liy lòd la, Lè sa a, dwa yo pa pral ase menm yo wè sa ki nan anyè pwojè kote yo pa patisipe. Li pa ka chanje sa a tèt li.

Depi baz prensip sa a se sekirite debaz dwa Linux, konplo sa a serye. Anplis de sa, konplo a trè fasil pou administre.

Ann kontinye pratike.

Kreye depo Git sou yon sèvè Linux

Nou tcheke.

[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

Mwen bouke tape alamen...

[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

Nou konvenki ke li enposib jwenn aksè nan depo lòt moun nan liy lòd la e menm wè sa yo.

[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

Kolabore ak plizyè devlopè sou menm pwojè a nan Git

Yon kesyon rete, si yon pwomotè prezante yon nouvo dosye, Lè sa a, lòt devlopè pa ka chanje li, paske li menm se pwopriyetè li (pa egzanp, dev1), epi li pa pwopriyetè itilizatè a nan pwojè a (pa egzanp, proj1). Depi nou gen yon repozitwa bò sèvè, anvan tout bagay, nou bezwen konnen ki jan anyè ".git" estriktire epi si yo kreye nouvo dosye.

Kreye yon repozitwa Git lokal epi pouse nan sèvè Git la

Ann ale nan machin kliyan an.

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>

An menm tan an, nouvo dosye yo kreye sou sèvè a, epi yo fè pati itilizatè a ki fè pouse a

[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]$

Lè ou telechaje chanjman nan sèvè Git la, yo kreye lòt fichye ak repèrtwar, epi pwopriyetè yo se aktyèlman itilizatè a ki fè upload la. Men, Lè sa a, gwoup la nan dosye sa yo ak anyè tou koresponn ak gwoup prensipal itilizatè sa a, se sa ki, gwoup dev1 pou itilizatè dev1 ak gwoup dev2 pou itilizatè dev2 (chanje gwoup prensipal itilizatè pwomotè a pa pral ede, paske lè sa a ki jan ou ka travay sou plizyè pwojè?). Nan ka sa a, itilizatè dev2 pa pral kapab chanje dosye ki te kreye pa itilizatè dev1, ki ta ka mennen nan yon pann nan fonksyonalite.

Linux chown - chanje pwopriyetè a nan yon dosye pa yon itilizatè regilye

Pwopriyetè a nan yon dosye pa ka chanje pwopriyetè li. Men, li ka chanje gwoup la nan yon dosye ki fè pati pou li, ak Lè sa a, dosye sa a ka modifye pa lòt itilizatè ki nan menm gwoup la. Se sa nou bezwen.

Sèvi ak zen Git

Anyè k ap travay pou zen se anyè rasin pwojè a. zen se yon ègzèkutabl ki kouri anba itilizatè a fè pouse a. Konnen sa, nou kapab aplike plan nou.

[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

swa jis

vi hooks/post-update

Ann retounen nan machin kliyan an.

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

Sou sèvè Git la, nou tcheke operasyon kwòk pòs-mizajou apre komèt la

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

- vid, tout bagay anfòm.

Konekte yon dezyèm pwomotè nan Git

Ann simulation travay dezyèm pwomotè a.

Sou kliyan an

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

Ak an menm tan an, sou sèvè a...

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

— vid ankò, tout bagay ap mache.

Efase yon pwojè Git ak telechaje pwojè a soti nan sèvè Git la

Oke, ou ka yon lòt fwa ankò asire w ke tout chanjman yo te sove.

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

— pou efase yon pwojè Git, tou senpleman efase anyè a nèt. Ann kite erè ki pwodui a, paske li enposib pou efase anyè aktyèl la lè l sèvi avèk lòd sa a, men sa a se egzakteman konpòtman nou bezwen an.

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"

Pataje aksè nan Git

Koulye a, kite a asire w ke menm atravè Git dezyèm pwomotè a pa ka jwenn aksè nan pwojè a Proj1, sou ki li pa ap travay.

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.

Koulye a, nou pèmèt aksè

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

epi apre sa tout bagay ap mache.

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

Pou plis enfòmasyon,

Anplis de sa, si gen yon pwoblèm ak otorizasyon yo default lè w ap kreye fichye ak repèrtwar, nan CentOS ou ka itilize kòmandman an.

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

Epitou nan atik la ou ka bite sou ti bagay itil:

  • ki jan yo bati yon pye bwa anyè nan Linux
  • ki jan yo pase yon seri adrès nan sed soti nan yon liy sèten nan fen dosye a, se sa ki fè yon ranplasman nan sed nan tout liy eksepte premye liy lan
  • Ki jan yo envèse yon kondisyon rechèch nan Linux jwenn
  • Ki jan yo pase plizyè liy nan yon bouk lè l sèvi avèk yon sèl-revètman nan koki Linux la
  • Ki jan yo sove yon sèl quotes nan bash
  • Ki jan yo efase yon anyè ak tout sa li nan liy lan lòd Windows
  • Ki jan yo sèvi ak bash mv chanje non yon dosye san yo pa reekri li ankò

Mèsi pou atansyon ou.

Sous: www.habr.com

Add nouvo kòmantè