איך פייל2באן עובד כדי להגן על שירותים בשרת לינוקס

הקדמה

SSH הוא השיטה הנפוצה ביותר להתחברות לשרת ענן. זה חזק, והוא נרחב – ככל שתקני ההצפנה החדשים מתפתחים, ניתן להשתמש בהם ליצירת מפתחות SSH חדשים, מבטיח שהפרוטוקול היסודי יישאר מאובטח. אך עם זאת, אין פרוטוקול או מחסנית תוכנה הולמים באופן מוחלט, והיות ו-SSH מוצג בכל רחבי האינטרנט, זה מהווה פני מתקפה נמרצת מאוד או וקטור תקפה נמרץ דרךו ניתן לנסות להשיג גישה.

כל שירות המוצג לרשת הוא מטרת יעד פוטנציאלית בדרך זו. אם תבדוק את הלוגים של השירות SSH שלך הפועל על כל שרת תעבודה רחב מקום, תראה לעתים קרובות ניסיונות כניסה מחוזקים ומתוכנתים שמייצגים התקפות כוח כובד משתמשים ורובוטים כאחד. למרות שניתן לבצע אופטימיזציות מסוימות בשירות ה-SSH שלך כדי להפחית את הסיכוי להצלחת התקפות אלו לקרוב לאפס, כגון השבתת האימות באמצעות סיסמאות לטובת מפתחות SSH, הן עדיין יכולות להיות חייבות מינוריות, נמשכות.

התקנות בממד גדול שבהן אחריות זו אינה מתקבלת בכלליות יממשו VPN כמו WireGuard לפני שירות SSH שלהם, כך שיהיה בלתי אפשרי להתחבר ישירות לפורט SSH המוגדר כברירת מחדל 22 מהאינטרנט החיצוני ללא החסימה תוכנה נוספת או שערים. פתרונות VPN אלה מקובלים באופן רחב, אך יכולים להוסיף מורכבות ולפגוע בתהליכים אוטומטיים או סקורצים תוכנה קטנים נוספים.

לפני או בנוסף להתחייבות להגדרת VPN מלאה, ניתן ליישם כלי בשם Fail2ban. Fail2ban יכול להפחית באופן משמעותי תקיפות כוח גולמיות על ידי יצירת כללים שמשנים את תצורת הגימור שלך בצורה אוטומטית לחסום כתובות IP ספציפיות לאחר מספר מסוים של ניסיונות התחברות כושלים. זה יאפשר לשרת שלך להחזיק בעצמו נגד ניסיונות הגישה הללו בלי עזרה ממך.

במדריך נוסף, דנו באיך להגן על SSH עם Fail2ban. במדריך זה, נדון בעומק יותר באיך Fail2ban פועל בפועל וכיצד אפשר להשתמש בידע זה כדי לשנות או להרחיב את ההתנהגות של שירות זה.

יסודות של Fail2ban

המטרה של Fail2ban היא לפקוח ביומני רישום של שירותים נפוצים כדי לזהות תבניות בכישלונות באימות.

כאשר fail2ban מוגדר לניטור את הלוגים של שירות מסוים, הוא מביט ב- פילטר שהוגדר באופן ספציפי לשירות זה. הפילטר מיועד לזיהוי כישלונות אימות עבור השירות הספציפי הזה באמצעות שימוש בביטויים רגולריים מורכבים. ביטויים רגולריים הם שפת תבניות נפוצה המשמשת לדיוק מבני. זה מגדיר את תבניות ביטויים אלו לתוך משתנה פנימי בשם failregex.

כברירת מחדל, Fail2ban כולל קבצי פילטר לשירותים נפוצים. כאשר לוג מכל שירות, כמו שרת אינטרנט, תואם את ה- failregex בפילטר שלו, נתבצע פעולה מוגדרת מראש עבור השירות ההוא. ה- action הוא משתנה שניתן להגדיר לעשות מגוון של דברים שונים, תלוי בהעדפות המנהל.

הפעולה המוגדרת מראש היא לחסום את המארח/כתובת ה-IP המפרה על ידי שינוי כללי חומת האש המקומית. ניתן להרחיב את הפעולה הזו, לדוגמה, לשלוח אימייל למנהל המערכת.

באופן כברירת מחדל, פעולה תיעשה כאשר שלושה כישלונות אימות הופכים נראים תוך 10 דקות, וזמן החסימה ברירת המחדל הוא 10 דקות. זה ניתן להגדרה.

בעת שימוש בגרסת ה- iptables ברירת המחדל, fail2ban יוצר סט חדש של כללי חומת אש, שגם נקראים שרשרת, כאשר השירות מופעל. הוא מוסיף כלל חדש לשרשרת ה- INPUT ששולח את כל תעבורת ה- TCP המופנית ליציאה 22 לשרשרת החדשה. בשרשרת החדשה, הוא מכניס כלל יחיד שחוזר לשרשרת ה- INPUT. השרשרת והכללים הקשורים איתה נמחקים אם שירות ה-Fail2ban מופסק.

סיור בהגדרות שירות Fail2ban

Fail2ban מוגדר דרך מספר קבצים הממוקמים במערכת הקבצים המקוונת תחת הספרייה /etc/fail2ban/.

הקובץ fail2ban.conf מגדיר מספר הגדרות פעולתיות כגון הדרך שבה השרת מפעיל יומני מידע, והקובץ גנרי והקובץ pid שבו ישתמש. ההגדרה הראשית, אך, מפורטת בקבצים המגדירים את ה"כלאים" היישומיים לפי כל אחד.

באופן ברירת מחדל, fail2ban מגיע עם קובץ jail.conf. אולם, ניתן לדרוס זאת בעת עדכונים, לכן יש להעתיק את הקובץ הזה לקובץ jail.local ולבצע התאמות שם.

אם כבר קיים לך קובץ jail.local, פתח אותו באמצעות nano או העורך הטקסט שלך:

  1. sudo nano /etc/fail2ban/jail.local

אם אין לך קובץ jail.local כבר, או שהקובץ שפתחת היה ריק, העתק את הקובץ jail.conf ואז פתח את הקובץ החדש:

  1. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  2. sudo nano /etc/fail2ban/jail.local

נבחן את האפשרויות הזמינות כאן ונראה כיצד קובץ זה מתקשר עם קבצי ההגדרה האחרים במערכת.

הקטע הברירת מחדל

החלק הראשון של הקובץ יגדיר את הברירות המחדל של מדיניות fail2ban. אפשרויות אלו יכולות להתעלם בכל חלק הוגדרות בנפרד של השירות.

עם ההערות הוסרו, כל חלק הברירות המחדל נראה כמו כך:

/etc/fail2ban/jail.local
[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: פרמטר זה מזהה כתובות IP שצריכות להתעלם ממערכת האיסורים. כברירת מחדל, הוא נקבע להתעלמות מתעבורת המגיעה מהמכונה עצמה, כך שלא תמלאו את היומנים שלכם או תנעלו את עצמכם מחוץ.
  • bantime: פרמטר זה מגדיר את אורך האיסור, בשניות. הברירה היא 10 דקות.
  • findtime: פרמטר זה מגדיר את החלון שבו Fail2ban ישים לב לנסיונות התפרצות נכשלים חוזרים. הברירה היא לקבוע את 10 הדקות האחרונות, כלומר התוכנה תספור את מספר הנסיונות הנכשלים ב-10 דקות האחרונות.
  • maxretry: מגדיר את מספר הנסיונות הנכשלים שיתקבלו בתוך חלון ה-findtime לפני שאיסור ייכנס לתוקף.
  • backend: הכנסת זאת מפרטת כיצד Fail2ban ימונה את קבצי היומנים. ההגדרה של auto אומרת ש-Fail2ban תנסה את pyinotify, אז gamin, ואז אלגוריתם סקר בהתבסס על מה שזמין. inotify הוא תכונה מובנית בלינוקס לגשת לכאשר קבצים נגישים, ו־pyinotify הוא ממשק פייתון ל־inotify, המשמש על ידי Fail2ban.
  • usedns: זה מגדיר האם DNS ההפוך משמש להטבעת איסורים. הגדרה זו ל"לא" תאפשר איסור כתובות IP בלבד במקום שמות מארחי דומיין. הגדרת warn תנסה לחפש שם מארח ולאסור בדרך זו, אך תירשם הפעילות לצורך סקירה.
  • destemail: זהו הכתובת שתשלח התראות בדוא"ל אליה אם הגדרת את הפעולה שלך לשלוח התראות בדוא"ל.
  • sendername: ישמש בשדה הדוא"ל מכתובת דוא"ל עבור התראות שנוצרו
  • banaction: זה מגדיר את הפעולה שתשמש כאשר תגיע לאחריות הסף. זה פועל בעצם כניסה לקובץ הנמצא בנתיב /etc/fail2ban/action.d/ בשם iptables-multiport.conf. מטפל בשינויי הגזיר של כתובת IP. נבחן את זה מאוחר יותר.
  • mta: זהו סוכן העברת דוא"ל שישמש לשליחת התראות בדוא"ל.
  • protocol: זהו סוג התעבורה שתושלך כאשר איסור כתובת IP מיושם. זהו גם סוג התעבורה שנשלחת אל השרשרת החדשה של iptables.
  • chain: זו השרשרת שתוגדר עם כלל קפיצה לשליחת תעבורה למרכז של fail2ban.

הפרמטרים הנותרים מגדירים פעולות שונות שניתן לציין. הם מעבירים חלק מהפרמטרים שהגדרנו לעיל באמצעות החלפת משתנים בתוך מחרוזות טקסט כמו זו:

%(שם_משתנה)s

השורה למעלה תוחלף בתוכן של var_name. באמצעות זה, אנו יכולים לקבוע שהמשתנה action מוגדר להגדרת action_ כברירת מחדל (איסור בלבד, ללא התראות בדואר).

כך, בתור תצורה זו מוגדרת על ידי קריאה לפעולת iptables-multiport עם רשימת פרמטרים (שם שירות, פתחה, פרוטוקול ושרשרת) הנדרשים לביצוע האיסור. __name__ מוחלף עם שם השירות כפי שצוין על ידי כותרות הקטעים למטה.

קטעי שירות מסוימים

מתחת לקטע הברירת מחדל, קיימים קטעים עבור שירותים מסוימים שניתן להשתמש בהם כדי לדרוס את ההגדרות הברירת מחדל. זה עוקב אחר תחביר של שינוי רק בפרמטרים שונים מערכתיים (אמירת תקנה מעל הגדרה).

כותרת כל קטע מוגדרת כך:

[שם_שירות]

כל קטע שיש לו את השורה enabled = true יקרא ויהיה מאופשר.

בתוך כל קטע, הפרמטרים מוגדרים, כולל קובץ הסינון שצריך להשתמש בו כדי לפענח את הלוגים (ללא סיומת הקובץ) ומיקום הקבצים המשמשים כלוגים עצמם.

בתוך כך, הקטע שמציין את הפעולות עבור שירות SSH נראה כך:

/etc/fail2ban/jail.local
[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] צריכות להיות כלליות וגמישות. בשימוש בהחלפת פרמטרים יחד עם פרמטרים המספקים ברירות מחדל נבנה אפשרות לדרוס את ההגדרות כאשר נדרש.

בדיקת קובץ הסינון

על מנת להבין מה קורה בתצורה שלנו, אנו צריכים להבין את קבצי הסינון והפעולה, שבהם נעשה רוב העבודה.

הקובץ הסנן יקבע את השורות שבהן יחפש פיילטו־באן בקבצי היומן כדי לזהות מאפיינים של פושע. קובץ הפעולה מיישם את כל הפעולות הדרושות, מבני האש שבעת ההתחלה של השירות, דרך הוספת ומחיקת כללים, ועד להרסת בניית האש בעת עצירת השירות.

בואו נסתכל על קובץ הסנן ששירות ה־SSH שלנו קרא לו בהגדרה לעיל:

  1. sudo nano /etc/fail2ban/filter.d/sshd.conf
/etc/fail2ban/sshd.conf
[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 עשויות להיראות משהו כזה:

/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, שכרגע ריק. ניתן להשתמש בו כדי לאפשר התעלמות מתבניות ספציפיות יותר שבדרך כלל יתאימו למצב של כישלון במקרה שתרצה לשלול את הגורם שמפעיל את פקודת הנכילה עבור מקרים מסוימים. לא נערוך זאת.

שמור וסגור את הקובץ כאשר תסיים לבחון אותו.

בדיקת קובץ הפעולה

עכשיו, בואו נסתכל על קובץ הפעולה. קובץ זה אחראי להגדרת הגנת הגדרה עם מבנה המאפשר שינויים לחסימת מארחים זדוניים, ולהוספה והסרה של אותם מארחים כפי הצורך.

הפעולה שהשירות שלנו של SSH קוראת אליה נקראת iptables-multiport. פתחו את הקובץ המשויך כעת:

  1. sudo nano /etc/fail2ban/action.d/iptables-multiport.conf

עם ההערות הוסרו, הקובץ נראה משהו כזה:

/etc/fail2ban/action.d/iptables-multiport.conf
[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, שמגדיר את ההגבלה שתופעל כאשר לקוח נאסר. ברירת המחדל היא לדחות חבילות ולהשיב לפינגים שנשלחו על ידי לקוחות נאסרים עם הודעת דחייה כי היציאה אינה נגישה. נשתמש בזה בכללי האיסורים שלנו למטה.

באמצעות זה, אנו מגיעים להגדרות הכללים עצמם. פעולת actionstart מגדירה את חומת האש של iptables כאשר שירות fail2ban מתחיל. היא יוצרת שרשרת חדשה, מוסיפה כלל לשרשרת זו לחזור לשרשרת הקוראת, ואז מכניסה כלל בתחילת שרשרת ה-INPUT שמעבירה תעבורה התואמת את הפרוטוקול הנכון ויעדי היציאה ליצירת השרשרת החדשה.

היא עושה זאת על ידי שימוש בערכים שעברנו עם הפעולה שהגדרנו בקובץ jail.local שלנו. ה- name נלקח מכותרת הסעיף של כל שירות. ה- chain, protocol, ו־ port נלקחים משורת הפעולה עצמה בקובץ זה.

כאן, כל הפרמטרים שמוגדרים על ידי הקובץ האחר מתייחסים על ידי כלול של שם הפרמטר בזוויות:

&lt;param_name&gt;

כאשר אנו יורדים להגדרת actionstop המלווה, אנו רואים שפקודות חומת האש מיישמות היפוך של הפקודות של actionstart. כאשר שירות Fail2ban נעצר, הוא מסיר בצורה נקיה כל כללי החומה שהוסיף.

פעולה נוספת בשם actioncheck מוודאה שהשרשרת המתאימה נוצרה לפני שניסיון להוסיף כללי איסור.

לאחר מכן, אנו מגיעים אל כלל האיסור האמיתי, הנקרא actionban. כלל זה פועל על ידי הוספת כלל חדש לשרשרת שנוצרה על ידינו. הכלל מתאים לכתובת ה-IP מקור של הלקוח המפר את הכלל – פרמטר זה נקרא מיומן ההרשאות כאשר המגבלה maxretry מתקיימת. הוא מיישם את החסימה המוגדרת על ידי הפרמטר 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" נמסר רגיל את ערך המשתנה המיוחד __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 על Ubuntu 22.04.

Source:
https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server