כיצד להגן על SSH עם Fail2Ban על Ubuntu 22.04

הקדמה

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

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

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

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

במדריך זה, תראו איך להתקין ולהשתמש ב-Fail2ban על שרת Ubuntu 22.04.

דרישות מוקדמות

כדי להשלים את המדריך הזה, תצטרכו:

  • שרת Ubuntu 22.04 ומשתמש לא-רוט עם הרשאות sudo. ניתן ללמוד עוד על איך להגדיר משתמש עם הרשאות אלו במדריך שלנו הגדרת שרת ראשונית עם Ubuntu 22.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 לכתובת האימייל היעד.

action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# איסור ושליחת אימייל עם דוח WHOIS ושורות רלוונטיות מלוג לכתובת האימייל היעד.

# לכתובת האימייל היעד.

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 לרמות של רכות וכולל שורות רלוונטיות מלוג.

# לכתובת האימייל היעד.

action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# איסור IP ב-CloudFlare ושליחת אימייל עם דוח WHOIS ושורות רלוונטיות מלוג.

# לכתובת האימייל היעד.

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 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 /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 בעתיד, ניתן לבדוק את הכללים על ידי הרחקת השרת השני. לאחר התחברות לשרת השני שלך, נסה להתחבר ב־SSH לשרת ה־Fail2ban. ניתן לנסות להתחבר באמצעות שם לא קיים:

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