הקדמה
SSH הוא השיטה הסטנדרטית להתחברות לשרת ענן. זה עמיד, והוא נרחב במידה רבה — כאשר תקני ההצפנה החדשים פותחים, ניתן להשתמש בהם כדי ליצור מפתחות SSH חדשים, מבטיחים שהפרוטוקול היסודי יישאר בטוח. אך, אף פרוטוקול או מערכת תוכנה אינם מוגנים מכל סוג של התקפה, והעובדה ש-SSH מופץ בכל רחבי האינטרנט משמעה שהוא מייצג פני-תקן מאוד צפוי או וקטור התקפה שבו אנשים יכולים לנסות לקבל גישה.משטח התקפה או ווקטור התקפה כזה.
כל שירות שנחשף לרשת הוא מטרה פוטנציאלית בדרך זו. אם תבדקו את יומני השימוש של השירות SSH שלכם הרץ על כל שרת המונף בקרבת רבים, תראו לעתים קרובות ניסיונות כניסה חוזרים וממוזגים שמייצגים התקפות כוח שברי על ידי משתמשים ורובוטים כאחד. אף שניתן לבצע קיטונים לשירות ה-SSH שלכם כדי להפחית את הסיכוי של התקפות אלו לקרות לכמעט אפס, כמו לדוגמא ניטול האימות בסיסמה למען מפתחות SSH, הם עדיין עשויים להיות לכם בעיה מינימלית ומתמדת.
WireGuard לפני שירת ה־SSH שלך, כך שאי אפשר להתחבר ישירות לפורט SSH המוגדר כברירת מחדל 22 מהאינטרנט החיצוני ללא התייחסות נוספת לתוכנה או לשערים נוספים. פתרונות VPN אלה מאומצים בצורה רחבה, אך הם יכולים להוסיף מורכבות ולפגוע באוטומציות כמו גם בחיכוכים קטנים בתוכנות נוספות.
לפני או כדי להתחייב להגדרה מלאה של VPN, ניתן ליישם כלי בשם Fail2ban. Fail2ban יכול להפחית באופן משמעותי תקיפות כוח גולמיות על ידי יצירת כללים שמשנים אוטומטית את תצורת הגישה שלך לגישת הגנה מסוימת לאחר מספר ניסיונות כניסה לא מוצלחים. זה יאפשר לשרת שלך להתחזק נגד ניסיונות הגישה האלה מבלי להתערב.
במדריך זה, תראה איך להתקין ולהשתמש ב־Fail2ban על שרת Ubuntu 20.04.
דרישות מוקדמות
כדי להשלים את המדריך הזה, תצטרך:
-
שרת Ubuntu 20.04 ומשתמש לא רוט עם הרשאות sudo. ניתן ללמוד עוד על איך להגדיר משתמש עם הרשאות אלו במדריך השלבים הראשונים שלנו עם Ubuntu 20.04.
-
לבחירתך, שרת שני שבו תוכל להתחבר לשרת הראשון שלך, שבו תשתמש לבדיקת השבתות מתוכננות.
שלב 1 — התקנת Fail2ban
Fail2ban זמין במאגרי התוכנות של Ubuntu. התחל בהרצת הפקודות הבאות כמשתמש לא רוט כדי לעדכן את רשימות החבילות שלך ולהתקין את Fail2ban:
Fail2ban יקים שירות רקע אוטומטית לאחר התקנתו. עם זאת, הוא מושבת כברירת מחדל, מכיוון שחלק מההגדרות הברירת מחדל שלו עשויות לגרום לאפקטים שאינם רצויים. ניתן לאמת זאת באמצעות השימוש בפקודת systemctl
:
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
:
Output#
# אזהרה: נערך מאוד בשחרור 0.9.0. בבקשה עיין ו
# התאם אישית הגדרות עבור ההתקנה שלך.
#
# שינויים: ברוב המקרים אין צורך לשנות קובץ זה,
# אלא לספק התאמות בקובץ jail.local,
# או בקבצי .conf נפרדים בתיקיית jail.d/, לדוגמה:
#
# איך להפעיל אסיריות:
#
# אין לשנות קובץ זה.
#
# יש סיכוי שישתנה או יושפר בעת עדכון של ההפצה.
#
# ספק התאמות בקובץ jail.local או ב-fail2ban.d/customisation.local.
# לדוגמה, לשינוי בנתוני ברירת המחדל של זמן חסימה לכל האסיריות ולאפשר
# את אסיריות ה־ssh-iptables, השורה הבאה (שאיננה מפותחת) תופיע בקובץ .local.
# עיין ב man 5 jail.conf לפרטים.
#
# [DEFAULT]
כפי שתראו, השורות הראשונות של קובץ זה מוצגות במצב מפורש – הן מתחילות בתווים #
שמציינים שהן צריכות להיות קראו כתיעוד ולא כהגדרות. כפי שתראו גם, ההערות האלו מכוונות אתכם לא לשנות את הקובץ ישירות. במקום זאת, יש לכם שתי אפשרויות: ליצור פרופילים יחידים עבור Fail2ban בקבצים מרובים בתיקיית jail.d/
, או ליצור ולאגוד את כל ההגדרות המקומיות שלך בקובץ jail.local
. קובץ jail.conf
יתעדכן באופן תקומתי במידה והוא יתעדכן בעצמו, וישמש כמקור להגדרות ברירת מחדל שאילו לא יצרתם אף דרישה.
במדריך זה, תיצורו jail.local
. ניתן לעשות זאת על ידי העתקת jail.conf
:
עכשיו תוכלו להתחיל בביצוע שינויי התצורה. פתחו את הקובץ באמצעות nano
או העורך הטקסט האהוב עליכם:
במשך כשאתם גוללים בקובץ, המדריך יבקש לעבור על כמה אפשרויות שתרצו לעדכן. ההגדרות הממוקמות תחת הסעיף [DEFAULT]
בקריאת הקובץ ייחודיות לכל השירותים שנתמכים על ידי Fail2ban. במקומות אחרים בקובץ, יש כותרות עבור [sshd]
ועבור שירותים אחרים, שמכילות הגדרות ספציפיות לשירות שיתקבלו מעל הברירות המחדליות.
[DEFAULT]
. . .
bantime = 10m
. . .
הפרמטר bantime
מגדיר את אורך הזמן בו הלקוח יושע במקרה בו כשל באימות. זה מתכן בשניות. כברירת מחדל, זה מוגדר ל-10 דקות.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
הפרמטרים הבאים הם findtime
ו־maxretry
. אלו עובדים ביחד להקניית התנאים שבהם לקוח מתקבל כמשתמש לגיטימי שצריך להיאסר.
המשתנה maxretry
מגדיר את מספר הניסיונות שהלקוח צריך להיאותנט תוך חלון זמן המוגדר על ידי findtime
, לפני שהוא מושעה. עם הגדרות ברירת המחדל, שירות fail2ban יאסור לקוח שנכשל להתחבר 5 פעמים בתוך חלון של 10 דקות.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
אם תרצה לקבל התראות בדוא"ל כאשר Fail2ban מבצע פעולה, עליך להעריך את הגדרות ה־destemail
, sendername
, ו־mta
. הפרמטר destemail
מגדיר את כתובת הדוא"ל שצריך לקבל הודעות איסורים. הפרמטר sendername
מגדיר את ערך השדה "מאת" בדוא"ל. הפרמטר mta
מגדיר איזו שירות דוא"ל יועשה שימוש בו כדי לשלוח דואר. כברירת מחדל, זהו sendmail
, אך ייתכן שתרצה להשתמש ב־Postfix או פתרון דואר אחר.
[DEFAULT]
. . .
action = $(action_)s
. . .
פרמטר זה מגדיר את הפעולה שבה יבצע Fail2ban כאשר הוא רוצה להטיל איסור. הערך action_
מוגדר בקובץ מעט לפני הפרמטר הזה. הפעולה ברירת המחדל היא לעדכן את התצורה של הגנת האש שלך כדי לדחות תעבורה מהמארח המפר לעבר זמן האיסור.
ישנם סקריפטים action_
אחרים שסופקו כברירת מחדל שבהם תוכל להחליף $(action_)
מעל:
…
# אסור ושלח אימייל עם דוח 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"]
# ראה את ההערה החשובה בקובץ פעולה/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
תחת הכותרת, עם הגדרותיהם האחרות.
[jail_to_enable]
. . .
enabled = true
. . .
בברירת המחדל, שירות ה-SSH מאופשר וכל השאר מושבתים.
כמה הגדרות אחרות שמוגדרות כאן הן ה-filter
שיעשה שימוש כדי להחליט האם שורה ביומן מציינת ניסיון זולל בהזדהות וה-logpath
המספר ל־fail2ban איפה ממוקמים היומנים עבור שירות זה ספציפי.
ערך ה־filter
הוא בעצם הפניה לקובץ הנמצא בתיקיית /etc/fail2ban/filter.d
, עם הסיומת שלו .conf
הוסרת. קבצים אלו מכילים ביטויים רגולריים (סימון מקובל לניתוח טקסט) שמקבעים האם שורה ביומן היא ניסיון זולל. אנו לא נכנסים לעומק בקבצים אלו במדריך זה, מכיוון שהם מורכבים וההגדרות הקבועות מתאימות לשורות המתאימות היטב.
עם זאת, תוכל לראות אילו סוגי סינונים זמינים על ידי הסתכלות בתיקייה זו:
אם תראה קובץ הנראה קשור לשירות שאתה משתמש בו, עליך לפתוח אותו בעורך טקסט. רוב הקבצים מתועדים נאה ואתה צריך להיות מסוגל לפחות להבין איזה סוג של תנאי הוא נועד להגן עליו הסקריפט. רוב הסינונים הללו כוללים קטעים (מנוטרלים) מתאימים בקובץ ה־jail.conf
שאנו יכולים לאפשר בקובץ ה־jail.local
אם רצוי.
למשל, דמיינו שאתם משרתים אתר באמצעות Nginx ומבינים שחלק מאתרכם שמוגן בסיסמה מותקף בניסיונות כניסה. תוכלו לספר ל־fail2ban להשתמש בקובץ nginx-http-auth.conf
לבדיקת מצב זה בתוך קובץ /var/log/nginx/error.log
.
זה כבר מוגדר בקטע בשם [nginx-http-auth]
בקובץ /etc/fail2ban/jail.conf
שלכם. אתם רק צריכים להוסיף את הפרמטר enabled
:
. . .
[nginx-http-auth]
enabled = true
. . .
כאשר אתם מסיימים לערוך, שמרו וסגרו את הקובץ. בנקודה זו, תוכלו להפעיל את שירות ה־Fail2ban שלכם כך שירוץ באופן אוטומטי מעתה והלאה. ראשית, הפעילו אותו על ידי הרצת systemctl enable
:
לאחר מכן, הפעילו אותו באופן ידני לפעם הראשונה באמצעות systemctl start
:
תוכלו לוודא שהוא פועל באמצעות systemctl status
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Tue 2022-06-28 19:29: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 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service.
Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready
בשלב הבא, תדגימו את Fail2ban בפעולה.
שלב 3 — בדיקת מדיניות החסימה (אופציונלי)
משרת אחר, שלא תצטרך להתחבר לשרת ה־Fail2ban בעתיד, תוכלו לבדוק את הכללים על ידי חסימת השרת השני. לאחר התחברות לשרת השני שלכם, נסו להתחבר ב־SSH לשרת ה־Fail2ban. תוכלו לנסות להתחבר באמצעות שם שאינו קיים:
הכנס תווים אקראיים לתיבת הסיסמה. חזור על זה כמה פעמים. בכמה שלב תקבל את השגיאה Permission denied
השגיאה תשתנה ל Connection refused
. זה מציין שהשרת השני שלך אוסר על ידי שרת Fail2ban.
על השרת שלך של Fail2ban, תוכל לראות את הכלל החדש על ידי בדיקת פלט ה iptables
. iptables
הוא פקודה לאינטרקציה עם כללי פתח ואש ברמה נמוכה על השרת שלך. אם עקבת אחר המדריך של DigitalOcean להתקנת השרת הראשונית, תשתמש ב ufw
כדי לנהל את כללי האש ברמה גבוהה יותר. הרצת iptables -S
תראה לך את כל כללי האש שנוצרו כבר על ידי ufw
:
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:
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 ב-Ubuntu 14.04 ועל איך להגן על שרת Apache באמצעות Fail2Ban ב-Ubuntu 14.04.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-20-04