المقدمة
SSH هو الطريقة القياسية للاتصال بخادم سحابي. إنه دائم وقابل للتوسيع – حيث يمكن استخدام معايير التشفير الجديدة لتوليد مفاتيح SSH جديدة، مما يضمن استمرار أمان البروتوكول الأساسي. ومع ذلك، لا يوجد بروتوكول أو مكدس برمجيات خالٍ تمامًا من الأخطاء، وبما أن SSH منتشر على نطاق واسع عبر الإنترنت، فإنه يمثل سطح هجوم متوقعًا جدًا أو ناقل هجومي من خلاله يمكن للأشخاص محاولة الوصول. سطح الهجوم أو ناقل الهجوم .
أي خدمة معرضة للشبكة تكون هدفًا محتملًا بهذه الطريقة. إذا قمت بمراجعة السجلات لخدمة SSH الخاصة بك التي تعمل على أي خادم يتم تداوله بشكل واسع، فسترى في كثير من الأحيان محاولات تسجيل دخول متكررة ومنهجية تمثل هجمات قوة الضغط من قبل المستخدمين والروبوتات على حد سواء. على الرغم من أنه يمكنك إجراء بعض الأمانيات لخدمة SSH الخاصة بك لتقليل فرص نجاح هذه الهجمات إلى القرب من الصفر، مثل تعطيل مصادقة كلمة المرور لصالح مفاتيح SSH، فإنها ما زالت يمكن أن تشكل مسؤولية طفيفة مستمرة.
النشرات الإنتاجية بمقياس كبير والتي تعتبر هذه المسؤولية غير مقبولة تمامًا عادةً ما تنفذ شبكة خاصة افتراضية مثل WireGuard أمام خدمة SSH الخاصة بها، بحيث يكون من المستحيل الاتصال مباشرة بالمنفذ الافتراضي لخدمة SSH وهو المنفذ 22 من الإنترنت الخارجي بدون برامج تجريد إضافية أو بوابات. تُثق هذه الحلول بشكل واسع، ولكنها قد تزيد من التعقيد وقد تؤدي إلى تعطيل بعض التلقائيات أو سناريوهات البرمجيات الصغيرة الأخرى.
قبل الالتزام بإعداد شبكة خاصة افتراضية كاملة أو بالإضافة إليها، يمكنك تنفيذ أداة تُدعى Fail2ban. يمكن لـ Fail2ban التقليل بشكل كبير من هجمات الوصول غير المشروعة عن طريق إنشاء قواعد تقوم تلقائيًا بتعديل تكوين جدار الحماية الخاص بك لحظر عناوين IP محددة بعد عدد معين من محاولات تسجيل الدخول الناجحة. سيتيح ذلك لخادمك تقوية نفسه ضد محاولات الوصول هذه بدون تدخل منك.
في درس آخر، تحدثنا عن كيفية حماية SSH باستخدام Fail2ban. في هذا الدليل، سنناقش بمزيد من التفصيل كيفية عمل Fail2ban فعليًا وكيف يمكنك استخدام هذه المعرفة لتعديل أو توسيع سلوك هذه الخدمة.
أساسيات Fail2ban غرض Fail2ban هو مراقبة سجلات الخدمات الشائعة لاكتشاف أنماط في فشل المصادقة.
غرض Fail2ban هو مراقبة ملفات تسجيل الخدمات الشائعة للكشف عن أنماط في فشل التوثيق.
عندما يتم تكوين fail2ban لمراقبة ملفات تسجيل خدمة، فإنه ينظر إلى مرشح تم تكوينه خصيصًا لتلك الخدمة. يتم تصميم المرشح لتحديد فشل التوثيق لتلك الخدمة المحددة من خلال استخدام تعبيرات منتظمة معقدة. التعبيرات المنتظمة هي لغة تخطيط شائعة الاستخدام لمطابقة الأنماط. يعرّف هذه الأنماط العادية التعبيرات إلى متغير داخلي يسمى failregex
.
بشكل افتراضي، يشتمل Fail2ban على ملفات مرشح للخدمات الشائعة. عندما يتطابق سجل من أي خدمة، مثل خادم الويب، مع failregex
في مرشحها، يتم تنفيذ إجراء محدد مسبقًا لتلك الخدمة. الإجراء
هو متغير يمكن تكوينه للقيام بأمور مختلفة، اعتمادًا على تفضيلات المسؤول الأساسي.
الإجراء الافتراضي هو حظر المضايق/عنوان IP غير المشروع من خلال تعديل قواعد الحماية المحلية. يمكنك توسيع هذا الإجراء على سبيل المثال، إرسال بريد إلكتروني إلى مسؤول النظام.
بشكل افتراضي، سيتم اتخاذ الإجراء عندما يتم الكشف عن ثلاثة فشل في التوثيق في 10 دقائق، والوقت الافتراضي للحظر هو لمدة 10 دقائق. يمكن تكوين هذا.
عند استخدام جدار الحماية iptables
الافتراضية، يقوم fail2ban
بإنشاء مجموعة جديدة من قواعد جدار الحماية، وتسمى أيضًا سلسلة، عند بدء الخدمة. يضيف قاعدة جديدة إلى سلسلة INPUT ترسل جميع حركة المرور TCP الموجهة إلى المنفذ 22 إلى السلسلة الجديدة. في السلسلة الجديدة، يضع قاعدة واحدة تعود إلى سلسلة INPUT. يتم إزالة السلسلة والقواعد المرتبطة إذا توقفت خدمة Fail2ban.
استكشاف إعدادات خدمة Fail2ban
يتم تكوين Fail2ban من خلال العديد من الملفات الموجودة ضمن تسلسل أسفل الدليل /etc/fail2ban/
.
يتوفر الملف fail2ban.conf
لتكوين بعض الإعدادات التشغيلية مثل الطريقة التي تسجل بها المعلومات على مستوى التشغيل، وملف الصدى وملف المعالج الذي سيستخدمه. ومع ذلك، يتم تحديد التكوين الرئيسي في الملفات التي تحدد “السجون” حسب التطبيق.
بشكل افتراضي، يأتي Fail2ban مع ملف jail.conf
. ومع ذلك، يمكن أن يتم التعامل مع هذا الملف في التحديثات، لذا يجب عليك نسخ هذا الملف إلى ملف jail.local
والقيام بتعديلات هناك.
إذا كان لديك بالفعل ملف jail.local
، فاجعله مفتوحًا باستخدام nano
أو محرر النص المفضل لديك:
إذا لم يكن لديك ملف jail.local
بالفعل، أو كان الملف الذي فتحته فارغًا، فانسخ ملف jail.conf
ثم افتح الملف الجديد:
سنلقي نظرة على الخيارات المتاحة هنا ونرى كيف يتفاعل هذا الملف مع ملفات التكوين الأخرى على النظام.
القسم الافتراضي
ستعرض الجزء الأول من الملف الافتراضيات لسياسة fail2ban. يمكن تجاوز هذه الخيارات في قسم تكوين كل خدمة فردية.
بإزالة التعليقات، يبدو القسم الافتراضي بأكمله هكذا:
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 10m
findtime = 10m
maxretry = 3
backend = auto
usedns = warn
destemail = root@localhost
sendername = Fail2Ban
banaction = iptables-multiport
mta = sendmail
protocol = tcp
chain = INPUT
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
action = %(action_)s
دعونا نناقش معنى بعض هذا:
- ignoreip: يحدد هذا المعامل عناوين الأيبي التي يجب تجاهلها من قبل نظام الحظر. افترض هذا فقط تجاهل الحركة القادمة من الجهاز نفسه ، حتى لا تملأ سجلاتك أو تقطع نفسك.
- bantime: يحدد هذا المعامل طول الحظر ، بالثواني. الافتراضي هو 10 دقائق.
- findtime: يحدد هذا المعامل الإطار الذي ستنتبه إليه Fail2ban عند البحث عن محاولات تأشيرة تفاعلية خاسرة. تم تعيين الافتراضي إلى 10 دقائق ، مما يعني أن البرنامج سيعد عدد المحاولات الفاشلة في السنتين الماضية 10.
- maxretry: يحدد هذا عدد المحاولات الفاشلة التي سيتعامل معها ضمن نافذة
findtime
قبل إصدار حظر. - usedns: هذا يحدد ما إذا كان يتم استخدام DNS العكسي للمساعدة في تنفيذ الحظر. تعيين هذا إلى “لا” سيحظر عناوين IP نفسها بدلاً من أسماء المضيفين النطاقات الخاصة بها. إعداد
warn
سيحاول البحث عن اسم مضيف وحظر بهذه الطريقة، ولكن سيتم تسجيل النشاط للمراجعة. - destemail: هذا هو العنوان الذي سيتم إرسال البريد الإلكتروني له إذا تم تكوين إجراءك لإرسال تنبيهات بالبريد.
- sendername: سيتم استخدام هذا في حقل البريد الإلكتروني للرسائل التنبيهية المُنشأة
- banaction: يحدد الإجراء الذي سيتم استخدامه عند الوصول إلى العتبة. في الواقع، هذا مسار إلى ملف موجود في
/etc/fail2ban/action.d/
يُسمىiptables-multiport.conf
. يتعامل هذا الملف مع عمليات التلاعب الفعلية في جدار الحماية iptables لحظر عنوان IP. سننظر في ذلك لاحقًا. - mta: هذا هو وكيل نقل البريد الذي سيُستخدم لإرسال رسائل البريد الإلكتروني التنبيهية.
- protocol: هذا هو نوع حركة المرور التي ستتم إسقاطها عند تنفيذ حظر IP. هذا أيضًا نوع حركة المرور التي يتم إرسالها إلى سلسلة iptables الجديدة.
- chain: هذه هي السلسلة التي ستتم تكوينها بقاعدة قفز لإرسال حركة المرور إلى قادوس fail2ban.
بقية المعلمات تحدد إجراءات مختلفة يمكن تحديدها. يتم تمرير بعض المعلمات التي قمنا بتعريفها أعلاه باستخدام استبدال المتغيرات داخل سلاسل النص مثل هذا: %(var_name)s
- سلسلة: هذه هي السلسلة التي سيتم تكوينها مع قاعدة تجاوز لإرسال المرور إلى قناة فيل2بان.
تعرض باقي المعلمات إجراءات مختلفة يمكن تحديدها. يمررون ببعض المعلمات التي حددناها أعلاه باستخدام استبدال المتغير داخل سلاسل النص مثل هذا:
<كود>%(var_name)s
سيتم استبدال السطر أعلاه بمحتويات <كود>var_name. باستخدام هذا، يمكننا أن نرى أن المتغير <كود>action معين بشكل افتراضي إلى <كود>action_ (فقط حظر، لا إشعارات برسائل البريد).
هذا بدوره يتم تكوينه باستدعاء إجراء <كود>iptables-multiport مع قائمة من المعلمات (اسم الخدمة، المنفذ، البروتوكول، والسلسلة) التي تلزم لإجراء الحظر. <كود>__name__ يستبدل باسم الخدمة كما هو محدد بواسطة الرؤوس الفرعية أدناه.
الفصول الخاصة بالخدمات
تحت القسم الافتراضي، هناك أقسام لخدمات محددة يمكن استخدامها لتجاوز الإعدادات الافتراضية. يتبع هذا مبدأ التغيير فقط في المعلمات التي تختلف عن القيم العادية (الترتيبية على التكوين).
يتم تحديد كل رأس فرعي على النحو التالي:
<كود>[service_name]
أي قسم يحتوي على السطر <كود>enabled = true سيتم قراءته وتمكينه.
في كل قسم، يتم تكوين المعلمات، بما في ذلك ملف المرشح الذي يجب استخدامه لتحليل السجلات (بدون امتداد الملف) وموقع الملفات الذي يحتوي على السجلات نفسها.
بالأخذ هذا في الاعتبار، يبدو القسم الذي يحدد الإجراءات لخدمة SSH هكذا:
[SSH]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
هذا يمكّن هذا القسم ويضع المنفذ على المنفذ الافتراضي “ssh” (المنفذ 22). يأمر Fail2ban بالبحث في السجل الموجود في /var/log/auth.log
لهذا القسم وتحليل السجل باستخدام آليات التصفية المحددة في الدليل /etc/fail2ban/filters.d
في ملف يسمى sshd.conf
.
يتم أخذ جميع المعلومات الأخرى التي يحتاجها من المعلمات المحددة في القسم [DEFAULT]
. على سبيل المثال، سيتم تعيين الإجراء إلى action_
الذي سيحظر عنوان IP المخالف باستخدام إجراء الحظر iptables-multiport
، الذي يشير إلى ملف يسمى iptables-multiport.conf
الموجود في /etc/fail2ban/action.d
.
كما ترون، يجب أن يكون الإجراءات في القسم [DEFAULT]
عامة ومرنة. باستخدام استبدال المعلمات جنبًا إلى جنب مع المعلمات التي توفر القيم الافتراضية المعقولة، سيكون من الممكن تجاوز التعريفات عند الضرورة.
فحص ملف المرشح
من أجل فهم ما يحدث في تكويننا، نحتاج إلى فهم ملفات المرشح والإجراءات، التي تقوم بأهم العمل.
سيقوم ملف التصفية بتحديد السطور التي سيبحث فيها fail2ban في ملفات السجل لتحديد السمات المخالفة. ينفذ ملف الإجراء جميع الإجراءات المطلوبة، من بناء هيكل جدار الحماية عند بدء الخدمة، إلى إضافة وحذف القواعد، وتفكيك هيكل جدار الحماية عند توقف الخدمة.
لنلقِ نظرة على ملف التصفية الذي طلبته خدمتنا SSH في التكوين أعلاه:
[INCLUDES]
before = common.conf
[Definition]
_daemon = sshd
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via \S+)?\s*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
^%(__prefix_line)sFailed \S+ for .*? from <HOST>(?: port \d*)?(?: ssh\d*)?(: (ruser .*|(\S+ ID \S+ \(serial \d+\) CA )?\S+ %(__md5hex)s(, client user ".*", client host ".*")?))?\s*$
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUsers\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any group\s*$
^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroups\s*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
ignoreregex =
تُحدد رأس القسم [INCLUDES]
ملفات التصفية الأخرى التي يتم قراءتها قبل أو بعد هذا الملف. في مثالنا، يتم قراءة ملف common.conf
ووضعه قبل السطور الأخرى في هذا الملف. يتم ذلك لإعداد بعض المعلمات التي سنستخدمها في تكويننا.
بعد ذلك، لدينا قسم [Definition]
الذي يعرف القواعد الفعلية لمطابقات التصفية. أولاً، نقوم بتحديد اسم البرنامج الخدمي الذي نراقبه باستخدام المعلمة _daemon
.
بعد ذلك، نقوم بتحديد تعريف failregex
الفعلي، الذي يحدد الأنماط التي ستؤدي إلى التنبيه عند العثور على سطر مطابق في ملف السجل. هذه تعبيرات منتظمة تتطابق استنادًا إلى الأخطاء والفشل المختلفة التي يمكن أن تحدث عندما لا يتم التوثيق بشكل صحيح من قبل المستخدم.
سيتم استبدال أجزاء من السطر مثل %(__prefix_line)s
بقيمة معلمة تم إعدادها في ملف common.conf
الذي قمنا بتحميله. يُستخدم هذا لمطابقة المعلومات الرئيسية المختلفة التي تكتبها أنظمة التشغيل في ملفات السجل عند استخدامها للطرق القياسية. على سبيل المثال، قد تبدو بعض السطور من /var/log/auth.log
مثل هذا:
May 6 18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213
May 6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2
May 6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth]
الجزء المظلل هو نمط قياسي يقوم بإدراجه نظام التشغيل لتوفير سياق أكثر. بعد ذلك، هناك العديد من الطرق المختلفة التي يكتب بها خدمة جدار الحماية iptables محاولات الفشل إلى السجلات.
نرى فشلين منفصلين في السطور الأولين أعلاه (خطأ مصادقة PAM وخطأ في كلمة المرور). تم تصميم التعابير العادية المحددة في المرشح لتطابق أي من خطوط الفشل الممكنة. يجب عليك عدم ضبط أي من هذه الأسطر، لكن يجب عليك أن تكون على علم بالحاجة إلى التقاط جميع إدخالات السجل التي تدل على وجود خطأ في الاستخدام غير المصرح به للتطبيق الذي تحاول حمايته إذا كنت ستضطر يومًا ما إلى إنشاء ملف تصفية بنفسك.
في الجزء السفلي، يمكنك رؤية معلمة ignoreregex
، والتي فارغة حاليًا. يمكن استخدامها لاستبعاد أنماط أكثر تحديدًا تتطابق عادة مع حالة فشل في حالة رغبتك في عكس مؤشر الفشل لـ fail2ban لبعض السيناريوهات المعينة. لن نقوم بضبط هذا.
احفظ وأغلق الملف عندما تنتهي من فحصه.
فحص ملف الإجراء
الآن، دعنا نلقي نظرة على ملف الإجراء. هذا الملف مسؤول عن إعداد جدار الحماية بنية تسمح بالتعديلات لحظر المضيفين الخبيثين، ولإضافة وإزالة تلك المضيفين حسب الحاجة.
الإجراء الذي يستدعيه خدمتنا SSH يسمى iptables-multiport
. افتح الملف المرتبط الآن:
مع إزالة التعليقات، يبدو هذا الملف على هذا النحو:
[INCLUDES]
before = iptables-blocktype.conf
[Definition]
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
actioncheck = iptables -n -L <chain> | grep -a 'fail2ban-<name>[ \t]'
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>
actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>
[Init]
name = default
port = ssh
protocol = tcp
chain = INPUT
تبدأ الملف باستدعاء ملف إجراء آخر يُسمى iptables-blocktype.conf
الذي يحدد المعلمة blocktype
، التي تكوِّن القيد الذي سيتم تعيينه عند حظر العميل. بشكل افتراضي، تم تعيين blocktype
لرفض الحزم والرد على العلامات التي يرسلها العملاء المحظورون برسالة رفض تفيد بأن المنفذ غير متاح. سنستخدم هذا في قواعد الحظر أدناه.
بعد ذلك، نصل إلى تعريفات القواعد نفسها. يُعمل الإجراء actionstart
على إعداد جدار الحماية iptables عند بدء خدمة fail2ban. يُنشئ سلسلة جديدة، ويضيف قاعدة إلى تلك السلسلة للعودة إلى السلسلة المُستدعاة، ثم يقوم بإدراج قاعدة في بداية سلسلة الإدخال تمرر حركة المرور التي تطابق البروتوكول الصحيح ومنافذ الوجهات إلى السلسلة الجديدة.
يفعل ذلك عن طريق استخدام القيم التي مررنا بها مع الإجراء الذي قمنا بتعريفه في ملفنا jail.local
. يتم أخذ name
من عنوان القسم لكل خدمة. يتم أخذ chain
، protocol
، و port
من السطر الخاص بالإجراء في ذلك الملف.
هنا، يتم الإشارة إلى جميع المعلمات التي تم تعيينها بواسطة الملف الآخر عن طريق تضمين اسم المعلمة في الزوايا:
<param_name>
عندما ننتقل إلى تعريف الإجراء المرافق actionstop
، يمكننا أن نرى أن أوامر جدار الحماية تقوم بتنفيذ عكس الأوامر التي قامت بها actionstart
. عند إيقاف خدمة Fail2ban، يتم إزالة أي قواعد جدار حماية قامت بإضافتها بشكل نظيف.
إجراء آخر يُسمى actioncheck
يتأكد من أن السلسلة المناسبة قد تم إنشاؤها قبل محاولة إضافة قواعد الحظر.
بعد ذلك، نصل إلى قاعدة الحظر الفعلية، والتي تُسمى actionban
. تعمل هذه القاعدة عن طريق إضافة قاعدة جديدة إلى السلسلة التي قمنا بإنشائها. تتطابق القاعدة مع عنوان IP المصدر للعميل المخالف – يتم قراءة هذا المعلم من سجلات المصادقة عندما يتم الوصول إلى الحد الأقصى للمحاولات. يُفرض الحظر المحدد بواسطة المعلمة blocktype
التي حصلنا عليها في القسم [INCLUDE]
في أعلى الملف.
تُزيل قاعدة actionunban
هذه القاعدة. يتم ذلك تلقائيًا بواسطة fail2ban عندما ينتهي وقت الحظر.
أخيرًا، نصل إلى القسم [Init]
. يوفر هذا القسم بعض القيم الافتراضية في حالة استدعاء ملف الإجراء دون تمرير جميع القيم المناسبة.
كيفية معالجة خدمة Fail2ban لملفات التكوين لتنفيذ الحظر
الآن بعد أن رأينا التفاصيل، دعونا نتعرف على العملية التي تحدث عند بدء fail2ban.
تحميل ملفات التكوين الأولية
أولاً، يتم قراءة ملف الـfail2ban.conf
الرئيسي لتحديد الشروط التي يجب أن يعمل تحتها العملية الرئيسية. يقوم بإنشاء المقبس، وملفات الـpid والسجل إذا لزم الأمر ويبدأ في استخدامها.
ثم، يقوم fail2ban بقراءة ملف الـjail.conf
للحصول على تفاصيل التكوين. ويلي ذلك قراءة الملفات الموجودة في دليل الـjail.d
بالترتيب الأبجدي والتي تنتهي بامتداد .conf
. يضيف الإعدادات الموجودة في هذه الملفات إلى التكوين الداخلي الخاص به، مما يعطي القيم الجديدة الأفضلية على القيم الموجودة في ملف الـjail.conf
.
ثم، يبحث عن ملف الـjail.local
ويكرر هذه العملية، مع التكيف مع القيم الجديدة. وأخيرًا، يقوم بالبحث في دليل الـjail.d
مرة أخرى، وقراءة الملفات بالترتيب الأبجدي والتي تنتهي بامتداد .local
.
في حالتنا، لدينا فقط ملف الـjail.conf
وملف الـjail.local
. في ملف الـjail.local
، نحتاج فقط لتحديد القيم التي تختلف عن ملف الـjail.conf
. وبهذا، تمتلك عملية fail2ban مجموعة من التوجيهات المحملة في الذاكرة التي تمثل مزيجًا من جميع الملفات التي عثرت عليها.
يفحص كل قسم ويبحث عن توجيه enabled = true
. إذا وجد واحدًا، يستخدم المعلمات المحددة تحت هذا القسم لبناء سياسة وتحديد الإجراءات المطلوبة. أي معلمات لم يتم العثور عليها في قسم الخدمة تستخدم المعلمات المحددة في القسم [DEFAULT]
.
تحليل ملفات العمليات لتحديد الإجراءات الابتدائية
يبحث Fail2ban عن توجيه action
لمعرفة ما إذا كان سيتم استدعاء سكريبت العملية لتنفيذ سياسات الحظر/إلغاء الحظر. إذا لم يتم العثور على واحد، فإنه يستند إلى الإجراء الافتراضي المحدد أعلاه.
يتكون توجيه الإجراء من اسم ملف الإجراء(ات) التي سيتم قراءتها، بالإضافة إلى قاموس مفتاح-قيمة يمرر المعلمات اللازمة لتلك الملفات. تأخذ قيم هذه المعلمات عادة شكل استبدال المعلمات عن طريق الإشارة إلى الإعدادات المكونة في قسم الخدمة. يتم تمرير مفتاح “الاسم” عادةً بقيمة المتغير الخاص __name__
الذي سيتم تعيينه على قيمة رأس القسم.
ثم يستخدم Fail2ban هذه المعلومات للعثور على الملفات المرتبطة في دليل action.d
. يبحث أولاً عن ملف الإجراء المرتبط الذي ينتهي بـ .conf
ثم يعدل المعلومات الموجودة هناك بأي إعدادات تحتوي عليها ملف .local
المصاحب الذي يتم العثور عليه أيضًا في دليل action.d
.
يحلل تلك الملفات لتحديد الإجراءات التي يجب أن يتخذها. يقرأ قيمة actionstart
لرؤية الإجراءات التي يجب عليه اتخاذها لإعداد البيئة. غالبًا ما تتضمن هذه العملية إنشاء هيكل جدار ناري لاستيعاب قواعد الحظر في المستقبل.
الإجراءات المعرفة في هذا الملف تستخدم المعلمات التي تم تمريرها إليها من توجيه action
. ستستخدم هذه القيم لإنشاء القواعد المناسبة ديناميكيًا. إذا لم يتم تعيين متغير معين، يمكن أن ينظر إلى القيم الافتراضية المعينة في ملف الإجراء لملء الفجوات.
تحليل ملفات الفلترة لتحديد قواعد التصفية
تتضمن المعلمات للخدمة في ملفات jail.*
أيضًا موقع ملف السجل وكذلك آلية الاستطلاع التي يجب استخدامها لفحص الملف (وهذا محدد بواسطة المعلمة backend
). كما تتضمن مرشح يجب استخدامه لتحديد ما إذا كانت سطرًا في السجل يمثل فشلًا.
يبحث Fail2ban في دليل filter.d
للعثور على ملف الفلترة المطابق الذي ينتهي بامتداد .conf
. يقرأ هذا الملف لتعريف الأنماط التي يمكن استخدامها لمطابقة الأسطر المخالفة. ثم يبحث عن ملف فلترة مطابق ينتهي بامتداد .local
لرؤية ما إذا كانت قيم الافتراضي تمت كتابتها مرة أخرى.
يستخدم التعبيرات العادية المعرفة في هذه الملفات أثناء قراءة ملف سجل الخدمة. يجرب كل سطر failregex
المعرف في ملفات filter.d
ضد كل سطر جديد يتم كتابته في ملف سجل الخدمة.
إذا كان التعبير العادي يعيد مطابقة، يتحقق السطر من التعابير العادية المعرفة بواسطة ignoreregex
. إذا تطابقت أيضًا، يتجاهل fail2ban ذلك. إذا تطابق السطر مع تعبير في failregex
ولكن لم يتطابق مع تعبير في ignoreregex
، يتم زيادة العداد الداخلي للعميل الذي تسبب في السطر ويتم إنشاء الطابع الزمني المرتبط بالحدث.
عندما يتم الوصول إلى نافذة الزمن المحددة بواسطة المعلمة findtime
في ملفات jail.*
(كما يتم تحديده بواسطة الطابع الزمني للحدث)، يتم خفض العداد الداخلي مرة أخرى ولا يُعتبر الحدث مهمًا بعد الآن لسياسة الحظر.
إذا تم تسجيل مزيد من فشل المصادقة خلال الوقت، يزيد كل محاولة من العداد. إذا وصل العداد إلى القيمة المحددة بواسطة المعلمة maxretry
في نافذة الوقت المكونة، يفرض fail2ban حظرًا عن طريق استدعاء العمل actioncheck
للخدمة كما هو معرف في ملفات action.d/
للخدمة. هذا لتحديد ما إذا كان العمل actionstart
قد قام بإعداد الهيكل اللازم. ثم يستدعي العمل actionban
لحظر العميل المخالف. يضع الحدث طابع زمني أيضًا لهذا.
عند انقضاء الوقت المحدد الذي تم تحديده بواسطة المعلمة bantime
، يقوم fail2ban بإلغاء حظر العميل عن طريق استدعاء العمل actionunban
.
الختام
لديك الآن فهمٌ معمق نسبيًا لكيفية عمل fail2ban. عندما تنحرف عن التكوين القياسي، من المفيد أن تعرف كيفية عمل fail2ban لتلاعب سلوكه بطريقة متوقعة.
للتعرف على كيفية حماية خدمات أخرى باستخدام fail2ban، يمكنك قراءة كيفية حماية خادم Nginx باستخدام Fail2Ban على أوبونتو 22.04.