כיצד להגן על SSH עם Fail2Ban על Debian 11

הקדמה

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

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

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

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

במדריך זה, תראה כיצד להתקין ולהשתמש ב־Fail2ban על שרת Debian 11.

דרישות קדם

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

  • בשרת Debian 11 ומשתמש לא־שורש עם הרשאות sudo. ניתן ללמוד עוד על איך להגדיר משתמש עם הרשאות אלה במדריך האיתחולי להתקנת שרת עם Debian 11 שלנו.

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

שלב 1 — התקנת Fail2ban

Fail2ban זמין במאגרי התוכנה של Debian. התחל על ידי הרצת הפקודות הבאות כמשתמש לא רוט כדי לעדכן את רשימות החבילות שלך ולהתקין את 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; 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. עבור אל התיקייה ההיא והדפס את השורות הראשונות העשרים של הקובץ באמצעות 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 ל־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 עושה את כל זה ובנוסף שולח עדכון ל־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:

  1. sudo systemctl restart fail2ban

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-11