تنظيم وصول متعدد المستخدمين إلى خادم GIT

عند تثبيت وتكوين خادم Git ، فإن السؤال الذي يطرح نفسه هو تنظيم الوصول لعدة مستخدمين إلى عدة مشاريع. لقد أجريت بعض الأبحاث حول هذه المشكلة ووجدت حلاً يلبي جميع متطلباتي: بسيط وآمن وموثوق.

أمنياتي هي:

  • كل مستخدم يتصل بحسابه الخاص
  • يمكن لعدة مستخدمين العمل في نفس المشروع
  • يمكن للمستخدم نفسه العمل في مشاريع متعددة
  • كل مستخدم لديه حق الوصول فقط إلى تلك المشاريع التي يعمل عليها
  • يجب أن يكون من الممكن الاتصال من خلال سطر الأوامر ، وليس فقط من خلال نوع من واجهة الويب

سيكون رائعًا أيضًا:

  • منح حقوق للقراءة فقط للأشخاص المتحكمين
  • إدارة أذونات المستخدم بسهولة في Git

نظرة عامة على الخيارات الممكنة للوصول إلى خادم GIT

بادئ ذي بدء ، تحتاج إلى معرفة ما يمكنك الاختيار من بينها ، لذلك نظرة عامة موجزة على بروتوكولات Git.

  • ssh - يتم استخدام حساب مستخدم تم إنشاؤه خصيصًا للوصول إلى الخادم.
    • من الغريب أن Git لا توصي بعدم استخدام حساب واحد للوصول إلى جميع المستودعات. هذا لا يلبي متطلباتي على الإطلاق.
    • يمكنك استخدام حسابات متعددة ، ولكن كيف يمكنك تقييد وصول المستخدم إلى أدلة معينة فقط؟
      • لا يعد الإغلاق في الدليل الرئيسي مناسبًا ، لأنه من الصعب تنظيم الوصول للكتابة للمستخدمين الآخرين هناك
      • يعد استخدام الروابط الرمزية من الدليل الرئيسي أمرًا صعبًا أيضًا لأن Git لا يفسرها على أنها روابط.
      • قم بتقييد الوصول إلى المترجم الفوري ، حسنًا ، يمكنك ذلك ، لكن لا يوجد ضمان كامل بأن هذا سيعمل دائمًا
        • يمكنك بشكل عام توصيل مترجم الأوامر الخاص بك لمثل هؤلاء المستخدمين ، ولكن ،
          • أولاً ، هذا بالفعل نوع من القرار الصعب ،
          • و 2 ، يمكن تجاوزه.

    ولكن ربما لا تكون مشكلة أن المستخدم سيكون قادرًا على تنفيذ أي أوامر؟ .. بشكل عام ، لا يمكن استبعاد هذه الطريقة إذا اكتشفت كيفية استخدامها. سنعود إلى هذه الطريقة لاحقًا ، لكن في الوقت الحالي سننظر بإيجاز في البدائل المتبقية ، ربما سيكون هناك شيء أبسط.

  • يمكن استخدام بروتوكول git المحلي بالاشتراك مع sshfs ، ويمكن استخدام عدة مستخدمين ، ولكنه في الأساس نفس الحالة السابقة
  • http - للقراءة فقط
  • بوابة للقراءة فقط
  • من الصعب تثبيت https ، وتحتاج إلى برنامج إضافي ، ونوع من لوحة التحكم لتنظيم وصول المستخدم ... يبدو ذلك ممكنًا ، ولكن بطريقة ما كل شيء معقد.

استخدام بروتوكول ssh لتنظيم وصول المستخدمين المتعددين إلى خادم Git

دعنا نعود إلى بروتوكول ssh.

نظرًا لاستخدام وصول ssh لـ git ، يجب أن تكون بيانات الخادم آمنة. يستخدم المستخدم الذي يتصل عبر ssh معلومات تسجيل الدخول الخاصة به على خادم Linux ، حتى يتمكن من الاتصال عبر عميل ssh والوصول إلى سطر أوامر الخادم.
لا توجد حماية كاملة ضد الحصول على مثل هذا الوصول.

لكن يجب ألا يهتم المستخدم بملفات Linux. يتم تخزين المعلومات المفيدة في مستودع git فقط. لذلك ، لا يمكنك تقييد الوصول من خلال سطر الأوامر ، ولكن عن طريق Linux ، تمنع المستخدم من مشاهدة المشاريع ، باستثناء تلك التي يشارك فيها.
من الواضح استخدام نظام أذونات Linux.

كما ذكرنا سابقًا ، من الممكن استخدام حساب واحد فقط للوصول إلى ssh. هذا التكوين غير آمن للعديد من المستخدمين ، على الرغم من تضمينه في قائمة الخيارات الموصى بها في git.

لتنفيذ المتطلبات الواردة في بداية المقال ، يتم إنشاء بنية الدليل التالية مع التنازل عن الحقوق والمالكين:

1) أدلة المشروع

dir1 (proj1: proj1,0770،XNUMX)
dir2 (proj2: proj2,0770،XNUMX)
dir3 (proj3: proj3,0770،XNUMX)
...
حيث
dir1، dir2، dir3 - أدلة المشروع: مشروع 1، مشروع 2، مشروع 3.

proj1: proj1، proj2: proj2، proj3: proj3 هم مستخدمو Linux تم إنشاؤهم خصيصًا والذين تم تعيينهم كمالكين لأدلة المشروع المعنية.

تم تعيين حقوق جميع الدلائل على 0770 - الوصول الكامل للمالك ومجموعته ، والحظر الكامل لأي شخص آخر.

2) حسابات المطورين

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

النقطة الأساسية هي أن المطورين يتم تعيينهم لمجموعة إضافية من مستخدم النظام الذي يمتلك المشروع المقابل. يتم ذلك بواسطة مسؤول خادم Linux بأمر واحد.

في هذا المثال ، يعمل Developer 1 على مشاريع proj1 و proj2 ، ويعمل Developer 2 على مشاريع proj2 و proj3.

إذا اتصل أي من المطورين عبر ssh عبر سطر الأوامر ، فلن تكون حقوقه كافية حتى لعرض محتويات أدلة المشاريع التي لا يشارك فيها. لا يستطيع تغييرها بنفسه.

نظرًا لأن أساس هذا المبدأ هو الأمان الأساسي لحقوق Linux ، فإن هذا النظام موثوق به. بالإضافة إلى ذلك ، من السهل جدًا إدارة المخطط.

دعونا ننتقل إلى الممارسة.

إنشاء مستودعات Git على خادم Linux

نحن نفحص.

[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 محليًا وادفع إلى خادم 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

الآن دعنا نتأكد من أن المطور الثاني لا يمكنه الوصول إلى مشروع Proj1 من خلال Git ، والذي لا يعمل فيه.

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 في جميع الأسطر باستثناء السطر الأول
  • كيفية عكس شرط البحث في لينكس تجد
  • كيفية تمرير خطوط متعددة من خلال سطر واحد في غلاف لينكس
  • كيفية الهروب من الاقتباسات المنفردة في باش
  • كيفية حذف دليل بجميع محتوياته في سطر أوامر windows
  • كيفية إعادة تسمية ملف باستخدام bash mv دون إعادة كتابته

شكرا لكم على اهتمامكم.

المصدر: www.habr.com

إضافة تعليق