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 فقط.
-
في السطر
الثاني منعنا الدخول مباشرة الى
الحساب 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 الرائعة
والممتازة. ورمضان
مبارك وإفطار شهي إن شاء الله ...
دمتم
بود جميعاً ...
أخوكم [email protected] ...