איך להגן על SSH עם Fail2Ban על Rocky Linux 8

הקדמה

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

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

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

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

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

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

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

  • שרת Rocky Linux 8 ומשתמש לא מנהל עם הרשאות sudo. ניתן ללמוד עוד על איך להגדיר משתמש עם הרשאות אלו במדריך שלנו הגדרת שרת ראשונית עם Rocky Linux 8. עליך גם להפעיל firewalld על השרת, מה שמכוסה במדריך ההתקנה הראשוני שלנו.

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

שלב 1 — התקנת Fail2ban

Fail2ban אינו זמין במאגרי התוכנה המובנים של Rocky. אך הוא זמין במאגר החיצוני EPEL, או חבילות משופרות עבור Linux למותג, שנהוג לשימוש בחבילות מצד ג'יירד האדום וב-Rocky Linux. אם עדיין לא הוספת את EPEL למקורות החבילות של המערכת שלך, תוכל להוסיף את המאגר באמצעות dnf, כמו שתתקין כל חבילה אחרת:

  1. sudo dnf install epel-release -y

מנהל החבילות dnf כעת יבדוק את EPEL בנוסף למקורות החבילות המוגדרים כבר כאשר מתקין תוכנה חדשה. המשך להתקין את Fail2ban:

  1. sudo dnf install fail2ban -y

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

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled 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

כעת תוכל להתחיל לבצע שינויי הגדרות. פתח את הקובץ ב־vi או בעורך הטקסט המועדף עליך:

  1. sudo vi 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
. . .

אם ברצונך לקבל התראות בדוא"ל כאשר פייל טו באן מבצע פעולה, עליך לבדוק את ההגדרות של destemail, sendername, ו־mta. הפרמטר destemail מגדיר את כתובת הדוא"ל שבה ישלחו הודעות חסימה. הפרמטר sendername מגדיר את הערך של השדה "מאת" בדוא"ל. הפרמטר mta מגדיר איזה שירות דוא"ל ישמש לשליחת הדוא"ל. כברירת מחדל, זהו sendmail, אך תוכל להשתמש ב־Postfix או בפתרון דוא"ל אחר.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

הפרמטר הזה מגדיר את הפעולה שפייל טו באן מבצע כאשר הוא רוצה ליישם חסימה. הערך 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 עושה את כל זה בנוסף לשליחת עדכון ל-Cloudflare API המשוייך לחשבונך כדי לאסור את המפר אף שם.

הגדרות כלא פרטיות

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

כל אחד מהסעיפים האלה צריך להיות מופעל בנפרד על ידי הוספת שורת enabled = true מתחת לכותרת, עם ההגדרות האחרות שלהם.

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

למדריך זה, תפעיל את כלא ה-SSH. זה צריך להיות בראש קבצי ההגדרה הפרטיים. הפרמטרים הברירת מחדל יעבדו אחרת, אך תצטרך להוסיף שורת הגדרה שאומרת enabled = true מתחת לכותרת [sshd].

/etc/fail2ban/jail.local
#
# JAILS
#

#
# שרתי SSH
#

[sshd]

# כדי להשתמש במצבים של sshd יותר אגרסיביים הגדר את פרמטר הפילטר "מצב" בקובץ ה-jail.local:
# רגיל (ברירת מחדל), ddos, נוסף או אגרסיבי (משלב את כולם).
# ראה "tests/files/logs/sshd" או "filter.d/sshd.conf" לדוגמה לשימוש ופרטים נוספים.
#mode   = רגיל
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

הגדרות אחרות שמוגדרות כאן הן ה־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
. . .

כאשר תסיים לערוך, שמור וסגור את הקובץ. אם אתה משתמש ב- vi, השתמש ב- :x כדי לשמור ולצאת. בנקודה זו, תוכל להפעיל את שירות ה-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: disabled 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.6 -s /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 שלך, תוכל לראות את הכלל החדש על ידי בדיקת הפלט של fail2ban-client. fail2ban-client הוא פקודה נוספת המסופקת על ידי Fail2ban לבדיקת הגדרת הריצה שלו.

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

אם תריץ fail2ban-client status sshd, תוכל לראות את רשימת ה-IPים שנחסמו מ-SSH:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

תוכן רשימת ה-IPים החסומים צריך לשקף את כתובת ה-IP של השרת השני שלך.

מסקנה

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

למידע נוסף אודות איך להשתמש ב-fail2ban להגנת שירותים נוספים, תוכל לקרוא על איך להגן על שרת Nginx עם Fail2Ban ו-איך להגן על שרת Apache עם Fail2Ban.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8