GIT серверт олон хэрэглэгчийн хандалтын зохион байгуулалт

Git серверийг суулгах, тохируулах үед хэд хэдэн хэрэглэгчдэд хэд хэдэн төсөлд хандах хандалтыг зохион байгуулах тухай асуулт гарч ирдэг. Би асуудлыг судалж үзээд миний бүх шаардлагыг хангасан шийдлийг олсон: энгийн, аюулгүй, найдвартай.

Миний хүсэл бол:

  • хэрэглэгч бүр өөрийн бүртгэлээр холбогддог
  • Нэг төсөл дээр хэд хэдэн хэрэглэгч ажиллах боломжтой
  • Нэг хэрэглэгч олон төсөл дээр ажиллах боломжтой
  • хэрэглэгч бүр зөвхөн өөрийн ажиллаж буй төслүүдэд хандах эрхтэй
  • Энэ нь зөвхөн зарим төрлийн вэб интерфэйсээр бус командын мөрөөр холбогдох боломжтой байх ёстой

Энэ нь бас гайхалтай байх болно:

  • удирдаж буй хүмүүст зөвхөн унших зөвшөөрөл олгох
  • Git дэх хэрэглэгчийн хандалтын эрхийг хялбархан удирдаарай

GIT серверт нэвтрэх боломжит хувилбаруудын тойм

Юуны өмнө та юу сонгохоо мэдэх хэрэгтэй, тиймээс Git протоколуудын талаар товч тоймыг энд оруулав.

  • ssh - тусгайлан үүсгэсэн хэрэглэгчийн бүртгэлийг серверт хандахад ашигладаг.
    • Git нь бүх репозиторуудад хандахын тулд нэг данс ашиглахыг зөвлөмжөөсөө хасдаггүй нь хачирхалтай юм. Энэ нь миний шаардлагад огт нийцэхгүй байна.
    • Та олон акаунт ашиглаж болох ч хэрэглэгчийн хандалтыг зөвхөн тодорхой лавлахуудад хэрхэн хязгаарлах вэ?
      • Гэрийн лавлахыг хаах нь тохиромжгүй, учир нь бусад хэрэглэгчид тэнд бичих хандалтыг зохион байгуулахад хэцүү байдаг
      • Git нь тэдгээрийг холбоос гэж тайлбарладаггүй тул гэрийн лавлахаас тэмдэгт холбоосыг ашиглах нь бас хэцүү байдаг
      • Та орчуулагч руу нэвтрэх эрхийг хязгаарлаж болно, гэхдээ энэ нь үргэлж ажиллах болно гэсэн бүрэн баталгаа байхгүй
        • Та ерөнхийдөө ийм хэрэглэгчдэд зориулж өөрийн командын орчуулагчийг холбож болно, гэхдээ
          • нэгдүгээрт, энэ бол аль хэдийн хэцүү шийдвэр юм.
          • хоёрдугаарт, үүнийг тойрч болно.

    Гэхдээ хэрэглэгч ямар нэгэн командыг гүйцэтгэх нь асуудал биш юм болов уу?.. Ер нь, яг яаж ашиглахаа бодож үзвэл энэ аргыг үгүйсгэх аргагүй. Бид дараа нь энэ арга руу буцах болно, гэхдээ одоо бид бусад хувилбаруудыг товч авч үзэх болно, магадгүй илүү хялбар зүйл байх болно.

  • git локал протоколыг sshfs-тэй хослуулан ашиглаж болно, олон хэрэглэгч ашиглаж болно, гэхдээ үндсэндээ өмнөх тохиолдолтой ижил
  • http - зөвхөн унших боломжтой
  • git нь зөвхөн унших боломжтой
  • https - суулгахад хэцүү, танд нэмэлт програм хангамж, хэрэглэгчийн хандалтыг зохион байгуулахын тулд зарим төрлийн хяналтын самбар хэрэгтэй ... энэ нь боломжтой мэт боловч ямар нэгэн байдлаар бүх зүйл төвөгтэй байдаг.

Git серверт олон хэрэглэгчийн хандалтыг зохион байгуулахын тулд ssh протоколыг ашиглах

ssh протокол руу буцаж орцгооё.

Та git-д ssh хандалтыг ашигладаг тул серверийн өгөгдлийн аюулгүй байдлыг хангах хэрэгтэй. Ssh-ээр холбогдсон хэрэглэгч Линукс сервер дээр өөрийн нэвтрэх эрхийг ашигладаг тул ssh клиентээр холбогдож серверийн командын мөрөнд хандах боломжтой.
Ийм хандалтаас бүрэн хамгаалалт байхгүй.

Гэхдээ хэрэглэгч Линукс файлуудыг сонирхох ёсгүй. Чухал мэдээлэл нь зөвхөн git репозиторид хадгалагддаг. Тиймээс, командын мөрөөр хандалтыг хязгаарлахгүй, харин Линукс хэрэгслийг ашиглан хэрэглэгч өөрийн оролцож буй төслүүдээс бусад төслүүдийг үзэхийг хориглох боломжтой.
Мэдээжийн сонголт бол Линуксийн зөвшөөрлийн системийг ашиглах явдал юм.

Өмнө дурьдсанчлан, ssh хандалтанд зөвхөн нэг бүртгэл ашиглах боломжтой. Энэ тохиргоо нь хэд хэдэн хэрэглэгчдэд аюултай боловч санал болгож буй git сонголтуудын жагсаалтад багтсан болно.

Өгүүллийн эхэнд өгөгдсөн шаардлагыг хэрэгжүүлэхийн тулд эрх, эзэмшигчийн хуваарилалтаар дараах лавлах бүтцийг бий болгосон.

1) төслийн лавлахууд

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
хаана
dir1, dir2, dir3 - төслийн лавлахууд: төсөл 1, төсөл 2, төсөл 3.

proj1:proj1, proj2:proj2, proj3:proj3 нь тусгайлан бүтээгдсэн Линукс хэрэглэгчид бөгөөд холбогдох төслийн лавлахуудын эзэмшигчээр томилогдсон.

бүх лавлах зөвшөөрлийг 0770 гэж тохируулсан - эзэмшигч болон түүний бүлэгт бүрэн хандах, бусад бүх хүмүүст бүрэн хориг.

2) хөгжүүлэгчийн данс

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

Хамгийн гол зүйл бол хөгжүүлэгчид холбогдох төслийн системийн хэрэглэгчийн эзэмшигчийн нэмэлт бүлгийг томилсон явдал юм. Үүнийг Линукс серверийн администратор нэг тушаалаар гүйцэтгэдэг.

Энэ жишээнд "Хөгжүүлэгч 1" нь proj1 ба proj2 төслүүд дээр, "Хөгжүүлэгч 2" нь proj2 болон proj3 төслүүд дээр ажиллаж байна.

Хэрэв хөгжүүлэгчдийн аль нэг нь тушаалын мөрөөр дамжуулан ssh-ээр холбогдвол тэдний эрх оролцоогүй төслийн лавлах агуулгыг үзэхэд хангалтгүй болно. Тэр өөрөө үүнийг өөрчилж чадахгүй.

Энэхүү зарчмын үндэс нь Линуксийн эрхийн үндсэн хамгаалалт учраас энэ схем найдвартай. Үүнээс гадна, схемийг удирдахад маш хялбар байдаг.

Дасгал руугаа явцгаая.

Линукс сервер дээр Git репозитор үүсгэх

Бид шалгадаг.

[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

Гараар бичихээс залхаж байна...

[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

Командын мөрөөс бусад хүмүүсийн агуулах руу нэвтрэх, тэр ч байтугай агуулгыг нь үзэх боломжгүй гэдэгт бид итгэлтэй байна.

[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 дээр нэг төсөл дээр олон хөгжүүлэгчидтэй хамтран ажиллана

Нэг асуулт хэвээр байна, хэрэв нэг хөгжүүлэгч шинэ файл танилцуулбал бусад хөгжүүлэгчид үүнийг өөрчлөх боломжгүй, учир нь тэр өөрөө төслийн эзэмшигч биш (жишээлбэл, proj1) биш харин түүний эзэмшигч (жишээлбэл, dev1) юм. Бид сервер талын репозитортой учир юуны өмнө “.git” директор хэрхэн бүтэцлэгдсэн, шинээр файл үүсгэсэн эсэхийг мэдэх хэрэгтэй.

Локал Git репозитор үүсгэж, Git сервер рүү түлхэж байна

Үйлчлүүлэгчийн машин руу шилжье.

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>

Үүний зэрэгцээ сервер дээр шинэ файлууд үүсдэг бөгөөд тэдгээр нь түлхэлт хийсэн хэрэглэгчдэд харьяалагддаг

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

Git серверт өөрчлөлт оруулахад нэмэлт файлууд болон лавлахууд үүсдэг бөгөөд тэдгээрийн эзэмшигч нь үнэндээ байршуулалтыг хийдэг хэрэглэгч юм. Гэхдээ дараа нь эдгээр файлууд болон лавлахуудын бүлэг нь энэ хэрэглэгчийн үндсэн бүлэгт, өөрөөр хэлбэл dev1 хэрэглэгчийн dev1 бүлэг, dev2 хэрэглэгчийн dev2 бүлэгтэй тохирч байна (хөгжүүлэгч хэрэглэгчийн үндсэн бүлгийг өөрчлөх нь тус болохгүй. Учир нь та яаж олон төсөл дээр ажиллах вэ?). Энэ тохиолдолд dev2 хэрэглэгч dev1 хэрэглэгчийн үүсгэсэн файлуудыг өөрчлөх боломжгүй бөгөөд энэ нь функциональ эвдрэлд хүргэж болзошгүй юм.

Linux chown - энгийн хэрэглэгчийн файлын эзэмшигчийг өөрчлөх

Файлын эзэмшигч нь эзэмшигчийг өөрчлөх боломжгүй. Гэхдээ тэр өөрт нь хамаарах файлын бүлгийг өөрчлөх боломжтой бөгөөд дараа нь энэ файлыг нэг бүлэгт байгаа бусад хэрэглэгчид өөрчилж болно. Энэ бол бидэнд хэрэгтэй зүйл юм.

Git hook ашиглаж байна

Hook-ийн ажлын лавлах нь төслийн үндсэн лавлах юм. дэгээ нь түлхэлт хийж байгаа хэрэглэгчийн доор ажилладаг гүйцэтгэх файл юм. Үүнийг мэдсэнээр бид төлөвлөгөөгөө хэрэгжүүлж чадна.

[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

эсвэл зүгээр л

vi hooks/post-update

Үйлчлүүлэгчийн машин руу буцаж орцгооё.

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 сервер дээр бид үүрэг гүйцэтгэсний дараа дэгээний шинэчлэлтийн скриптийн ажиллагааг шалгадаг

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

- хоосон, бүх зүйл сайхан байна.

Git-д хоёр дахь хөгжүүлэгчийг холбож байна

Хоёр дахь хөгжүүлэгчийн ажлыг дуурайцгаая.

Үйлчлүүлэгч дээр

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

Үүний зэрэгцээ сервер дээр ...

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

- дахин хоосон, бүх зүйл ажиллаж байна.

Git төслийг устгаж, Git серверээс төслийг татаж авах

За, та бүх өөрчлөлтүүд хадгалагдсан эсэхийг дахин шалгаж болно.

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

— Git төслийг устгахын тулд лавлахыг бүрэн устгана уу. Энэ командыг ашиглан одоогийн лавлахыг устгах боломжгүй тул үүссэн алдааг тэвчье, гэхдээ энэ нь бидэнд яг хэрэгтэй зан чанар юм.

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 дээр хандалтыг хуваалцах

Одоо Git-ээр дамжуулан хоёр дахь хөгжүүлэгч өөрийн ажиллахгүй байгаа Proj1 төсөл рүү нэвтрэх боломжгүй байгаа эсэхийг шалгацгаая.

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.

Одоо бид нэвтрэхийг зөвшөөрнө

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

тэгээд дараа нь бүх зүйл ажиллана.

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

Дэлгэрэнгүй мэдээллийг

Нэмж хэлэхэд, хэрэв файл, лавлах үүсгэх үед анхдагч зөвшөөрөлтэй холбоотой асуудал гарвал CentOS дээр та тушаалыг ашиглаж болно.

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

Мөн нийтлэлд та жижиг ашигтай зүйлд бүдэрч магадгүй:

  • Линукс дээр лавлах модыг хэрхэн бүтээх
  • sed дэх хэд хэдэн хаягийг тодорхой мөрөөс файлын төгсгөл хүртэл хэрхэн дамжуулах, өөрөөр хэлбэл эхний мөрөөс бусад бүх мөрөнд sed-д орлуулалт хийх.
  • Линукс хайлт дээр хайлтын нөхцөлийг хэрхэн өөрчлөх вэ
  • Линукс бүрхүүлд нэг давхаргыг ашиглан олон мөрийг гогцоонд хэрхэн дамжуулах вэ
  • Bash дахь ганц ишлэлээс хэрхэн зайлсхийх вэ
  • windows командын мөрөн дэх бүх агуулгыг агуулсан санг хэрхэн устгах
  • Файлын нэрийг дахин бичихгүйгээр bash mv-г хэрхэн ашиглах вэ

Анхаарал тавьсан та бүхэнд баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх