المقدمة
SSH هو الأسلوب القياسي للاتصال بخادم السحابة. إنه دائم، وهو قابل للتوسيع — حيث يمكن استخدام معايير التشفير الجديدة لإنشاء مفاتيح SSH جديدة، مما يضمن بقاء البروتوكول الأساسي آمنًا. ومع ذلك، لا يوجد بروتوكول أو مجموعة برمجيات لا يمكن اختراقها تمامًا، ونظرًا لانتشار SSH بشكل واسع عبر الإنترنت، فإنه يمثل سطح هجوم قابل للتنبؤ جدًا أو ناقل هجومي عبره يمكن للأشخاص محاولة الوصول من خلاله.
أي خدمة معرضة للشبكة هي هدف محتمل بهذه الطريقة. إذا قمت بمراجعة السجلات لخدمة SSH الخاصة بك التي تعمل على أي خادم مرور كبير، فسوف ترى في كثير من الأحيان محاولات تسجيل دخول متكررة ومنهجية تمثل هجمات القوة الغاشمة من قبل المستخدمين والروبوتات على حد سواء. على الرغم من أنه يمكنك إجراء بعض التحسينات على خدمة SSH الخاصة بك لتقليل احتمال نجاح هذه الهجمات إلى الصفر تقريبًا، مثل تعطيل مصادقة كلمة المرور لصالح مفاتيح SSH، إلا أنها ما زالت قد تشكل مسؤولية طفيفة مستمرة.
التنفيذات الكبيرة لمن لا يمكنهم قبول هذا المسؤولية بشكل تام عادةً ما ستقوم بتنفيذ شبكة خاصة افتراضية مثل WireGuard أمام خدمة SSH الخاصة بهم، بحيث يكون من المستحيل الاتصال مباشرة بمنفذ SSH الافتراضي 22 من خارج الإنترنت دون برمجيات تجريد إضافية أو بوابات. تعتمد هذه الحلول من الشبكة الخاصة الافتراضية على نطاق واسع، ولكنها ستضيف تعقيدًا، ويمكن أن تؤدي إلى كسر بعض الآليات أو غيرها من الأدوات البرمجية الصغيرة.
قبل أو بالإضافة إلى الالتزام بإعداد VPN كامل، يمكنك تنفيذ أداة تسمى Fail2ban. يمكن لـ Fail2ban التخفيف بشكل كبير من هجمات القوة الجبرية عن طريق إنشاء قواعد تقوم بتغيير تكوين جدار الحماية تلقائيًا لحظر عناوين IP محددة بعد عدد معين من محاولات تسجيل الدخول الفاشلة. سيتيح لك هذا للخادم أن يقوي نفسه ضد محاولات الوصول هذه دون تدخل منك.
في هذا الدليل، سترى كيفية تثبيت واستخدام Fail2ban على خادم Debian 11.
المتطلبات المسبقة
لإكمال هذا الدليل، ستحتاج إلى:
-
خادم Debian 11 ومستخدم غير جذري لديه امتيازات sudo. يمكنك معرفة المزيد حول كيفية إعداد مستخدم بهذه الامتيازات في دليلنا الإعداد الأولي للخادم مع Debian 11.
-
اختياريًا، خادم ثانٍ يمكنك الاتصال به من خادمك الأول، الذي ستستخدمه لاختبار حظر الوصول عن قصد.
الخطوة 1 — تثبيت Fail2ban
يتوفر Fail2ban في مستودعات البرامج لـ Debian. ابدأ بتشغيل الأوامر التالية كمستخدم غير جذري لتحديث قوائم الحزم الخاصة بك وتثبيت Fail2ban:
سيقوم Fail2ban تلقائيًا بإعداد خدمة خلفية بعد التثبيت. يمكنك التحقق من حالتها باستخدام الأمر systemctl
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
Active: active (running) since Tue 2022-06-28 16:23:14 UTC; 17s ago
Docs: man:fail2ban(1)
Process: 1942 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS
Main PID: 1943 (fail2ban-server)
Tasks: 5 (limit: 1132)
Memory: 15.8M
CPU: 280ms
CGroup: /system.slice/fail2ban.service
└─1943 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
يمكنك الاستمرار في استخدام 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.
# انظر الرجل 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_
أخرى مقدمة بشكل افتراضي يمكنك استبدال $(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
يفعل كل ذلك بالإضافة إلى إرسال تحديث إلى واجهة برمجة تطبيقات 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
:
في الخطوة التالية، ستقوم بتجربة عمل Fail2ban.
الخطوة 3 — اختبار سياسات الحظر (اختياري)
من خادم آخر، الذي لن يحتاج إلى تسجيل الدخول إلى خادم Fail2ban في المستقبل، يمكنك اختبار القواعد عن طريق حظر ذلك الخادم الثاني. بعد تسجيل الدخول إلى الخادم الثاني، حاول الاتصال بـ خادم Fail2ban عبر SSH. يمكنك محاولة الاتصال باستخدام اسم غير موجود:
أدخل أحرفًا عشوائية في مربع الرمز السري. كرر هذا عدة مرات. في نقطة ما، يجب أن يتغير الخطأ الذي تتلقاه من الإذن مرفوض
إلى الاتصال مرفوض
. هذا يشير إلى أن الخادم الثاني قد تم حظره من خادم 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 و كيفية حماية خادم Apache باستخدام Fail2Ban.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-11