SSH ماهي؟ وكيفية إستعمالها؟ وطرق عمل Harden لها

السلام عليكم ورحمة الله وبركاته

أعلم يوجد ربما مواضيع كثيرة تحدثت عن الـ SSH لكن إن شاء الله بعد قراءة الموضوع هذا أنا متأكد ستجدون أمور أخرى تضاف لمعلوماتكم حول هذه الخدمة الرائعة بكل معنى الكلمة … بالبداية لمن لا يعرف ما هو الـ SSH فهو إختصار لكلمة Secure SHell … تم عمل هذه الخدمة من أجل إستبدال الخدمة السابقة telnet والتي يتم إرسال البيانات بين المستخدم والسيرفر بشكل مكشوف أي Clear Text … يعني الكلمة السرية والبيانات المارة بينك وبين الجهة المتصل بها كلها عبارة عن كتابة مكشوفة يمكن لأي شخص أن يعمل مراقبة على هذه البيانات من خلال برامج الـ SNIFFING وبرامج مراقبة البيانات مثل Wireshark … خدمة SSH أستبدلت هذه الطريقة بطريقة أكثر قوة من خلال تشفير جميع البيانات المارة بينك وبين السيرفر وبطرق تشفير قوية للغاية منها: AES (Advanced Encryption Scheme), Triple DES, Blowfish وغيرها من الطرق القوية …


أنظر الصورة رقم 1 (الاتصال بالطريقة السابقة، طريقة telnet)


أنظر الصورة رقم 2 (الاتصال بالطريقة الجديدة المشفرة، طريقة ssh)

خدمة SSH تدعم طرق توثيق Authentication مختلفة:
اولاً: Host-Key Authentication
وهذه هي الطريقة السائدة عند الجميع وتعمل من خلال إستخدامك أسم مستخدم وكلمته السرية على السيرفر للإتصال بذلك السيرفر. أي ستقوم بالإتصال من خلال إستعمال أسم مستخدم مثلاً binary وتستعمل الكلمة السرية للمستخدم هذا للدخول الى السيرفر. ويقوم المفتاح الخاص بجهازك Host-Key بتشفير الخط بينك وبين السيرفر. طبعاً أعلم بإن الكثيرين من أصحاب السيرفرات خاصة يستعملون هذه الطريقة رغم إنها طريقة عادية ويوجد الأقوى منها (سنرى من خلال الشرح) وأيضاً المستخدمين يستعملونها ربما لعدم معرفتهم بغيرها.


ثانياً: Public-Key Authentication
بدل من إستخدامك لمستخدم وكلمته السرية على السيرفر للإتصال به، نقوم بإستعمال مفتاح خاص بك للإتصال بالسيرفر من خلال هذا المفتاح. ويكون للمفتاح كلمة مرور Passphrase. ستقوم بعمل مفتاحين واحد عام Public والآخر خاص Private كل ما عليك هو وضع المفتاح العام على السيرفر المراد الإتصال به مع الإحتفاظ بالمفتاح الخاص وعدم جعل احد يصل له. هذه الطريقة هي أفضل طريقة بصراحة ولكن تحتاج الى القليل من العمل من طرفك ليتم عملها بالشكل الصحيح، على العموم لا تقلق موضوعي يستهدف هذه الطريقة بالتحديد فتابع القراءة فقط.

ثالثاً: Passphrase-Less Authentication
هذه الطريقة هي نفس الطريقة السابقة ولكن فقط لا نقوم بوضع Passphrase على المفتاح الذي نقوم بعمله والسبب في ذلك هو لكي يتم إستخدام في العمليات الأوتوماتيكية Automated أو في السكربتات أو في وظائف الـ cron. لكن عيب هذه الطريقة هي في حالة حصل احدهم على المفتاح الخاص بك، يصبح بإمكانه عمل كل ما يريد في السيرفر.

الآن ربما تتسائل كيف أقوم بتركيب SSH ؟ أقول لا تقلق حسب ما قرأة بإنه من بعد عام 2002 أصبحت الخدمة تاتي جاهزة مع جميع التوزيعات تقريباً خاصة المعروفة منها CentOS، Fedora، Debian، Ubuntu، Slackware الى آخره.

طيب لنقوم بتشغيل الخدمة في البداية:
على توزيعات مثل CentOS و Fedora وأعجوبة طبعاً :) نفذ:

/etc/init.d/sshd start

الخيارات المتاحة لك هي:

/etc/init.d/sshd {start|stop|restart|reload|condrestart|status}

أما بخصوص توزيعات الدبيان وأوبنتو نفذ:

/etc/init.d/ssh start

والخيارات المتاحة مختلفة بعض الشيء:

/etc/init.d/ssh {start|stop|reload|force-reload|restart|try-restart}

ذكرت الخيارات لكم لاننا سنحتاج في الكثير من الأحيان في هذا الموضوع الى عمل إما restart أو الطريقة المفضلة لي هي reload وسنرى الفرق قريباً. تابع معي الله يسعدك عزيزي القاريء

الآن الخدمة تم تشغيلها والأمور كلها تمام على السيرفر … الحين من جهاز آخر قم بعمل إتصال على السيرفر. الطريقة العامة هي:

ssh [email protected]/domain

لنعمل تجربة:

ssh [email protected]

سيقوم بسؤالك هل تريد إضافة هذا السيرفر الى قائمة الاجهزة المسموحة؟ قم بالإجابة حيث سيتم تسجيل المفتاح للسيرفر هذا في الملف:

~/.ssh/known_hosts

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

ssh 5.5.5.5

لانه سيعرف بإنك تريد تتصل من خلال المستخدم المستعمل نفسه والذي هو binary. طيب لو كنت بمستخدم آخر وحاولت الإتصال بالسيرفر بهذه الطريقة؟ مثلا كنت تعمل بمستخدم mohamed وقمت بعمل إتصال على السيرفر من خلال الأمر:

ssh 5.5.5.5

في حالة لم يكن على السيرفر مستخدم إسمه mohamed ؟ سيقول لك المستخدم غير موجود ويمنعك من الدخول. ولهذا التركيز الله يرضى عليكم حين يتم التطبيق ظروري جداً.

ملاحظة مهمة جداً جداً: الى الآن ما قمنا بشرحه هو الطريقة البسيطة والمعروفة Host-Key Authentication. جميع الإعدادات الإفتراضية للخدمة تسمح بهذه الطريقة ولا حاجة لك للتعديل على ملف الخدمة.

الآن لنقم بعمل إعداد للخدمة لكي تعمل على الطريقة الثانية والتي هي محل إهتمامي في هذا الموضوع، أي Public-Key Authentication. سنحتاج الى التعديل على الملف الخاص بالخدمة، ولكن قبل ذلك لنقوم بعمل إنشاء للمفتاح الذي سنقوم بإستعماله ومن ثم نسخه وبعد ذلك نرجع للتعديل.

الآن قم بالدخول بالمستخدم الذي ستقوم بإستعماله (في الغالب هو المستخدم الذي أعتدت على إستعماله) لكي نقوم بعمل المفتاح، مثلاً بالنسبة لي سأقوم بإستعمال الأسم binary. أفتح الطرفية على جهازك CLIENT ومن ثم نفذ عليه الأمر:

ssh-keygen -t rsa

أو

ssh-keygen -t dsa

ملاحظة: بإمكانك إستعمال اي طريقة تشاء من هذه الطرق، كلاهما يعمل مفاتيح قوية جداً لكن الفرق بينهما هو الأول يعمل المفاتيح الى حد أقصاه 2048bit والثاني الى حد أقصاه 1024bit.

أنا سأكمل مع المفتاح الأول أو النوع الأول RSA. أضغط على ENTER وأكمل سيظهر لك كلام يشبه التالي:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/binary/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/binary/.ssh/id_rsa.
Your public key has been saved in /home/binary/.ssh/id_rsa.
The key fingerprint is:
02:09:09:09:ee:cc:dd:4d:3d:3a:66:ff:ab:df:34:11 [email protected]

طبعاً الـ fingerprint بدون شك لك سيكون أرقام مختلفة، ومكان التخزين للمفتاح سيختلف في حالة كان المستخدم المستعمل عندك غير binary سيكون مثلا بالنسبة لـ mohamed التالي

/home/mohamed/.ssh/id_rsa

وهكذا. عند وصولك الى طلب إدخال الـ passphrase قم بوضع عبارة مرور للمفتاح هذا ولا تنسى ولا أريد أن أوصيك بأن تستعمل عبارة معقدة. هكذا قمنا بعمل المفتاحين العام والخاص للمستخدم binary طيب ماذا علينا عمل الحين؟ الأمر بسيط جداً قم بتنفيذ التالي:

scp ~/.ssh/id_rsa.pub [email protected]:.ssh/authorized_keys

هذا سيقوم بعمل نسخ للمفتاح العام الخاص بك الى السيرفر في الملف authorized_keys الموجود في المجلد

/home/binary/.ssh/

الآن قم بتنفيذ الأمر التالي:

chmod 600 /home/binary/.ssh/id_rsa.pub

وهذا:

chmod 400 /home/binary/.ssh/id_rsa

هكذا منعنا أي شخص غير المستخدم binary من قراءة الملف id_rsa.pub والذي هو المفتاح العام والملف id_rsa الذي هو المفتاح الخاص.

الآن تم عمل المفتاح وتم نسخه ماذا تبقى يا [email protected] لم يبقى الكثير. الآن هل أنت جاهز للتعديل على ملف إعدادات الخدمة؟ أذن توكل على الله وأبدأ معي

vim /etc/ssh/sshd_config

أذهب الى السطر الموجود فيه العبارة هذه PasswordAuthentication وقم بتعديلها الى التالي:

PasswordAuthentication no

الآن ما قمنا به هو منعنا الدخول الى السيرفر من خلال إستعمال اسم المستخدم وكلمته السرية الموجودة على السيرفر وسمحنا بإستعمال الطريقة الثانية Public-Key Authentication. الآن أضغط على Escape ومن ثم : ومن ثم x

هكذا خرجنا من المحرر vim مع تخزين التغييرات وعدنا الى الطرفية، الآن نأتي الى سبب ذكري للخيارات المتاحة في طريقة التشغيل/أعادة التشغيل/إيقاف الخدمة. حيث الآن بإمكانك عمل إعادة تشغيل للخدمة. على توزيعات CentOS و Fedora وأعجوبة طبعاً :) نفذ:

/etc/init.d/sshd restart

أما على توزيعات الدبيان وأوبنتو نفذ:

/etc/init.d/ssh restart

لكن بالنسبة لي أفضل طريقة الـ reload وذلك لاني لا أحتاج الى عمل إيقاف للخدمة بشكل كامل وإنما أقوم بإخبارها بإني أريدها أن تعيد قراءة ملف الإعدادات الخاص بها، وتحميله الى الذاكرة بدل الاعدادات التي تم تحميلها وقت تشغيل الخدمة. ولهذا سيكون حلي دائماً بعد التعديل على الإعدادات هو reload. على توزيعات CentOS و Fedora وأعجوبة طبعاً :) نفذ:

/etc/init.d/sshd reload

أما على توزيعات الدبيان وأوبنتو نفذ:

/etc/init.d/ssh reload

الآن أنتهينا من عمل المفاتيح، نسخ المفتاح العام الى السيرفر الثاني وقمنا بعمل إعدادات الخدمة وتشغيلها، الآن لنقوم بالتجربة في الدخول بالطريقة الجديدة. نفذ ما يلي:

ssh [email protected]

ستظهر لك عبارة شبيهة بالتالي:

Enter passphrase for key 'id_rsa':

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

سؤال: الآن ربما يسأل سائل كيف اعمل الطريقة الثالثة Passphrase-Less Authentication؟
الجواب: اعمل نفس الطريقة الثانية فقط لا تضع كلمة مرور على المفتاح حين تقوم بعملهم وانتهى الموضوع باقي الأمور جميعها نفس الشيء.

سؤال: طيب يا [email protected] ماذا لديك أكثر حول الخدمة هذه؟
الجواب: بالحقيقة يوجد الكثير، لكن أحب أن أضيف أمر أخر وهو إستعمال مفاتيح متعددة.
ربما هنا يتفاجيء أحدكم ويتسائل كيف يعني مفاتيح متعددة؟
الجواب: هو أن أستعمل مفتاح معيين للوصول الى السيرفر الأول ومفتاح آخر للوصول الى السيرفر الثاني وهكذا.
سؤال: وهل هذا ممكن يا [email protected]
الجواب: نعم ممكن تابع معي

الآن لنقم بعمل مفتاح جديد لنفرض للإتصال بسيرفر ثاني لك وعلى سبيل المثال يحمل رقم IP هو 6.6.6.6 ولكن هذه المرة بالطريقة التالية:

ssh-keygen -t rsa -f id_server2

وأكمل باقي خطوات عمل المفتاح من وضع عبارة المرور الى آخره.

سؤال: طيب الحين صار عندنا في المجلد

 /home/binary/.ssh

مفاتيح أثنين، كيف أقوم بإخبار السيرفر الثاني أنا أريد أتصل عليك من خلال المفتاح id_server2 وليس المفتاح id_rsa ؟
الجواب: قم بتنفيذ الأمر التالي:

ssh -i id_server2 [email protected]

هكذا قمت بإستعمال المفتاح الثاني للوصول الى سيرفرك الثاني 6.6.6.6 وسيطلب منك عبارة المرور passphrase للمفتاح الثاني التي أدخلتها حين عملت المفتاح.

سؤال: طيب [email protected] أريد تغيير عبارة المرور للمفتاح شلون؟
الجواب: بسيط يا عزيزي، لو كنت تريد تغيير العبارة للمفتاح id_rsa نفذ التالي:

ssh-keygen -p -f /home/binary/.ssh/id_rsa

أما لو كانت للمفتاح الجديد id_server2 نفذ التالي:

ssh-keygen -p -f /home/binary/.ssh/id_server2

سيطلب منك وضع عبارة المرور القديمة ومن ثم وضع عبارة جديدة للمفتاح. شايفين شلون الأمر بغاية البساطة ؟؟؟

الآن لا اريد أن أقوم بذكر جميع التفاصيل هناك أمرين سأتركهما لكما للتفكير وربما لكي يقوم أحدكم بإضافتهم الى الموضوع.
الأول: كيف أستطيع أن أعرف ما هو الـ fingerprint الخاص بالمفتاح الذي عندك؟
الثاني: كيف أستطيع تنفيذ أمر معيين على السيرفر من دون الحاجة الى تسجيل الدخول على السيرفر؟

الجواب: القراءة + التطبيق

آخر حاجة في موضوعي هذا. الآن نأتي الى أمور أخرى أحب أضيفها لعمل لنقول Hardening لخدمة الـ SSH بصورة أكثر وتعقيد أكثر (حال المخترق ) ما سأقوم به هو السماح لجهاز معيين بالدخول الى الخدمة سواءاً من خلال iptables أو من خلال xinetd.
طريقة iptables:

/sbin/iptables -A INPUT -p tcp -s 5.5.5.5 --dport 22 -j ACCEPT;

هكذا سمحت لمن معه المفتاح ويعمل من جهاز رقم الـ IP له هو 5.5.5.5 بالوصول الى خدمة ssh التي على سيرفري.

طريقة xinetd:

vim /etc/hosts.allow

بعد ذلك ضع التالي:

sshd: 5.5.5.5: ALLOW

بعد ذلك أعمل:

vim /etc/hosts.deny

وضع بداخله التالي:

sshd: ALL : DENY

هكذا سمحنا فقط للشخص الذي يتصل من الـ IP رقم 5.5.5.5 بالإتصال بالخدمة وبما إننا نستعمل المفاتيح للإتصال، يجب أن يكون معه المفتاح للإتصال. بهذا عقدنا الأمور أكثر على المخترق (مع العلم بالحقيقة يمكنك عمل spoof للـ IP لكن مع هذا التعقيد جيد).

الآن لزيادة الحماية أكثر لنقم بتحرير ملف الخدمة

vim /etc/ssh/sshd_config

وتستطيع وضع الخيارات التالية:

ListenAddress 5.5.5.5
PermitRootLogin no
Protocol 2
AllowUsers binary mohamed
AllowGroups admins
Port 5858

ما عملنا هو:
– في السطر الأول حددنا بإن الخدمة تستمع للطلبات القادمة من العنوان 5.5.5.5 فقط. أي تضع رقم الأي بي لسيرفرك نفسه، وليس للجهاز صاحب هذا الـ IP الذي تريد السماح له بالدخول.
– في السطر الثاني منعنا الدخول مباشرة الى الحساب root، إذا كنت تريد تستعمل root على السيرفر؟ أدخل بالمستخدم العادي ثم حول الى المستخدم root. أكيد تعرفون كيف؟ :)
– السطر الثالث بالغالب هو الأساسي أحببت تأكيده وهو إستعمال الخدمة SSH-2 وليس SSH-1.
– السطر الرابع سمحنا للمستخدمين binary و mohamed فقط بالدخول الى الخدمة.
– السطر الخامس سمحنا فقط للمستخدمين الذين يقعون في مجموعة إسمها admins من إستعمال الخدمة.
– في السطر السادس زيادة خير أننا قمنا بتغيير المنفذ الأصلي للخدمة ولكن لو وضعت هذا الرقم 5858؟ لا تنسى تقوم بتغييره في الأمر الذي كتبناه بالاعلى الخاص بـ iptables من 22 الى 5858 أوك؟

الآن لكي تتأكد من عدم وجود مشاكل لديك في ملف الإعدادات؟ قم بتنفيذ التالي:

`which sshd` -t

حيث سيقوم بفحصل الاعدادات، وإذا كانت لديك مشاكل فيه، سيقوم بكتابتها لك على الطرفية، وإن لم يكن لن يظهر لك شيء.

بهذه الحماية للخدمة؟ أنت مش بس عملت Harden للخدمة لديك وإنما كرهت المخترق بحياته وكرهته بنفسه لو يفكر يصل اليك.

سؤال: طبعاً تريد أكثر من هذه الحماية؟
الجواب: موجود يا عزيزي ، في شي إسمه Port-Knocking وفي شيء إسمه SPA وفي شي سأشرحه قريباً (أو أي متبرع ) وهو DenyHosts.

سؤال: تريد أكثر؟ خبرني؟
الجواب: أيضاً موجود ولكن هنا أقول لك اسئل Google

ما سأكمله حول خدمة SSH هو:
– تمرير X-Windows بطريقة آمنة من خلال SSH.
– إستعمال DenyHosts.
– وربما في القريب العاجل إستعمال SPA.

أتمنى تكونوا أستفدتم من الموضوع، وأن يكف الناس عن إستعمال طريقة Host-Key Authentication ويقوم بإستعمال طريقة Public-Key Authentication الرائعة والممتازة. ورمضان مبارك وإفطار شهي إن شاء الله …

وتستطيعون إيجاد الموضوع بالكامل للتحميل في صفحة المستندات

دمتم بود جميعاً …