٤، ٤، إعداد الخادوم

لنعدّ معا وصولَ SSH على الخادوم. سنستعمل في هذا المثال طريقة authorized_keys («المفاتيح المستوثَقة») لاستيثاق مستخدميك. سنفترض أيضا أنك تستعمل توزيعة لينكس معتادة مثل أوبنتو.

معظم المشروح هنا يمكن عمله آليًّا بأمر ssh-copy-id، بدلا من نسخ المفاتيح العمومية وتثبيتها يدويا.

أولا، أنشئ حساب مستخدم باسم git وأنشئ مجلد .ssh له.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

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

$ cat /tmp/id_rsa.badr.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

ليس عليك إلا إضافتها إلى ملف authorized_keys الخاص بالمستخدم git الموجود في مجلد .ssh الخاص به:

$ cat /tmp/id_rsa.badr.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.shams.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.wafaa.pub >> ~/.ssh/authorized_keys

أعدّ الآن مستودع مجرد لهم بأمر الابتداء git init مع الخيار --bare، لتنشئ المستودع بلا مجلد عمل:

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

عندئذٍ يستطيع بدر أو شمس أو وفاء دفع النسخة الأولى من مشروعهم إلى المستودع بإضافته مستودعًا بعيدًا في نسختهم المحلية، ودفع الفرع الذي لديهم إليه. لاحظ أن في كل مرة تريد فيها إضافة مشروع، على شخصٍ ما الوصول إلى الجهاز عبر الصدفة وإنشاء مستودع مجرد. ليكن gitserver اسم المضيف (‪“hostname”‬) للخادوم الذي أعددت عليه المستودع ومستخدم git. إذا كنت تشغّل الخادوم داخليا وأعددت DNS ليشير الاسم gitserver إلى هذا الخادوم، فيمكنك استعمال الأوامر كما هي تقريبا (بفرض أن myproject هو مشروع موجود وفيه مِلفات):

# على حاسوب بدر
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

الآن سيستطيع الآخرون استنساخه إلى أجهزتهم ودفع تعديلاتهم إليه بالسهولة نفسها:

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'Fix for README file'
$ git push origin master

بهذه الطريقة ستحصل سريعا على خادوم جت يتيح إذنَي القراءة والتحرير لبضعة مطورين.

عليك أيضا ملاحظة أن حتى الآن، أولئك المستخدمين جميعهم يمكنهم أيضا الولوج إلى الخادوم والحصول على صدفة المستخدم git. إذا أردت تقييد هذا، فعليك تغيير الصدفة إلى شيء آخر في ملف /etc/passwd.

يمكنك بسهولة تقييد حساب المستخدم git إلى الأنشطة المرتبطة بـجت باستعمال أداة صدفة مقيَّدة اسمها git-shell («صدفة جت») وهي مرفقة مع جت. فإذا ضبطتها لتكون صدفة ولوج لحساب المستخدم git فإن هذا الحساب لن يكون له وصول صدفة طبيعي إلى خادومك. لاستعمالها، حدد git-shell لتكون صدفة ولوج لهذا الحساب بدلا من bash أو csh. ولفعل هذا، عليك أولا إضافة المسار الكامل لأمر git-shell إلى مِلف /etc/shells إذا لم يكن موجودا فيه بالفعل:

$ cat /etc/shells      # انظر إن كانت صدفة جت هنا، وإلا…‏
$ which git-shell      # فتحقق أن صدفة جت مثبتة على نظامك
$ sudo -e /etc/shells  # ثم أضف مسارها من الأمر السابق إلى ملف الصدفات

يمكنك الآن تغيير صدفة المستخدم بالأمر chsh <username> -s <shell>:

$ sudo chsh git -s $(which git-shell)

عندئذٍ يستطيع المستخدم git استعمال SSH للدفع والجذب من مستودعات جت، بغير أن يكون له وصولًا صدفيًّا إلى خادومك. وإن حاول، فسيرى رسالة رفض ولوج كهذه:

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

لكن ما زال يمكن للمستخدمين توجيه منفذ SSH (أي ‪“port forwarding”‬) للوصول إلى أي خادوم آخر يقدر خادوم جت أن يتصل به. فإذا أردت منع هذا، فأضف في ملف المفاتيح المستوثَقة (authorized_keys) هذه الخيارات في أول كل مفتاح تريد تقييده:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

ستبدو نتيجة التعديل مثل هذا:

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

عندئذٍ ستظل تعمل أوامر جت الشبكية، ولكن المستخدمين لن يعودوا قادرين على الوصول إلى صدفة. وكما ترى في رسالة الرفض، يمكنك أيضا إعداد مجلد في مجلد منزل المستخدم git لتخصيص أمر git-shell قليلا. فيمكنك مثلا تقييد أوامر جت التي يقبلها الخادوم، أو تخصيص الرسالة التي يراها المستخدمين عندما يحاولون الوصول عبر SSH. نفّذ الأمر git help shell للحصول على معلومات م‍زيدة عن تخصيص الصدفة.