مقدمة
SSH هو الطريقة القياسية للاتصال بخادم سحابي. إنها دائمة، وهي قابلة للتوسيع — حيث يمكن استخدام معايير التشفير الجديدة لإنشاء مفاتيح SSH جديدة، مما يضمن أن يبقى البروتوكول الأساسي آمنًا. ومع ذلك، لا يوجد بروتوكول أو مجموعة برمجية خالية تمامًا من الثغرات، وبما أن SSH منتشر على نطاق واسع عبر الإنترنت، فإنه يمثل سطح هجوم متوقعًا جدًا أو قناة هجومية يمكن من خلالها للأشخاص محاولة الوصول. سطح هجوم أو متجه هجوم يمكن من خلالها للأشخاص محاولة الوصول.
أي خدمة معرضة للشبكة تعتبر هدفًا محتملًا بهذه الطريقة. إذا قمت بمراجعة السجلات الخاصة بخدمة SSH الخاصة بك التي تعمل على أي خادم يتم تداوله على نطاق واسع، فسوف ترى في كثير من الأحيان محاولات تسجيل دخول متكررة ومنهجية تمثل هجمات القوة الغاشمة من قبل المستخدمين والروبوتات على حد سواء. على الرغم من أنه يمكنك إجراء بعض الأمانيات على خدمة SSH الخاصة بك لتقليل احتمال نجاح هذه الهجمات إلى الصفر تقريبًا، مثل تعطيل المصادقة بكلمة المرور لصالح مفاتيح SSH، فإنها قد تشكل لاحقًا مسؤولية طفيفة ومستمرة.
النشر الكبير للإصدارات التي لا يمكن تقبل هذا المسؤولية بالكامل عادةً ما ينفذون شبكة خاصة افتراضية مثل WireGuard أمام خدمة SSH الخاصة بهم، بحيث يكون من المستحيل الاتصال مباشرة بمنفذ SSH الافتراضي 22 من الإنترنت الخارجي بدون برمجيات تجريد أو بوابات إضافية. هذه الحلول للشبكة الافتراضية الخاصة موثوقة بشكل واسع، ولكنها ستضيف تعقيدًا، وقد تتسبب في تعطل بعض الأتمتة أو السنانير الصغيرة الأخرى.
قبل الالتزام بإعداد VPN كامل، يمكنك تنفيذ أداة تسمى Fail2ban. يمكن لـ Fail2ban التقليل بشكل كبير من هجمات القوة الغاشمة عن طريق إنشاء قواعد تعدل تلقائيًا تكوين جدار الحماية الخاص بك لحظر عناوين IP محددة بعد عدد معين من محاولات تسجيل الدخول الناجحة. سيتيح لك هذا تقوية الخادم الخاص بك ضد هذه المحاولات من دون تدخل منك.
في هذا الدليل، سترى كيفية تثبيت واستخدام Fail2ban على خادم Ubuntu 22.04.
المتطلبات المسبقة
لإكمال هذا الدليل، ستحتاج إلى:
-
خادم Ubuntu 22.04 ومستخدم غير جذري يمتلك امتيازات sudo. يمكنك معرفة المزيد حول كيفية إعداد مستخدم بهذه الامتيازات في دليلنا إعداد الخادم الأولي مع Ubuntu 22.04.
-
اختياريًا، يمكن أن يكون لديك خادم ثانٍ يمكنك الاتصال به من الخادم الأول، والذي ستستخدمه لاختبار الحظر بشكل متعمد.
الخطوة 1 — تثبيت Fail2ban
Fail2ban متاح في مستودعات البرامج لأوبونتو. ابدأ بتشغيل الأوامر التالية كمستخدم غير جذري لتحديث قوائم الحزم وتثبيت Fail2ban:
سيقوم Fail2ban تلقائيًا بإعداد خدمة في الخلفية بعد التثبيت. ومع ذلك، فهو معطل بشكل افتراضي، لأن بعض الإعدادات الافتراضية قد تسبب تأثيرات غير مرغوب فيها. يمكنك التحقق من ذلك باستخدام الأمر systemctl
:
Output○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled
Active: inactive (dead)
Docs: man:fail2ban(1)
يمكنك تمكين Fail2ban على الفور، ولكن أولاً، ستقوم بمراجعة بعض ميزاته.
الخطوة 2 – تكوين Fail2ban
الخدمة fail2ban تُحتفظ بملفات تكوينها في الدليل /etc/fail2ban
. هناك ملف بالقيم الافتراضية يسمى jail.conf
. انتقل إلى ذلك الدليل واطبع أول 20 سطرًا من ذلك الملف باستخدام head -20
:
Output#
# تحذير: تم إعادة ترتيبه بشكل كبير في إصدار 0.9.0. يرجى مراجعة و
# تخصيص الإعدادات لتكوينك.
#
# التغييرات: في معظم الحالات، لا يجب عليك تعديل هذا
# الملف، ولكن قدم تخصيصات في ملف jail.local،
# أو ملفات .conf منفصلة تحت الدليل jail.d/، على سبيل المثال:
#
# كيفية تفعيل السجون:
#
# لا يجب عليك تعديل هذا الملف.
#
# سيتم ربما استبداله أو تحسينه في تحديث التوزيع.
#
# قدم التخصيصات في ملف jail.local أو jail.d/customisation.local.
# على سبيل المثال، لتغيير وقت الحظر الافتراضي لجميع السجون وتمكين
# سجن ssh-iptables، سيظهر ما يلي (غير معلق) في الملف .local.
# انظر إلى man 5 jail.conf للتفاصيل.
#
# [DEFAULT]
كما سترى، تبدأ العديد من الأسطر الأولى في هذا الملف مع تعليقات – تبدأ بأحرف #
تشير إلى أنه يجب قراءتها كوثائق بدلاً من إعدادات. كما سترى أيضًا، توجه هذه التعليقات يُطلب عدم تعديل هذا الملف مباشرة. بدلاً من ذلك، لديك خيارين: إما إنشاء ملفات ملفات تعريف فردية لـ Fail2ban في مجلد jail.d/
، أو إنشاء وجمع جميع الإعدادات المحلية في ملف jail.local
. سيتم تحديث ملف jail.conf
بشكل دوري عند تحديث Fail2ban نفسه، وسيُستخدم كمصدر للإعدادات الافتراضية التي لم تقم بإنشاء أي تجاوزات لها.
في هذا البرنامج التعليمي، ستقوم بإنشاء jail.local
. يمكنك القيام بذلك عن طريق نسخ jail.conf
:
الآن يمكنك البدء في إجراء تغييرات التكوين. افتح الملف في nano
أو محرر النص المفضل لديك:
أثناء التمرير خلال الملف، سيستعرض هذا البرنامج التعليمي بعض الخيارات التي قد ترغب في تحديثها. توجد الإعدادات تحت القسم [DEFAULT]
بالقرب من أعلى الملف وسيتم تطبيقها على جميع الخدمات التي يدعمها Fail2ban. في أماكن أخرى في الملف، هناك رؤوس لـ [sshd]
ولخدمات أخرى، تحتوي على إعدادات محددة للخدمة ستُطبق فوق الإعدادات الافتراضية.
[DEFAULT]
. . .
bantime = 10m
. . .
يعيّن المعلمة bantime
مدة الوقت التي سيتم فيها حظر العميل عند فشله في المصادقة بشكل صحيح. يتم قياس ذلك بالثواني. بشكل افتراضي، يتم تعيين هذا إلى 10 دقائق.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
المعلمات التاليتان هما findtime
و maxretry
. تعمل هذه معًا على تحديد الشروط التي يتم فيها اعتبار العميل مستخدمًا غير شرعي يجب حظره.
المتغير maxretry
يحدد عدد المحاولات التي يتاح للعميل المصادقة عليها في نافذة زمنية محددة بواسطة findtime
، قبل أن يتم حظره. بإعدادات الافتراضي، سيقوم خدمة fail2ban بحظر عميل حاول دخول غير ناجح 5 مرات في نافذة زمنية تبلغ 10 دقائق.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
إذا كنت بحاجة إلى تلقي تنبيهات بالبريد الإلكتروني عندما تتخذ Fail2ban إجراء، يجب عليك تقييم الإعدادات destemail
، sendername
، و mta
. المعلمة destemail
تحدد عنوان البريد الإلكتروني الذي يجب أن تتلقى رسائل الحظر عليه. تحدد sendername
قيمة حقل “من” في البريد الإلكتروني. تكون المعلمة mta
تكوين الخدمة البريدية التي ستُستخدم لإرسال البريد. بشكل افتراضي، يكون هذا sendmail
، لكن قد ترغب في استخدام Postfix أو حلاً بريدياً آخر.
[DEFAULT]
. . .
action = $(action_)s
. . .
تكوين هذه المعلمة الإجراء الذي يتخذه Fail2ban عندما يرغب في تطبيق الحظر. تم تحديد القيمة action_
في الملف بشكل قريب قبل هذه المعلمة. الإجراء الافتراضي هو تحديث تكوين جدار الحماية الخاص بك لرفض حركة المرور من الجهاز المسبب للمشكلة حتى ينتهي وقت الحظر.
هناك سكربتات أخرى للإجراءات المقدمة افتراضيًا يمكنك استبدال $(action_)
بها أعلى:
…
# حظر وإرسال بريد إلكتروني مع تقرير whois إلى destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# حظر وإرسال بريد إلكتروني مع تقرير whois وسجلات تسجيل ذات صلة
# إلى destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# انظر الملاحظة المهمة في action.d/xarf-login-attack لمعرفة متى يجب استخدام هذا الإجراء
#
# حظر وإرسال بريد إلكتروني xarf إلى جهة اتصال الإساءة من عنوان IP وتضمين سجلات تسجيل ذات صلة
# إلى destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# حظر IP على CloudFlare وإرسال بريد إلكتروني مع تقرير whois وسجلات تسجيل ذات صلة
# إلى destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…
على سبيل المثال، يأخذ action_mw
إجراء ويرسل بريدًا إلكترونيًا، action_mwl
يأخذ إجراء ويرسل بريدًا إلكترونيًا، ويضمن تسجيلًا، و action_cf_mwl
يفعل كل ذلك بالإضافة إلى إرسال تحديث إلى API Cloudflare المرتبط بحسابك لحظر المخالف هناك أيضًا.
إعدادات السجن الفردية
الآن جاء دور جزء ملف التكوين الذي يتعامل مع الخدمات الفردية. تُحدد هذه برؤوس الأقسام، مثل [sshd]
.
يجب تمكين كل من هذه الأقسام على حدة من خلال إضافة سطر enabled = true
تحت العنوان، مع إعداداتها الأخرى.
[jail_to_enable]
. . .
enabled = true
. . .
بشكل افتراضي، يتم تمكين خدمة SSH وتعطيل جميع الخدمات الأخرى.
.
بعض الإعدادات الأخرى التي يتم تعيينها هنا هي filter
التي ستستخدم لتحديد ما إذا كانت سطرًا في السجل يشير إلى محاولة فشل في المصادقة وlogpath
الذي يخبر fail2ban أين تقع سجلات تلك الخدمة بالتحديد.
قيمة filter
هي في الواقع إشارة إلى ملف يقع في دليل /etc/fail2ban/filter.d
، مع إزالة الامتداد .conf
. تحتوي هذه الملفات على تعابير منتظمة (اختصار شائع لتحليل النصوص) التي تحدد ما إذا كان سطر في السجل هو محاولة فشل في المصادقة. لن نغطي هذه الملفات بشكل مفصل في هذا الدليل، لأنها معقدة إلى حد ما وتتطابق الإعدادات المحددة مع السطور المناسبة بشكل جيد.
ومع ذلك، يمكنك رؤية نوع الفلاتر المتاحة عن طريق النظر في تلك الدليل:
إذا رأيت ملفًا يبدو متعلقًا بخدمة تستخدمها، يجب عليك فتحه باستخدام محرر نصوص. معظم الملفات تحتوي على تعليقات جيدة إلى حد ما ويجب أن تتمكن على الأقل من معرفة نوع الشرط الذي تم تصميم النصيب لحمايته. معظم هذه الفلاتر تحتوي على أقسام مناسبة (معطلة) في ملف jail.conf
يمكننا تمكينها في ملف jail.local
إذا رغبنا في ذلك.
على سبيل المثال، تخيل أنك تخدم موقع ويب باستخدام Nginx وتدرك أن قسمًا محميًا بكلمة مرور من موقعك يتعرض لعدد كبير من محاولات تسجيل الدخول. يمكنك أن تخبر fail2ban باستخدام ملف nginx-http-auth.conf
للتحقق من هذا الشرط داخل ملف /var/log/nginx/error.log
.
في الواقع، يتم تعيين هذا بالفعل في قسم يسمى [nginx-http-auth]
في ملف /etc/fail2ban/jail.conf
الخاص بك. ستحتاج فقط إلى إضافة المعلمة enabled
:
. . .
[nginx-http-auth]
enabled = true
. . .
عند الانتهاء من التحرير، قم بحفظ وإغلاق الملف. في هذه النقطة، يمكنك تمكين خدمة Fail2ban حتى يعمل تلقائيا من الآن فصاعدا. أولا، قم بتشغيل systemctl enable
:
ثم، قم بتشغيله يدويا للمرة الأولى باستخدام systemctl start
:
يمكنك التحقق من أنه يعمل باستخدام systemctl status
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
Docs: man:fail2ban(1)
Main PID: 39396 (fail2ban-server)
Tasks: 5 (limit: 1119)
Memory: 12.9M
CPU: 278ms
CGroup: /system.slice/fail2ban.service
└─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready
في الخطوة التالية، ستقوم بتوضيح عمل Fail2ban.
الخطوة 3 — اختبار سياسات الحظر (اختياري)
من خادم آخر، الذي لن يحتاج إلى تسجيل الدخول إلى خادم Fail2ban مستقبلا، يمكنك اختبار القواعد عن طريق حظر ذلك الخادم الثاني. بعد تسجيل الدخول إلى الخادم الثاني، حاول الاتصال بخادم Fail2ban عبر SSH. يمكنك محاولة الاتصال باستخدام اسم غير موجود:
أدخل محارف عشوائية في مربع الحساب. كرر هذا عدة مرات. في بعض الأحيان، يجب أن يتغير الخطأ الذي تتلقاه من Permission denied
إلى Connection refused
. هذا يشير إلى أن الخادم الثاني الخاص بك قد تم حظره من خادم Fail2ban.
على خادم Fail2ban الخاص بك، يمكنك رؤية القاعدة الجديدة عن طريق التحقق من الإخراج الخاص بـ iptables
. iptables
هو أمر للتفاعل مع قواعد المنافذ والجدران النارية على مستوى منخفض على الخادم الخاص بك. إذا كنت قد اتبعت دليل DigitalOcean لإعداد الخادم الأولي، فستستخدم ufw
لإدارة قواعد الجدار الناري على مستوى أعلى. تشغيل iptables -S
سيعرض لك جميع قواعد الجدار الناري التي قام ufw
بإنشائها بالفعل:
Output-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-sshd
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
…
إذا قمت بتوجيه إخراج iptables -S
إلى grep
للبحث ضمن تلك القواعد عن سلسلة f2b
، يمكنك رؤية القواعد التي تمت إضافتها بواسطة fail2ban:
Output-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN
سيتم إضافة السطر الذي يحتوي على REJECT --reject-with icmp-port-unreachable
بواسطة Fail2ban ويجب أن يعكس عنوان IP الخاص بالخادم الثاني.
الاستنتاج
يجب أن تكون قادرًا الآن على تكوين بعض سياسات الحظر لخدماتك. يعتبر Fail2ban طريقة مفيدة لحماية أي نوع من الخدمات التي تستخدم المصادقة. إذا كنت ترغب في معرفة المزيد حول كيفية عمل fail2ban، يمكنك الاطلاع على البرنامج التعليمي الخاص بنا حول كيفية عمل قواعد وملفات fail2ban.
للحصول على معلومات حول كيفية استخدام fail2ban لحماية خدمات أخرى، يمكنك قراءة حول كيفية حماية خادم Nginx باستخدام Fail2Ban على Ubuntu 14.04 و كيفية حماية خادم Apache باستخدام Fail2Ban على Ubuntu 14.04.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04