كيفية حماية SSH باستخدام Fail2Ban على Ubuntu 20.04

المقدمة

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

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

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

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

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

المتطلبات المسبقة

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

  • خادم Ubuntu 20.04 ومستخدم غير جذري يمتلك صلاحيات sudo. يمكنك معرفة المزيد حول كيفية إعداد مستخدم يمتلك هذه الصلاحيات في دليلنا إعداد الخادم الأولي مع Ubuntu 20.04.

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

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

Fail2ban متوفر في مستودعات البرمجيات الخاصة بـ Ubuntu. ابدأ بتشغيل الأوامر التالية كمستخدم غير جذري لتحديث قوائم الحزم وتثبيت Fail2ban:

  1. sudo apt update
  2. sudo apt install fail2ban

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

  1. systemctl status fail2ban.service
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:

  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

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

  1. sudo nano 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 إلى جهة اتصال الإساءة المتعلقة بعنوان 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 تحت العنوان، مع إعداداتها الأخرى.

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

بشكل افتراضي، يتم تمكين خدمة SSH وتعطيل جميع الخدمات الأخرى.
.
بعض الإعدادات الأخرى التي تم تعيينها هنا هي 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
. . .

عند الانتهاء من التحرير، احفظ وأغلق الملف. في هذا الوقت، يمكنك تمكين خدمة 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: enab> Active: active (running) since Tue 2022-06-28 19:29: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 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service. Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

في الخطوة التالية، ستقوم بتجربة Fail2ban في العمل.

الخطوة 3 — اختبار سياسات الحظر (اختياري)

من خادم آخر، واحد لن يحتاج إلى تسجيل الدخول إلى خادم Fail2ban في المستقبل، يمكنك اختبار القواعد من خلال حظر ذلك الخادم الثاني. بعد تسجيل الدخول إلى الخادم الثاني، حاول الاتصال بخادم Fail2ban عبر SSH. يمكنك محاولة الاتصال باستخدام اسم غير موجود:

  1. ssh blah@your_server

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

على خادم Fail2ban الخاص بك، يمكنك رؤية القاعدة الجديدة عن طريق فحص مخرجات iptables. iptables هو أمر للتفاعل مع القواعد المنخفضة المستوى للمنافذ وجدار الحماية على خادمك. إذا قمت باتباع دليل DigitalOcean لإعداد الخادم الأولي، فستكون تستخدم ufw لإدارة قواعد جدار الحماية على مستوى أعلى. تشغيل iptables -S سيعرض لك جميع قواعد جدار الحماية التي أنشأتها ufw بالفعل:

  1. sudo iptables -S
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:

  1. sudo iptables -S | grep f2b
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-20-04