GIT serveriga ko'p foydalanuvchi kirishini tashkil etish

Git serverini o'rnatish va sozlashda bir nechta foydalanuvchilarning bir nechta loyihalarga kirishini tashkil qilish haqida savol tug'iladi. Men muammoni o'rganib chiqdim va barcha talablarimga javob beradigan yechim topdim: oddiy, xavfsiz, ishonchli.

Mening tilaklarim:

  • har bir foydalanuvchi o'z hisobiga ulanadi
  • Bitta loyiha ustida bir nechta foydalanuvchilar ishlashi mumkin
  • bir foydalanuvchi bir nechta loyihalarda ishlashi mumkin
  • har bir foydalanuvchi faqat o'zi ishlayotgan loyihalarga kirish huquqiga ega
  • Ulanish faqat qandaydir veb-interfeys orqali emas, balki buyruq qatori orqali amalga oshirilishi kerak

Bu ham ajoyib bo'lardi:

  • nazorat qiluvchi shaxslarga faqat o'qish uchun ruxsatlarni berish
  • Git-da foydalanuvchilarning kirish huquqlarini qulay tarzda boshqaring

GIT serveriga kirishning mumkin bo'lgan variantlari haqida umumiy ma'lumot

Avvalo, siz nimani tanlashni bilishingiz kerak, shuning uchun bu erda Git protokollari haqida qisqacha ma'lumot.

  • ssh - serverga kirish uchun maxsus yaratilgan foydalanuvchi hisobi ishlatiladi.
    • Ajablanarlisi shundaki, Git o'z tavsiyalaridan barcha omborlarga kirish uchun bitta hisob qaydnomasidan foydalanishni istisno etmaydi. Bu mening talablarimga umuman javob bermaydi.
    • Siz bir nechta hisoblardan foydalanishingiz mumkin, lekin foydalanuvchining faqat ma'lum kataloglarga kirishini qanday cheklash mumkin?
      • Uy katalogini yopish mos emas, chunki u erda boshqa foydalanuvchilar uchun yozishni tashkil qilish qiyin
      • Uy katalogingizdagi simli havolalardan foydalanish ham qiyin, chunki Git ularni havola sifatida talqin qilmaydi
      • Tarjimonga kirishni cheklash mumkin, ammo u har doim ishlashiga to'liq kafolat yo'q
        • Bunday foydalanuvchilar uchun odatda o'z buyruq tarjimonini ulashingiz mumkin, lekin
          • birinchidan, bu allaqachon qandaydir qiyin qaror,
          • ikkinchidan, buni chetlab o'tish mumkin.

    Lekin, ehtimol, foydalanuvchi har qanday buyruqni bajara olishi muammo emasdir?.. Umuman olganda, agar siz undan qanday foydalanishni aniq tushunsangiz, bu usulni istisno qilib bo'lmaydi. Biz bu usulga keyinroq qaytamiz, ammo hozircha biz boshqa muqobillarni qisqacha ko'rib chiqamiz, ehtimol oddiyroq narsa bo'ladi.

  • Git mahalliy protokoli sshfs bilan birgalikda ishlatilishi mumkin, bir nechta foydalanuvchilardan foydalanish mumkin, lekin aslida oldingi holat bilan bir xil
  • http - faqat o'qish uchun
  • git faqat o'qish uchun mo'ljallangan
  • https - o'rnatish qiyin, sizga qo'shimcha dasturiy ta'minot, foydalanuvchi kirishini tashkil qilish uchun qandaydir boshqaruv paneli kerak ... bu mumkin ko'rinadi, lekin qandaydir tarzda hamma narsa murakkab.

Git serveriga ko'p foydalanuvchi kirishini tashkil qilish uchun ssh protokolidan foydalanish

Keling, ssh protokoliga qaytaylik.

Git uchun ssh kirishidan foydalanganingiz uchun siz server ma'lumotlarining xavfsizligini ta'minlashingiz kerak. Ssh orqali ulangan foydalanuvchi Linux serverida o'z loginidan foydalanadi, shuning uchun ular ssh mijozi orqali ulanishlari va serverning buyruq qatoriga kirishlari mumkin.
Bunday kirishdan to'liq himoya yo'q.

Lekin foydalanuvchi Linux fayllariga qiziqmasligi kerak. Muhim ma'lumotlar faqat git omborida saqlanadi. Shuning uchun, buyruq qatori orqali kirishni cheklamaslik mumkin, lekin Linux vositalaridan foydalanib, foydalanuvchi ishtirok etadigan loyihalar bundan mustasno, loyihalarni ko'rishni taqiqlaydi.
Aniq tanlov Linux ruxsatlar tizimidan foydalanishdir.

Yuqorida aytib o'tilganidek, ssh kirish uchun faqat bitta hisobdan foydalanish mumkin. Ushbu konfiguratsiya bir nechta foydalanuvchilar uchun xavfsiz emas, garchi u tavsiya etilgan git variantlari ro'yxatiga kiritilgan.

Maqolaning boshida keltirilgan talablarni amalga oshirish uchun huquqlar va egalarni o'tkazish bilan quyidagi katalog tuzilmasi yaratilgan:

1) loyiha kataloglari

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
qayerda
dir1, dir2, dir3 - loyiha kataloglari: loyiha 1, loyiha 2, loyiha 3.

proj1:proj1, proj2:proj2, proj3:proj3 - tegishli loyiha kataloglarining egalari sifatida tayinlangan maxsus yaratilgan Linux foydalanuvchilari.

barcha kataloglar uchun ruxsatlar 0770 ga o'rnatiladi - egasi va uning guruhi uchun to'liq kirish va boshqalar uchun to'liq taqiq.

2) ishlab chiquvchi hisoblari

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

Muhim nuqta shundaki, ishlab chiquvchilarga tegishli loyihaning tizim foydalanuvchisi egasining qo'shimcha guruhi tayinlangan. Bu Linux server ma'muri tomonidan bitta buyruq bilan amalga oshiriladi.

Ushbu misolda "Developer 1" proj1 va proj2 loyihalarida, "Developer 2" esa proj2 va proj3 loyihalarida ishlamoqda.

Agar ishlab chiquvchilardan biri buyruq satri orqali ssh orqali ulansa, ularning huquqlari ular ishtirok etmayotgan loyiha kataloglari tarkibini ko'rish uchun ham etarli bo'lmaydi. U buni o'zi o'zgartira olmaydi.

Ushbu tamoyilning asosi Linux huquqlarining asosiy xavfsizligi bo'lganligi sababli, ushbu sxema ishonchli. Bundan tashqari, sxemani boshqarish juda oson.

Keling, amaliyotga o'tamiz.

Linux serverida Git omborlarini yaratish

Keling, tekshiramiz.

[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

Men qo'lda yozishdan charchadim ...

[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

Ishonchimiz komilki, buyruq satridan boshqa odamlarning omborlariga kirish va hatto ularning mazmunini ko'rish mumkin emas.

[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

Git-da bir xil loyihada bir nechta ishlab chiquvchilar bilan hamkorlik qiling

Bitta savol qoladi, agar bitta ishlab chiquvchi yangi faylni taqdim etsa, boshqa ishlab chiquvchilar uni o'zgartira olmaydi, chunki u loyihaning foydalanuvchi egasi emas (masalan, proj1) emas, balki uning egasi (masalan, dev1). Bizda server tomonidagi ombor mavjud bo'lganligi sababli, birinchi navbatda, biz ".git" katalogining qanday tuzilganligini va yangi fayllar yaratilganligini bilishimiz kerak.

Mahalliy Git omborini yaratish va Git serveriga surish

Keling, mijoz mashinasiga o'tamiz.

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>

Shu bilan birga, serverda yangi fayllar yaratiladi va ular surishni amalga oshirgan foydalanuvchiga tegishli

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

O'zgarishlarni Git serveriga yuklaganingizda, qo'shimcha fayllar va kataloglar yaratiladi va ularning egasi aslida yuklashni amalga oshiruvchi foydalanuvchi hisoblanadi. Ammo keyin ushbu fayllar va kataloglar guruhi ushbu foydalanuvchining asosiy guruhiga, ya'ni dev1 foydalanuvchisi uchun dev1 guruhiga va dev2 foydalanuvchisi uchun dev2 guruhiga mos keladi (ishlab chiquvchi foydalanuvchining asosiy guruhini o'zgartirish yordam bermaydi, chunki unda qanday qilib bir nechta loyihalar ustida ishlash mumkin?). Bunday holda, dev2 foydalanuvchisi dev1 foydalanuvchisi tomonidan yaratilgan fayllarni o'zgartira olmaydi, bu esa funksionallikning buzilishiga olib kelishi mumkin.

Linux chown - oddiy foydalanuvchi tomonidan fayl egasini o'zgartirish

Fayl egasi uning egaligini o'zgartira olmaydi. Lekin u o'ziga tegishli bo'lgan fayl guruhini o'zgartirishi mumkin, keyin esa bu faylni bir guruhdagi boshqa foydalanuvchilar o'zgartirishi mumkin. Bu bizga kerak bo'lgan narsa.

Git kancasidan foydalanish

Hook uchun ishchi katalog loyihaning asosiy katalogidir. kanca surishni bajarayotgan foydalanuvchi ostida ishlaydigan bajariladigan fayldir. Buni bilib, rejalarimizni amalga oshirishimiz mumkin.

[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

yoki shunchaki

vi hooks/post-update

Keling, mijoz mashinasiga qaytaylik.

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

Git serverida biz topshiriqdan keyin yangilanishdan keyingi kanca skriptining ishlashini tekshiramiz

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

- bo'sh, hammasi yaxshi.

Git-da ikkinchi dasturchini ulash

Keling, ikkinchi ishlab chiquvchining ishini simulyatsiya qilaylik.

Mijoz ustida

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

Va shu bilan birga, serverda ...

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

— yana bo'sh, hammasi ishlaydi.

Git loyihasini o'chirish va loyihani Git serveridan yuklab olish

Xo'sh, barcha o'zgarishlar saqlanganligiga yana bir bor ishonch hosil qilishingiz mumkin.

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

— Git loyihasini oʻchirish uchun katalogni toʻliq tozalash kifoya. Keling, paydo bo'lgan xatoga dosh beraylik, chunki ushbu buyruq yordamida joriy katalogni o'chirib bo'lmaydi, ammo bu bizga kerak bo'lgan xatti-harakatlardir.

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"

Git-da ruxsat almashish

Endi Git orqali ikkinchi dasturchi u ishlamayotgan Proj1 loyihasiga kira olmasligiga ishonch hosil qilaylik.

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.

Endi biz kirishga ruxsat beramiz

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

va bundan keyin hamma narsa ishlaydi.

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

Qo'shimcha ma'lumot olish uchun,

Bundan tashqari, agar fayllar va kataloglarni yaratishda standart ruxsatlar bilan bog'liq muammo bo'lsa, CentOS-da siz buyruqdan foydalanishingiz mumkin.

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

Shuningdek, maqolada siz kichik foydali narsalarga duch kelishingiz mumkin:

  • Linuxda katalog daraxtini qanday qurish mumkin
  • sed dagi manzillar oralig'ini ma'lum bir satrdan fayl oxirigacha qanday o'tkazish, ya'ni birinchi qatordan tashqari barcha satrlarda sed ga almashtirishni amalga oshirish
  • Linux find-da qidiruv holatini qanday o'zgartirish mumkin
  • Linux qobig'idagi bitta chiziqdan foydalanib, bir nechta qatorlarni halqaga qanday o'tkazish mumkin
  • Bashda bitta tirnoqdan qanday qutulish mumkin
  • windows buyruq satrida barcha mazmuni bilan katalogni qanday o'chirish mumkin
  • Faylni qayta yozmasdan nomini o'zgartirish uchun bash mv dan qanday foydalanish kerak

E'tiboringiz uchun rahmat.

Manba: www.habr.com

a Izoh qo'shish