GIT سرور تائين گھڻن استعمال ڪندڙن جي رسائي جي تنظيم

جڏهن هڪ Git سرور کي انسٽال ۽ ترتيب ڏيڻ، سوال پيدا ٿئي ٿو ڪيترن ئي منصوبن تائين ڪيترن ئي صارفين جي رسائي کي منظم ڪرڻ بابت. مون مسئلي جي تحقيق ڪئي ۽ هڪ حل مليو جيڪو منهنجي سڀني گهرجن کي پورو ڪيو: سادو، محفوظ، قابل اعتماد.

منهنجون خواهشون آهن:

  • هر صارف پنهنجي اڪائونٽ سان ڳنڍيندو آهي
  • ڪيترائي صارف ھڪڙي منصوبي تي ڪم ڪري سگھن ٿا
  • ساڳيو صارف ڪيترن ئي منصوبن تي ڪم ڪري سگهي ٿو
  • هر صارف کي صرف انهن منصوبن تائين رسائي آهي جنهن تي هو ڪم ڪري ٿو
  • اهو ممڪن هجڻ گهرجي ته ڪمانڊ لائن ذريعي ڳنڍڻ، ۽ نه صرف ڪجهه قسم جي ويب انٽرنيٽ ذريعي

اهو پڻ وڏو هوندو:

  • ماڻهن کي ڪنٽرول ڪرڻ لاء صرف پڙهڻ جي اجازت ڏيو
  • Git ۾ صارف جي رسائي جي حقن کي آساني سان منظم ڪريو

GIT سرور تائين رسائي لاءِ ممڪن اختيارن جو جائزو

سڀ کان پهريان، توهان کي ڄاڻڻ جي ضرورت آهي ته ڇا چونڊيو وڃي، تنهنڪري هتي هڪ تڪڙو جائزو آهي Git پروٽوڪول.

  • ssh - خاص طور تي ٺاهيل صارف اڪائونٽ سرور تائين رسائي لاء استعمال ڪيو ويندو آهي.
    • اهو عجيب آهي ته Git پنهنجي سفارشن مان خارج نه ڪندو آهي هڪ اڪائونٽ جو استعمال سڀني مخزن تائين رسائي لاءِ. هي منهنجي گهرجن کي پورو نٿو ڪري.
    • توهان ڪيترن ئي اڪائونٽن کي استعمال ڪري سگهو ٿا، پر توهان ڪيئن محدود ڪري سگهو ٿا صارف جي رسائي کي صرف ڪجهه ڊائريڪٽرن تائين؟
      • گهر ڊاريڪٽري ۾ بند ڪرڻ مناسب نه آهي، ڇاڪاڻ ته ٻين استعمال ڪندڙن لاء اتي لکڻ جي رسائي کي منظم ڪرڻ ڏکيو آهي
      • توهان جي گهر ڊاريڪٽري مان symlinks استعمال ڪرڻ پڻ ڏکيو آهي ڇو ته Git انهن کي لنڪ جي طور تي تشريح نٿو ڪري
      • مترجم تائين رسائي کي محدود ڪرڻ ممڪن آهي، پر ڪا به مڪمل ضمانت نه آهي ته اهو هميشه ڪم ڪندو
        • توهان عام طور تي اهڙن استعمال ڪندڙن لاءِ پنهنجو ڪمانڊر مترجم ڳنڍي سگهو ٿا، پر
          • پهرين، هي اڳ ۾ ئي هڪ قسم جو ڏکيو فيصلو آهي،
          • ۽ ٻيو، ان کي ختم ڪري سگهجي ٿو.

    پر ٿي سگهي ٿو اهو مسئلو ناهي ته صارف ڪنهن به حڪم تي عمل ڪرڻ جي قابل هوندو؟... عام طور تي، هن طريقي کي رد نه ٿو ڪري سگهجي جيڪڏهن توهان سمجهو ٿا ته ان کي ڪيئن استعمال ڪجي. اسان هن طريقي سان بعد ۾ واپس ڪنداسين، پر هن وقت اسان مختصر طور تي ٻين متبادلن تي غور ڪنداسين، ٿي سگهي ٿو ته اتي ڪجهه آسان هوندو.

  • git مقامي پروٽوڪول sshfs سان ميلاپ ۾ استعمال ڪري سگھجي ٿو، ڪيترائي استعمال ڪندڙ استعمال ڪري سگھجن ٿا، پر بنيادي طور تي ساڳيو ئي پوئين ڪيس وانگر
  • http - صرف پڙهڻ لاءِ
  • git صرف پڙهڻ لاءِ آهي
  • https - انسٽال ڪرڻ ڏکيو، توهان کي اضافي سافٽ ويئر جي ضرورت آهي، صارف جي رسائي کي منظم ڪرڻ لاءِ ڪجهه قسم جو ڪنٽرول پينل... اهو ممڪن لڳي ٿو، پر ڪنهن نه ڪنهن طرح سڀ ڪجهه پيچيده آهي.

استعمال ڪندي ssh پروٽوڪول کي منظم ڪرڻ لاءِ گھڻن صارفن جي رسائي کي Git سرور تائين

اچو ته واپس وڃو ssh پروٽوڪول.

جتان توھان استعمال ڪيو ٿا ssh رسائي گٽ لاءِ، توھان کي يقيني بڻائڻ جي ضرورت آھي سرور ڊيٽا جي حفاظت. صارف جيڪو ssh ذريعي ڳنڍي ٿو لينڪس سرور تي پنهنجو لاگ ان استعمال ڪري ٿو، تنهن ڪري اهي ssh ڪلائنٽ ذريعي ڳنڍي سگهن ٿا ۽ سرور جي ڪمان لائن تائين رسائي ڪري سگهن ٿا.
اهڙي رسائي جي خلاف مڪمل تحفظ نه آهي.

پر صارف کي لينڪس فائلن ۾ دلچسپي نه رکڻ گهرجي. اهم معلومات صرف git مخزن ۾ محفوظ ٿيل آهي. تنهن ڪري، اهو ممڪن آهي ته ڪمانڊ لائن ذريعي رسائي کي محدود نه ڪيو وڃي، پر لينڪس اوزار استعمال ڪندي صارف کي پروجيڪٽ ڏسڻ کان منع ڪرڻ لاء، انهن کان سواء جن ۾ هو حصو وٺندو آهي.
واضح انتخاب لينڪس اجازتن واري نظام کي استعمال ڪرڻ آهي.

جيئن اڳ ۾ ئي ذڪر ڪيو ويو آهي، اهو صرف هڪ اڪائونٽ استعمال ڪرڻ ممڪن آهي ssh رسائي لاءِ. هي تشڪيل ڪيترن ئي استعمال ڪندڙن لاءِ غير محفوظ آهي، جيتوڻيڪ اها تجويز ڪيل گٽ اختيارن جي فهرست ۾ شامل آهي.

آرٽيڪل جي شروعات ۾ ڏنل ضرورتن کي لاڳو ڪرڻ لاء، هيٺ ڏنل ڊاريڪٽري جي جوڙجڪ ٺاهي وئي آهي حقن ۽ مالڪن جي تفويض سان:

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 ۾ ساڳئي منصوبي تي ڪيترن ئي ڊولپرز سان تعاون ڪريو

ھڪڙو سوال رھي ٿو، جيڪڏھن ھڪڙو ڊولپر ھڪڙو نئون فائل متعارف ڪرايو، پوء ٻيا ڊولپر ان کي تبديل نه ڪري سگھندا آھن، ڇاڪاڻ⁠تہ اھو پاڻ ان جو مالڪ آھي (مثال طور، dev1)، ۽ منصوبي جو صارف مالڪ نه آھي (مثال طور، proj1). جيئن ته اسان وٽ سرور-سائيڊ مخزن آهي، سڀ کان پهريان، اسان کي ڄاڻڻ جي ضرورت آهي ته ".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 پاران ٺاهيل فائلن کي تبديل ڪرڻ جي قابل نه هوندا، جيڪو ڪارڪردگي ۾ خراب ٿيڻ جي ڪري سگھي ٿو.

لينڪس chown - هڪ باقاعده استعمال ڪندڙ طرفان فائل جي مالڪ کي تبديل ڪرڻ

فائل جو مالڪ ان جي ملڪيت کي تبديل نٿو ڪري سگھي. پر هو ڪنهن فائل جي گروپ کي تبديل ڪري سگهي ٿو جيڪو هن سان تعلق رکي ٿو، ۽ پوء هن فائل کي ٻين صارفين طرفان تبديل ڪري سگهجي ٿو جيڪي ساڳئي گروپ ۾ آهن. اھو اھو آھي جيڪو اسان کي گھرجي.

Git hook استعمال ڪندي

ٿلهو لاء ڪم ڪندڙ ڊاريڪٽري منصوبي جي روٽ ڊاريڪٽري آهي. ٿلهو هڪ قابل عمل آهي جيڪو صارف جي هيٺان هلندو آهي push ڪندي. اهو ڄاڻڻ سان، اسان پنهنجي منصوبن تي عمل ڪري سگهون ٿا.

[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

- ٻيهر خالي، هر شي ڪم ڪري ٿو.

گيٽ پروجيڪٽ کي ختم ڪرڻ ۽ گٽ سرور مان پروجيڪٽ ڊائون لوڊ ڪرڻ

خير، توهان هڪ ڀيرو ٻيهر پڪ ڪري سگهو ٿا ته سڀئي تبديليون محفوظ ڪيون ويون آهن.

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

- گٽ پروجيڪٽ کي ختم ڪرڻ لاء، صرف ڊاريڪٽري کي مڪمل طور تي صاف ڪريو. اچو ته پيدا ٿيل غلطي سان گڏ رکون، ڇو ته موجوده ڊاريڪٽري کي هن حڪم کي استعمال ڪندي ختم ڪرڻ ناممڪن آهي، پر اهو بلڪل صحيح آهي جيڪو اسان جي ضرورت آهي.

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 ۾ رسائي حصيداري ڪريو

هاڻي اچو ته پڪ ڪريون ته گٽ ذريعي به ٻيو ڊولپر پروجي1 پروجيڪٽ تائين رسائي نٿو ڪري سگهي، جنهن تي هو ڪم نه ڪري رهيو آهي.

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 mv هڪ فائل جو نالو تبديل ڪرڻ لاءِ ان کي ٻيهر لکڻ کان سواءِ

توهان جي ڌيان لاء توهان جي مهرباني.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو