הקדמה
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
, כמו שתתקין כל חבילה אחרת:
מנהל החבילות dnf
כעת יבדוק את EPEL בנוסף למקורות החבילות המוגדרים כבר כאשר מתקין תוכנה חדשה. המשך להתקין את Fail2ban:
systemctl
:
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
:
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
:
כעת תוכל להתחיל לבצע שינויי הגדרות. פתח את הקובץ ב־vi
או בעורך הטקסט המועדף עליך:
במהלך הגלילה בקובץ, המדריך יבחן כמה אפשרויות שעשויות לעניין אותך לעדכן. ההגדרות שממוקמות תחת הקטע [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
. . .
אם ברצונך לקבל התראות בדוא"ל כאשר פייל טו באן מבצע פעולה, עליך לבדוק את ההגדרות של destemail
, sendername
, ו־mta
. הפרמטר destemail
מגדיר את כתובת הדוא"ל שבה ישלחו הודעות חסימה. הפרמטר sendername
מגדיר את הערך של השדה "מאת" בדוא"ל. הפרמטר mta
מגדיר איזה שירות דוא"ל ישמש לשליחת הדוא"ל. כברירת מחדל, זהו sendmail
, אך תוכל להשתמש ב־Postfix או בפתרון דוא"ל אחר.
[DEFAULT]
. . .
action = $(action_)s
. . .
הפרמטר הזה מגדיר את הפעולה שפייל טו באן מבצע כאשר הוא רוצה ליישם חסימה. הערך 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"]
# ראה את הערה החשובה בקובץ 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
מתחת לכותרת, עם ההגדרות האחרות שלהם.
[jail_to_enable]
. . .
enabled = true
. . .
למדריך זה, תפעיל את כלא ה-SSH. זה צריך להיות בראש קבצי ההגדרה הפרטיים. הפרמטרים הברירת מחדל יעבדו אחרת, אך תצטרך להוסיף שורת הגדרה שאומרת enabled = true
מתחת לכותרת [sshd]
.
#
# 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
שהוסרה. הקבצים האלו מכילים ביטויים רגולריים (קיצור נפוץ לניתוח טקסט) שמגדירים אם שורה בלוג היא ניסיון התחברות שנכשל. אנחנו לא נכנסים לעומק לגבי הקבצים האלו במדריך זה, מכיוון שהם מורכבים וההגדרות הקבועות מתאימות לשורות המתאימות היטב.
אך, אתה יכול לראות אילו סוגים של פילטרים זמינים על ידי הסתכלות בתיקייה הזו:
אם אתה רואה קובץ שנראה קשור לשירות שאתה משתמש בו, אתה צריך לפתוח אותו בעורך טקסט. רוב הקבצים מכילים הערות היטב ואתה אמור להצליח להבין לפחות איזה סוג של תנאי הסקריפט נועד להגן עליו. רוב הפילטרים האלו כוללים סקשנים מתאימים (מנוטרלים) בקובץ 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
. . .
כאשר תסיים לערוך, שמור וסגור את הקובץ. אם אתה משתמש ב- vi
, השתמש ב- :x
כדי לשמור ולצאת. בנקודה זו, תוכל להפעיל את שירות ה-Fail2ban שלך כך שהוא ירוץ באופן אוטומטי מעכשיו והלאה. ראשית, הפעל אותו על ידי systemctl enable
:
לאחר מכן, התחל אותו באופן ידני לפעם הראשונה עם systemctl start
:
תוכל לוודא שהוא פועל באמצעות systemctl status
:
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. נסה להתחבר באמצעות שם שאינו קיים:
הזן תווים אקראיים בתיבת הסיסמה. חזור על זה מספר פעמים. בכל פעם, השגיאה שאתה מקבל צריכה להשתנות מ- Permission denied
ל- Connection refused
. זה מציין כי השרת השני שלך אוסרר מהשרת של Fail2ban.
על השרת של Fail2ban שלך, תוכל לראות את הכלל החדש על ידי בדיקת הפלט של fail2ban-client
. fail2ban-client
הוא פקודה נוספת המסופקת על ידי Fail2ban לבדיקת הגדרת הריצה שלו.
OutputStatus
|- Number of jail: 1
`- Jail list: sshd
אם תריץ fail2ban-client status sshd
, תוכל לראות את רשימת ה-IPים שנחסמו מ-SSH:
OutputStatus 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