عند تثبيت خادم Git وتكوينه ، يثور سؤال حول تنظيم الوصول لعدة مستخدمين إلى عدة مشاريع. لقد أجريت دراسة حول المشكلة ووجدت حلاً يلبي جميع متطلباتي: بسيطة وآمنة وموثوقة.
تمنياتي هي كما يلي:
- كل مستخدم يتصل بحسابه الخاص
- يمكن لعدة مستخدمين العمل على مشروع واحد
- يمكن للمستخدم نفسه العمل على العديد من المشاريع
- كل مستخدم لديه حق الوصول فقط إلى تلك المشاريع التي يعمل فيها
- يجب أن تكون قادرة على الاتصال عبر سطر الأوامر ، وليس فقط من خلال نوع من واجهة الويب
سيكون أيضًا رائعًا:
- منح حقوق للقراءة فقط للأشخاص المسيئين
- إدارة أذونات المستخدم بسهولة في بوابة
نظرة عامة على خيارات الوصول إلى خادم GIT
بادئ ذي بدء ، تحتاج إلى معرفة ما يمكنك الاختيار منه ، لذلك نظرة عامة مختصرة على بروتوكولات Git.
- ssh - يستخدم حساب مستخدم تم إنشاؤه خصيصا للوصول إلى الخادم.
- من الغريب ألا يستثني Git من التوصيات استخدام حساب واحد للوصول إلى جميع المستودعات. هذا لا يفي بمتطلباتي.
- يمكنك استخدام حسابات متعددة ، ولكن كيفية تقييد وصول المستخدم فقط إلى بعض الدلائل؟
- الإغلاق إلى الدليل الرئيسي غير مناسب ، لأنه من الصعب تنظيم الوصول إلى الكتابة للمستخدمين الآخرين
- من الصعب أيضًا استخدام الروابط الرمزية من الدليل الرئيسي لأن Git لا يفسرها على أنها روابط
- من الممكن تقييد الوصول إلى المترجم الفوري ، لكن لا يوجد ضمان كامل بأن هذا سوف يعمل دائمًا
- يمكنك حتى توصيل مترجم الأوامر الخاص بك لهؤلاء المستخدمين ، ولكن ،
- أولا ، هذا هو بالفعل نوع من القرار الصعب ،
- وفي 2 ، يمكن التحايل على هذا.
ولكن ربما لا تكون هذه مشكلة في أن المستخدم سيكون قادرًا على تنفيذ أي أوامر؟ .. بشكل عام ، لا يمكن استبعاد هذه الطريقة إذا توصلت إلى كيفية استخدامها. سنعود إلى هذه الطريقة لاحقًا ، ولكن الآن لننظر إلى البدائل الأخرى لفترة وجيزة ، ربما سيكون هناك شيء ما أسهل.
- يمكن استخدام البروتوكول المحلي git بالاقتران مع sshfs ، ويمكن استخدام العديد من المستخدمين ، ولكن في جوهره ، هذا هو نفس الحالة السابقة
- المتشعب - قراءة فقط
- بوابة للقراءة فقط
- https - من الصعب تثبيته ، فأنت بحاجة إلى برنامج إضافي ، نوع من لوحة التحكم لتنظيم وصول المستخدم ... يبدو الأمر ممكنًا ، لكنه معقد بطريقة ما.
باستخدام بروتوكول ssh لتنظيم وصول متعدد المستخدمين إلى خادم Git
العودة إلى بروتوكول ssh.
نظرًا لاستخدام الوصول إلى ssh في git ، فأنت بحاجة إلى تأمين بيانات الخادم. يستخدم المستخدم الذي يتصل عبر ssh تسجيل الدخول الخاص به على خادم Linux ، حتى يتمكن من الاتصال من خلال عميل ssh والوصول إلى سطر أوامر الخادم.
لا توجد حماية كاملة ضد الحصول على هذا الوصول.
ولكن يجب ألا يكون المستخدم مهتمًا بملفات Linux. يتم تخزين المعلومات الهامة فقط في مستودع بوابة. لذلك ، لا يمكنك تقييد الوصول من خلال سطر الأوامر ، ولكن يمكن لـ Linux منع المستخدم من مشاهدة المشاريع ، باستثناء المشروعات التي يشارك فيها.
من الواضح استخدام نظام أذونات Linux.
كما ذكرنا سابقًا ، من الممكن استخدام حساب واحد فقط للوصول إلى ssh. هذا التكوين غير آمن لعدة مستخدمين ، على الرغم من أن هذه الطريقة مضمنة في قائمة خيارات git الموصى بها.
لتنفيذ المتطلبات الواردة في بداية المقالة ، يتم إنشاء بنية الدليل التالية مع تعيين الحقوق والمالكين:
1) الدلائل المشروع
1 درهم (proj1: proj1،0770)
2 درهم (المشروع 2: 27070)
3 دولارات (مشروع: 3،07070)
...
حيث
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 ~]
تعبت من الكتابة بيدي ...
[root@server gitservertest]
نتأكد من أنه من المستحيل الوصول إلى مستودعات الآخرين من سطر الأوامر وحتى رؤية محتوياتها.
[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
التعاون في بوابة العديد من المطورين في مشروع واحد
يبقى سؤال واحد ، إذا قدم أحد المطورين ملفًا جديدًا ، فلن يتمكن باقي المطورين من تغييره ، لأنه يمتلكه بنفسه (على سبيل المثال ، 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://dev1@10.1.1.11/var/gitservertest/proj2" C:\gittest>git push origin master dev1:dev1@10.1.1.11'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 - تغيير مالك الملف من قبل مستخدم عادي
لا يمكن لمالك الملف تغيير ملكيته. لكن يمكنه تغيير مجموعة الملف الذي ينتمي إليه ، ثم قد يكون هذا الملف متاحًا للتغيير للمستخدمين الآخرين الموجودين في نفس المجموعة. هذا هو ما نحتاجه.
باستخدام بوابة ربط
دليل العمل للربط هو الدليل الجذر للمشروع. الخطاف هو قابل للتنفيذ الذي يعمل تحت المستخدم الذي يدفع. مع العلم هذا ، يمكننا تحقيق خطتنا.
[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:dev1@10.1.1.11'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://dev2@10.1.1.11/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 dev2@10.1.1.11'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://dev2@10.1.1.11/var/gitservertest/proj2 Cloning into 'proj2'... dev2@10.1.1.11's password: C:\gittest>cd proj2 C:\gittest\proj2>dir C:\gittest\proj2 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:\gittest\proj2>type test1.txt "test dev1 to proj2" "dev1 added some omre" "dev1 3rd line" "!!! dev2 added this" C:\gittest\proj2>type test2.txt "!!! dev2 wrote"
تقاسم الوصول في بوابة
الآن ، دعونا نتأكد من أنه حتى من خلال Git ، لا يمكن للمطور الثاني الوصول إلى مشروع Proj1 ، الذي لا يعمل عليه.
C:\gittest\proj2>git remote remove origin C:\gittest\proj2>git remote add origin "ssh://dev2@10.1.1.11/var/gitservertest/proj1" C:\gittest\proj2>git push origin master dev2@10.1.1.11'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 ~]
وبعد ذلك كل شيء يعمل.
C:\gittest\proj2>git push origin master dev2@10.1.1.11's password: To ssh://10.1.1.11/var/gitservertest/proj1 * [new branch] master -> master
معلومات اضافية
بالإضافة إلى ذلك ، إذا كانت هناك مشكلة في الأذونات الافتراضية عند إنشاء الملفات والدلائل ، في CentOS يمكنك استخدام الأمر
setfacl -Rd -mo::5 -mg::7 /var/gitservertest
أيضًا في المقالة ، يمكنك أن تتعثر في الأشياء الصغيرة المفيدة:
- كيفية بناء شجرة دليل على لينكس
- كيفية استخدام sed لنقل مجموعة من العناوين من سطر معين إلى نهاية الملف ، أي إجراء استبدال في sed في جميع الأسطر باستثناء السطر الأول
- كيف تجد على لينكس لعكس مصطلح البحث
- كيف في قذيفة لينكس لعقد عدة خطوط من خلال سطر واحد
- كيفية الهروب من يقتبس واحد في باش
- كيفية حذف الدليل مع جميع المحتويات في سطر الأوامر ويندوز
- كيفية استخدام bash mv لإعادة تسمية الملف دون إعادة كتابته مرة أخرى
شكرا لاهتمامكم