كيفية حماية SSH باستخدام Fail2Ban على Rocky Linux 8

مقدمة

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

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

نادرًا ما يقوم النشر الضخم للمنتجات الذين لا يمكن قبول المسؤولية فيه بالاتصال بخدمة SSH مباشرة، لذا غالبًا ما يقومون بتنفيذ شبكة افتراضية خاصة (VPN) مثل WireGuard أمام خدمتهم SSH، بحيث يصبح من المستحيل الاتصال مباشرة بمنفذ SSH الافتراضي 22 من الإنترنت الخارجي دون برنامج تجريدي إضافي أو بوابات. تعتمد هذه الحلول من الشبكة الافتراضية على نطاق واسع، ولكنها تزيد من التعقيد، وقد تؤدي إلى تعطيل بعض الأتمتة أو الخطوط البرمجية الصغيرة الأخرى.

قبل الالتزام بإعداد شبكة افتراضية خاصة كاملة أو بجانبه، يمكنك تنفيذ أداة تُسمى Fail2ban. يمكن لـ Fail2ban التقليل بشكل كبير من هجمات القوة الغاشمة من خلال إنشاء قواعد تقوم تلقائيًا بتغيير تكوين جدار الحماية الخاص بك لحظر عناوين IP معينة بعد عدد معين من محاولات تسجيل الدخول الفاشلة. سيتيح هذا لخادمك تقوية نفسه ضد محاولات الوصول هذه دون تدخل منك.

في هذا الدليل، سترى كيفية تثبيت واستخدام Fail2ban على خادم Rocky Linux 8.

المتطلبات الأساسية

لإكمال هذا الدليل، ستحتاج:

  • خادم Rocky Linux 8 ومستخدم غير جذري بامتيازات sudo. يمكنك معرفة المزيد حول كيفية إعداد مستخدم بهذه الامتيازات في دليلنا إعداد الخادم الأولي مع Rocky Linux 8. يجب أيضًا أن يكون firewalld قيد التشغيل على الخادم، والذي يتم تغطيته في دليلنا لإعداد الخادم الأولي.

  • اختياريًا، يمكنك استخدام خادم ثانٍ يمكنك الاتصال به من الخادم الأول، والذي ستستخدمه لاختبار الحظر بشكل متعمد.

الخطوة 1 — تثبيت Fail2ban

Fail2ban غير متوفر في مستودعات البرمجيات الافتراضية لـ Rocky. ومع ذلك، فهو متوفر في مستودع EPEL، أو مستودع الحزم المحسنة للشركات Linux، الذي يُستخدم عادةً للحزم من طرف ثالث على Red Hat و Rocky Linux. إذا لم تكن قد أضفت EPEL بالفعل إلى مصادر حزم النظام الخاص بك، يمكنك إضافة المستودع باستخدام dnf، كما تقوم بتثبيت أي حزمة أخرى:

  1. sudo dnf install epel-release -y

سيقوم مدير الحزم dnf الآن بالتحقق من EPEL بالإضافة إلى مصادر الحزم الافتراضية عند تثبيت برامج جديدة. قم بالمتابعة لتثبيت Fail2ban:

  1. sudo dnf install fail2ban -y

سيقوم Fail2ban تلقائيًا بإعداد خدمة في الخلفية بعد تثبيته. ومع ذلك، فإنه معطل افتراضيًا، لأن بعض الإعدادات الافتراضية قد تسبب تأثيرات غير مرغوب فيها. يمكنك التحقق من ذلك باستخدام الأمر systemctl:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled Active: inactive (dead) Docs: man:fail2ban(1)

يمكنك تمكين Fail2ban على الفور، ولكن أولاً، ستستعرض بعض ميزاته.

الخطوة 2 – تكوين Fail2ban

تحتفظ خدمة fail2ban بملفات تكوينها في الدليل /etc/fail2ban. هناك ملف يسمى jail.conf. انتقل إلى ذلك الدليل واطبع أول 20 سطرًا من هذا الملف باستخدام head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
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:

  1. sudo cp jail.conf jail.local

الآن يمكنك البدء في إجراء التغييرات في التكوين. افتح الملف في vi أو محرر النص المفضل لديك:

  1. sudo vi jail.local

أثناء تمريرك عبر الملف، سيستعرض هذا البرنامج التعليمي بعض الخيارات التي قد ترغب في تحديثها. سيتم تطبيق الإعدادات الموجودة تحت القسم [DEFAULT] بالقرب من أعلى الملف على جميع الخدمات التي يدعمها Fail2ban. في أماكن أخرى في الملف، هناك عناوين لـ [sshd] ولخدمات أخرى، تحتوي على إعدادات محددة للخدمة ستُطبق فوق القيم الافتراضية.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

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

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

المعلمتان التاليتان هما findtime و maxretry. تعمل هذه معًا لتحديد الظروف التي يتم فيها اعتبار العميل مستخدمًا غير شرعي يجب حظره.

المتغير maxretry يحدد عدد المحاولات التي يملك العميل للمصادقة في نافذة زمنية محددة بواسطة findtime، قبل أن يتم حظره. مع الإعدادات الافتراضية، سيقوم خدمة fail2ban بحظر عميل حاول الدخول بشكل غير ناجح 5 مرات داخل نافذة زمنية بمدة 10 دقائق.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

إذا كنت بحاجة إلى تلقي تنبيهات البريد الإلكتروني عندما يتخذ Fail2ban إجراء، يجب عليك تقييم إعدادات destemail، sendername، و mta. يقوم المعلمة destemail بتحديد عنوان البريد الإلكتروني الذي يجب أن يتلقى رسائل الحظر. بينما تعيّن sendername قيمة حقل “من” في البريد الإلكتروني. المعلمة mta تهيئ الخدمة البريدية التي ستستخدم لإرسال البريد. وبشكل افتراضي، يكون ذلك sendmail، ولكن قد ترغب في استخدام بريد آخر مثل Postfix.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

هذه المعلمة تكوّن الإجراء الذي يتخذه Fail2ban عندما يرغب في فرض حظر. يتم تعريف القيمة action_ في الملف قبل هذه المعلمة بقليل. الإجراء الافتراضي هو تحديث تكوين جدار الحماية لديك لرفض حركة المرور من الجهاز المخالف حتى ينتهي وقت الحظر.

هناك سكربتات أخرى action_ مقدمة افتراضيًا يمكنك استبدال $(action_) بها أعلاه:

/etc/fail2ban/jail.local
…
# حظر وإرسال بريد إلكتروني مع تقرير 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 إلى جهة الاتصال بسوء استخدام عنوان الآي بي وتضمين سطور سجل ذات الصلة
# إلى destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# حظر الآي بي على 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 يفعل كل ذلك بالإضافة إلى إرسال تحديث إلى واجهة برمجة تطبيقات Cloudflare المرتبطة بحسابك لحظر الجانح هناك أيضًا.

إعدادات السجن الفردية

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

يجب تمكين كل من هذه الأقسام بشكل فردي عن طريق إضافة سطر enabled = true تحت العنوان، مع إعداداتها الأخرى.

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

لهذا البرنامج التعليمي، ستقوم بتمكين السجن SSH. يجب أن يكون في الجزء العلوي من إعدادات السجن الفردي. ستعمل المعلمات الافتراضية بشكل آخر، ولكن ستحتاج إلى إضافة سطر تكوين يقول enabled = true تحت [sshd] العنوان.

/etc/fail2ban/jail.local
#
# JAILS
#

#
# خوادم SSH
#

[sshd]

# لاستخدام وضع sshd الأكثر عدوانية ، قم بتعيين معلمة التصفية "mode" في jail.local:
# عادي (افتراضي) ، ddos ، إضافي أو عدواني (يجمع بين الجميع).
# انظر إلى "tests/files/logs/sshd" أو "filter.d/sshd.conf" لمثال على الاستخدام والتفاصيل.
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

بعض الإعدادات الأخرى التي تم تعيينها هنا هي filter التي ستُستخدم لتحديد ما إذا كانت سطرًا في السجل يشير إلى فشل في المصادقة و logpath الذي يخبر fail2ban أين تقع السجلات لتلك الخدمة المعينة.

قيمة filter هي في الواقع إشارة إلى ملف يقع في الدليل /etc/fail2ban/filter.d، مع إزالة امتداد .conf الخاص به. تحتوي هذه الملفات على تعابير منتظمة (اختصار شائع لتحليل النص) التي تحدد ما إذا كان السطر في السجل هو محاولة فشل في المصادقة. لن نغطي هذه الملفات بشكل مفصل في هذا الدليل، لأنها معقدة إلى حد ما وتتطابق الإعدادات المحددة مع السطور المناسبة بشكل جيد.

ومع ذلك، يمكنك أن ترى أي نوع من المرشحات متاحة من خلال النظر في هذا الدليل:

  1. ls /etc/fail2ban/filter.d

إذا رأيت ملفًا يبدو مرتبطًا بخدمة تستخدمها، يجب عليك فتحه باستخدام محرر نصوص. معظم الملفات معتمدة بشكل جيد ويجب أن تتمكن على الأقل من معرفة نوع الشرط الذي صمم النص البرمجي للحماية ضده. معظم هذه المرشحات لها أقسام مناسبة (معطلة) في ملف jail.conf يمكننا تمكينها في ملف jail.local إذا رغبنا في ذلك.

على سبيل المثال، تخيل أنك تخدم موقع ويب باستخدام Nginx وتدرك أن جزءًا محميًا بكلمة مرور من موقعك يتعرض لمحاولات تسجيل الدخول بشكل متكرر. يمكنك أن تخبر fail2ban بأن يستخدم ملف nginx-http-auth.conf للتحقق من هذا الشرط داخل ملف /var/log/nginx/error.log.

هذا مُعدّ بالفعل في قسم يُسمى [nginx-http-auth] في ملف /etc/fail2ban/jail.conf الخاص بك. ستحتاج فقط إلى إضافة المعلمة enabled:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

عند الانتهاء من التحرير، احفظ وأغلق الملف. إذا كنت تستخدم vi، استخدم :x للحفظ والخروج. في هذه النقطة، يمكنك تمكين خدمة Fail2ban حتى تعمل تلقائيًا من الآن فصاعدًا. أولاً، قم بتمكينها يدويًا باستخدام systemctl enable:

  1. sudo systemctl enable fail2ban

ثم، قم بتشغيلها يدويًا للمرة الأولى باستخدام systemctl start:

  1. sudo systemctl start fail2ban

يمكنك التحقق من أنها تعمل باستخدام systemctl status:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled 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.6 -s /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. يمكنك محاولة الاتصال باستخدام اسم غير موجود:

  1. ssh blah@your_server

أدخل أحرف عشوائية في نافذة كلمة المرور. كرّر هذا بضع مرات. في نقطة ما، يجب أن يتغير الخطأ الذي تتلقاه من Permission denied إلى Connection refused. هذا يشير إلى أن خادمك الثاني قد تم حظره من خادم Fail2ban.

على خادم Fail2ban الخاص بك، يمكنك رؤية القاعدة الجديدة عن طريق التحقق من مخرجات fail2ban-client. fail2ban-client هو أمر إضافي يوفره Fail2ban لفحص تكوينه الحالي.

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

إذا قمت بتشغيل fail2ban-client status sshd، يمكنك رؤية قائمة العناوين IP التي تم حظرها من SSH:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

محتويات قائمة العناوين IP المحظورة يجب أن تعكس عنوان IP الخاص بالخادم الثاني الخاص بك.

الاستنتاج

يجب أن تكون الآن قادرًا على تكوين بعض سياسات الحظر لخدماتك. يعتبر Fail2ban طريقة مفيدة لحماية أي نوع من الخدمات التي تستخدم المصادقة. إذا كنت ترغب في معرفة المزيد حول كيفية عمل fail2ban، يمكنك مراجعة البرنامج التعليمي الخاص بنا حول كيفية عمل قواعد وملفات fail2ban.

بالنسبة للمعلومات حول كيفية استخدام fail2ban لحماية خدمات أخرى، يمكنك قراءة حول كيفية حماية خادم Nginx باستخدام Fail2Ban و كيفية حماية خادم Apache باستخدام Fail2Ban.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8