يعد توفير الخدمات وإتاحة التطبيقات والموارد للمستخدمين الأهداف الأساسية لتجهيز الخواديم وإعدادها؛ إلا أن أي خادوم موصول بشبكة الإنترنت سيتعرض لا محالة لمستخدمين سيئي النيات يأملون استغلال الثغرات الأمنية للحصول على صلاحيات الدخول.
توجد الجدران النارية Firewalls بهدف حجب المنافذ Ports غير المستخدمة؛ إلا أن السؤال يُطرح عن ما يجب فعله للخدمات التي تريد الوصول إليها دون أن تكون معروضة للجميع، تريد استخدامها عند الحاجة ومنع الوصول إليها في الأوقات الأخرى.
الطرق على المنافذ Port knocking هو إحدى وسائل إخفاء الخدمات العاملة على جهازك؛ فتعمل على جعل الجدار الناري يحمي الخدمات إلى أن تطلب منه فتح منفذ عبر إرسال متتالية محدَّدة من البيانات.
سنتحدث في هذا الدليل عن كيفية إعداد آلية للطرق على المنافذ من أجل إخفاء خدمة SSH باستخدام حزمة knockd
على أوبنتو 14.04.
ملحوظة: يغطي هذا الشرح الإصدار الرابع من بروتوكول IP. يفصل لينكس بين تأميني الإصدار الرابع والإصدار السادس. على سبيل المثال، لا تنطبق قواعد iptables
إلا على حزم البيانات المنقولة عبر عناوين الإصدار الرابع، غير أنه يوجد مكافئ لها بالنسبة لعناوين الإصدار الرابع وهو ip6tables
.
إذا كان الخادوم لديك معدا لاستخدام عناوين الإصدار السادس فلا تنس تأمين كل من واجهات Interfaces كل من الإصدارين باستخدام الأدوات المناسبة.
كيف يعمل الطرق على المنافذ؟
تتمثل فكرة الطرق على المنفذ في إعداد خدمة لمراقبة سجلات Logs الجدار الناري أو واجهات Interfaces الشبكة بحثا عن محاولات اتصال. تغير الخدمةُ قواعدَ الجدار الناري، إذا جرت محاولات اتصال معرَّفة مسبقا (تعرف بالطرْقات Knocks)، من أجل السماح بالاتصالات عبر منفذ معيَّن.
تسمح هذه الطريقة بالإبقاء على الخدمات مخفية إلى الوقت الذي تريد استخدمها فيه. لا يناسب هذا الإعداد خواديم الويب التي يُسمَح عادة لجميع الاتصالات بالوصول إليها؛ إلا أنها مفيدة للخدمات الموجهة فقط لمستخدمين معروفين وبصلاحيات محددة، على سبيل المثال خدمة SSH.
لا ينبغي جعل الطرق على المنافذ التدبير الوحيد لتأمين الخدمات، رغم أن متتالية الطرق يمكن أن تكون معقدة جدا. تنفذ الخدمات عادة طرق تأمين واستيثاق خاصة بها تُعرَض للمستخدم بعد إرساله متتالية الطرق الصحيحة. يضيف الطرق على المنافذ، في هذا الإطار، طبقة جديدة يجب أن يمر بها المستخدم قبل أن يرى طريقة الاستيثاق المعتادة.
يوفر الطرق على المنافذ ميزة أخرى مفيدة هي أنه لا يُصدِر أي ردود على محاولات الطرق. إذا حاول متسلل فحص المنافذ فسيرى أنها مغلقة وإن إحاول تخمين متتالية الطرق فيجب عليه التحقق بعد كل تخمين لمعرفة إن كان المنفذ فُتِح أم لا؛ الأمر الذي سيكون كافيا في أغلب الحالات ليمنع المهاجمين من الدخول ويصرف أنظارهم عن إعادة المحاولة.
سنستخدم خلال هذا الشرح الجدار الناري المدمج افتراضيا مع أوبنتو (iptables
) ونثبت برنامج knockd
لتوفير وظيفة الطرق على المنافذ.
إعداد IPTables لمنع أغلب الاتصالات
نحتاج، قبل أن نبدأ في إعداد آلية للطرق على المنافذ، إلى ضبط قاعدي للجدار الناري. سنمنع كل الاتصالات تقريبا.
يأتي جدار IPTables الناري مضمنا في أوبنتو إلا أنه لا توجد افتراضيا أي قاعدة مما يعني أنه يُسمَح لجميع الاتصالات بالمرور. يمكنك تعلم كيفية إعداد جدار ناري باستخدام IPTables على Ubuntu 14.04 .
نبدأ بالسماح بالاتصال عبر الجهاز المحلي. يعني هذا القبول بالبيانات المرسَلة من الخادوم نفسه وهو ما يسمح للخدمات العاملة على الخادوم بالتواصل في ما بينها.
sudo iptables -A INPUT -i lo -j ACCEPT
يضيف الأمر أعلاه قاعدة إلى سلسلة INPUT
التي تتعامل مع جميع الاتصالات القادمة إلى الخادوم. تطلب القاعدة التي أضفناها من iptables
قبول جميع البيانات القادمة من الواجهة المحلية lo
التي تستخدم للاتصالات الداخلية.
الخطوة التالية هي السماح لكل الاتصالات الجارية بالاستمرار؛ لذا ننفذ الأمر:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
تطلب القاعدة الموجودة في الأمر أعلاه من iptables
السماح للاتصالات الجارية والبيانات المتعلقة بها بالمرور. هذه القاعدة مهمة ليمكننا مواصلة الاتصال بالخادوم عن بعد باستخدام SSH حتى لا نفقد الاتصال به عند بدء حظر الاتصالات.
ثم نضيف قواعد للسماح بالخدمات الموجهة للعموم، أي تلك التي لا يوجد شرط على مستخدميها مثل خادوم الويب (إن وُجد) الذي يعمل عادة على المنفذ رقم 80
:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
احذر أن تضيف قواعد للخدمات التي ستستخدم الطرق على المنافذ للوصول إليها. ستكون إضافةُ هذه القواعد مهمةَ خدمة الطرق التي ستعدل قواعد الجدار الناري حسب الطلب. لهذا السبب لن نضيف خادوم SSH إلى إعداد iptables
.
حتى هذه اللحظة لم نضف سوى قواعد تقبل الاتصال ولم نضف أي قواعد لحظر الاتصالات. وهو ما يعني أن الجدار الناري لا زال يقبل جميع الاتصالات؛ بعضها مذكور صراحة، وهي تلك التي أضفناها.
سنمنع الآن جميع الاتصالات، ما عدا تلك التي حددناها في الأوامر السابقة:
sudo iptables -A INPUT -j DROP
يعني هذا أن جميع محاولات الاتصال التي لا توافق إحدى القواعد المذكورة سابقا ستُحظَر. تمكن معاينة القواعد بتنفيذ الأمر:
sudo iptables -S
النتيجة:
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP
لاحظ أنه لا توجد حتى الآن قاعدة في إعدادات الجدار الناري تسمح باتصالات SSH.
أنهينا الآن قواعد الجدار الناري، بقي أن نجعلها دائمة حتى لا يعاد تعيينها عند إعادة تشغيل الخادوم. نستخدم أداة iptables-persistent
لهذا الغرض. نفذ الأمر التالي لتثبيتها:
sudo apt-get install iptables-persistent
ثم شغل الخدمة بعد انتهاء التثبيت:
sudo service iptables-persistent start
تثبيت خدمة Knockd
يدعى البرنامج الذي سنستخدمه لتمكين آلية للطرق عبر المنافذ knockd
. ثبته بتنفيذ الأمر التالي:
sudo apt-get install knockd
لا يشغَّل البرنامج مباشرة بعد ثبيته وذلك حتى لا يحظُر بيانات كثيفة على الفور. يجب أن تضبط الخدمة وتفعلها يدويا.
إعداد Knockd لاستخدام الطرق على المنافذ
يوجد ملف إعداد يجب تحريره لإعداد الخدمة:
sudo nano /etc/knockd.conf
يجب أن يظهر لديك ملف بمحتوى شبيه بالتالي:
[options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
في المقطع [options]
توجد تعليمة باسم UseSyslog
تخبر خدمة knockd
أن عليها استخدام الوسائل الاعتيادية لحفظ السجلات. ينتج عن هذه التعليمة إدراج السجلات ضمن المجلد var/log/messages/
.
إذا أردت حفظ السجلات في مكان مغاير فيمكنك ذلك باستخدام التعليمة التالية بدلا من UseSyslog
(حيث path/to/log/file/
مسار ملف السجلات):
LogFile = /path/to/log/file
ثم يأتي مقطعان يُستخدَمان لتجميع قواعد تُطابِق جميعها حدثا واحدا. لا يؤثر اسم المقطع على عمله إلا أنه يفيد لإعطاء نبذة لمن يفتح الملف عن عمل المقطع.
يوجد في ملف الإعداد الافتراضي مقطع يفتح منفذ SSH وآخر لغلق نفس المنفذ.
المعطى الذي يعيّن نمط الطرق هو التالي:
sequence = 7000,8000,9000
يعني النمط أعلاه أن مجموعة القواعد هذه ستبحث ما إذا كان نفس عنوان IP طلب الاتصال على المنفذ رقم 7000
متبوعا مباشرة بالمنفذ 8000
ثم أخيرا المنفذ 9000
. سنغير متتالية الطرق لتصبح على النحو التالي:
sequence = 2022,3022,4022
يوجد معطيان آخران في المجموعة يراقبان النشاط:
seq_timeout = 5 tcpflags = syn
يحدد المعطى الأول مدة زمنية يجب أن تكتمل فيها متتالية طلبات الاتصال المعرفة في المعطى السابق. أما المعطى الثاني فيحدد خيارا يجب أن يتواجد في حزم tcp
حتى تكون صالحة (يستخدم هذا الخيار لمعرفة الطريقة التي يجب بها التعامل مع الحزم وحالتها). يشيع استخدام القيمة syn
للتفريق بين الحزم التي نريدها وتلك التي تنشئها برامج مثل SSH في الخلفية.
ثم نجد الأمر:
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
يجب أن تتعرف على قاعدة من قواعد iptables
. يمكن إذن تفسير المقطع بأنه عند إرسال متتالية الطرق في الوقت المحدد فسينفذ الأمر أعلاه من أجل السماح باتصالات SSH.
إذا تفطنت لإعدادات iptables
فسترى أن القاعدة الجديدة تستخدم الخيار A-
لإلحاق القاعدة بنهاية سلسلة INPUT
؛ وهو ما يعني أنها ستكون بعد القاعدة التي تحظر كافة الاتصالات.
سنحتاج للتعديل على الأمر وإبدال القاعدة بأخرى تُدرَج في بداية الملف؛ لذا سنستخدم الخيار I-
ونعلم القاعدة على أنها القاعدة رقم 1:
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
ستُضاف قاعدة جديدة للسماح بقبول اتصالات SSH من المسخدِم الذي أرسل متتالية الطرق. الجزء %IP%
الموجود في القاعدة سيُبدَل بعنوان IP الذي أتت منه متتالية الطرق.
المقطع الأخير يؤدي عملا مشابها بمتتالية مغايرة وأمر يعمد إلى حذف قاعدة فتح اتصالات SSH من iptables
. سنستخدم المتتالية 4022,3022,2022
لإنهاء الاتصال الذي أنشأناه وغلق المنفذ المرتبط به (أي المنفذ رقم 22
).
يجب تغيير المتتاليات الموجودة افتراضيا في المقاطع وإبدالها بأخرى عشوائية. ترك المتتالية الموجودة افتراضيا في ملف الإعداد يجعل من تنفيذ آلية طرق المنافذ هذه بلا فائدة (الجميع يعرف المتتالية الافتراضية).
أغلق الملف (CTRl + X) ثم احفظه (CTRL +O).
تشغيل خدمة Knockd
يمكننا الآن بعد أن أنهينا إعداد knockd
للحصول على مجموعة قواعد صالحة اختبارُ الإعداد بتشغيل الخدمة. تذكر أن الإعداد الافتراضي صالح إلا أنه لن يكون آمنا إلا إذا غيرت متتالية الطرق الافتراضية لكل مقطع.
يجب التعديل على ملف آخر لتفعيل الخدمة:
sudo nano /etc/default/knockd
نغير قيمة الخيار START_KNOCKD
لتصبح 1
:
START_KNOCKD=1
أغلق الملف (CTRl + X) ثم احفظه (CTRL +O).
يمكننا الآن تشغيل الخدمة، لذا ننفذ الأمر:
sudo service knockd start
يشغل الأمر خدمة knockd
ويسمح بتغيير قواعد الجدار الناري عند الطرق على المنافذ حسب المتتالية المعرَّفة في ملف الإعداد.
اختبار الطرق على المنافذ
سنرى الآن ما إذا كان بإمكاننا التعديل على قواعد iptables
بالطرق على المنافذ المعرفة في ملف الإعداد. أبق - احترازا - على اتصالك الجاري بالخادوم نشطا وافتح نافذة جديدة للطرفية.
توجد الكثير من الأدوات للاستخدام في طرق المنافذ؛ ومن أشهرها nmap
، netcat
وعميل آخر صُمِّم خصيصا للطرق واسمه knock
.
سنستخدم أداة knock
ولكن قبل ذلك فلنتأكد أولا من أن منفذ SSH مغلق فعليا.
ssh root@server_ip_address
يجب أن تكون النتيجة على النحو التالي:
ssh: connect to host server_ip_address port 22: Operation timed out
يعني هذا أن الخادوم لم يُجِب وأن المهلة الممنوحة للاتصال انقضت. يعود السبب إلى أن خدمة SSH محظورة على الخادوم حسب قواعد iptables
. اضغط على زري CTRL
وC
للعودة إلى الطرفية إن طالت مدة محاولة الاتصال.
أداة Knock لطرق المنافذ
أداة knock
وسيلة سهلة للطرق على المنافذ يطورها نفس فريق knockd
. تُضَمَّن هذه الأداة في حزمة knockd
؛ لذا يمكن تثبيتها على الجهاز العميل مثل ما فعلنا على الخادوم:
sudo apt-get install knockd
يمكن أيضا تنزيل الأداة من الموقع الرسمي الذي توجد به إصدارات لكل من Windows وOS X؛ وكذلك لأندرويد وiOS.
تُستخدَم أداة knock
على النحو التالي:
knock server_ip_address sequence
حيث sequence
متتالية الطرق وserver_ip_address
عنوان IP الخادوم. بالنسبة لمثالنا سيكون الاستخدام على النحو التالي:
knock server_ip_address 2022 3022 4022
ولإغلاق المنفذ نرسل المتتالية التي حددناها في ملف الإعداد:
knock server_ip_address 4022 3022 2022
إعداد Knockd لغلق الاتصالات تلقائيا
تأكدنا الآن من أن خدمة الطرق تعمل. سنغير الإعدادات لجعلها أكثر صلابة.
أعد فتح ملف الإعداد على الخادوم
sudo nano /etc/knockd.conf
يتيح knockd
إمكانية تحديد مدة زمنية يُنفَّذ أمر محدد بعد انقضائها؛ نستفيد من هذه الميزة للاكتفاء بقاعدة واحدة لفتح وإغلاق منفذ SSH؛ مما يعني أننا لن نحتاج لإرسال متتالية الطرق حتى يغلَق المنفذ.
يمكن حذف مقاطع openSSH وcloseSSH ضمن ملف الإعداد لأننا سنبدلها بمقطع وحيد نسميه SSH:
[options] UseSyslog [SSH]
سنعرِّف داخل مقطع SSH متتالية للطرق، خيار tcpflags
ومهلة زمنية للانتظار ينبغي الطرق على المنافذ خلالها؛ مثل ما فعلنا مع المقطعين السابقين. سنضيف أيضا الأمر المستخدَم لفتح منفذ SSH:
[options] UseSyslog [SSH] sequence = 5438,3428,3280,4479 tcpflags = syn seq_timeout = 15 start_command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
اختر متتالية منافذ فريدة. حددنا في هذا المثال أربعة منافذ. تمكن زيادتها حسب رغبتك ولكن انتبه إلى أنه يجب طرق المنافذ خلال المدة الزمنية (بالثواني) المحدَّدة ضمن معطى seq_timeout
.
معطى start_command
هو نفسه معطىcommand
الذي رأيناه في الأمثلة السابقة؛ الفرق الوحيد هو أن الاسم أكثر إسهابا.
يأتي الآن دور المعطيات الجديدة التي ستساعدنا على غلق المنفذ:
[options] UseSyslog [SSH] sequence = 5438,3428,3280,4479 tcpflags = syn seq_timeout = 15 start_command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 10 stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
يحدد معطى cmd_timeout
الثواني التي ستنتظرها خدمة knockd
قبل تنفيذ الأمر الموجود ضمن معطى stop_command
.
النتيجة هي أنه عند إرسال المتتالية الصحيحة فإن المنفذ سيُفتح لمدة 10 ثوان ثم يُغلق من جديد.
احفظ الملف ثم أغلقه.
أعد تشغيل الخدمة لاعتماد القواعد الجديدة:
sudo service knockd restart
يمكن استخدام الأمر التالي للاتصال ضمن الوقت المحدد:
knock server_ip_address 5438 3428 3280 4479 && ssh root@server_ip_address
سيغلق المنفذ بعد 10 ثوان من الاتصال.
خاتمة
يُنظَر إلى الطرق على المنافذ على أنه مجرد إخفاء للخدمات بدل تأمينها؛ على الرغم من ذلك يبقى وسيلة رائعة لإضافة طبقة أمان جديدة ضد الهجمات العشوائية.
يجب دائما تأمين خدماتك عبر الوسائل الأمنية المتاحة في النظام إلا أن إضافة مِصيدة مثل الطرق على المنافذ أمام التدابير الأمنية المعتادة يمكن أن يقلل بقدر ملحوظ هجمات القوة القاسية ومحاولات التسلل التي يتعرض لها خادومك.
ترجمة - بتصرف - لمقال How To Use Port Knocking to Hide your SSH Daemon from Attackers on Ubuntu.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.