הפרק השני: המעבר לאוטומציה – כשה-Firewall לומד לחסום לבד
הבנתי שאי אפשר לחסום אלפי IPs ידנית. הבוטים האלו משנים כתובות במהירות, וכל חסימה ידנית היא זמנית. הפתרון: לגרום ל-Firewall (CSF/LFD) "לקרוא" את הלוגים בזמן אמת ולפעול לבד.
הכלי המרכזי: LFD + regex.custom.pm – המוח האוטומטי
ה-Login Failure Daemon (LFD), רכיב ב-CSF, הוא הכלי המושלם למשימה. הוא סורק לוגים ללא הפסקה ומחפש דפוסים. על ידי הוספת כללי Regex מותאמים אישית לקובץ regex.custom.pm, אמרתי ל-LFD: "אם אתה רואה IP שמנסה לגשת לקבצי פריצה, חסום אותו!"
איך הטמעתי את הכלל:
פתח את קובץ ה-
regex.custom.pmלעריכה:nano /etc/csf/regex.custom.pmהוסף את הכלל הבא (לפני השורה
return 0;):
# חסימה אוטומטית למי שמנסה לגשת לקבצי פריצה (Honeypot Trigger)
if (($lgfile eq "/usr/local/apache/logs/access_log") and ($line =~ /"\S+\s(\S+)\sHTTP\/\d\.\d"\s(403|404)\s\S+\s"-\sUser-Agent:\s\S+"/ ) and ($1 =~ /(alfa.php|shell.php|xmlrpc.php|x.php)/)) {
return ("HoneypotBlock: Attack attempt on $1",$1,"HoneypotBlock","3","80,443","86400","0");
}
הסבר קצר על הכלל:
lgfile eq "/usr/local/apache/logs/access_log": סורק את לוג הגישה הראשי.$1 =~ /(alfa.php|shell.php|xmlrpc.php|x.php)/: מחפש ניסיונות גישה לקבצים ספציפיים."\s(403|404)\s": מוודא שהבקשה הסתיימה בשגיאת 403 או 404."3": ה-IP ייחסם אחרי 3 ניסיונות."80,443": הבוט ייחסם בפורטים אלו."86400": הבוט ייחסם ל-24 שעות (86400 שניות). זה מספיק כדי לייאש את רוב התוקפים מבלי "ללכלך" את ה-Firewall עם חסימות קבועות.
שמור את הקובץ ואתחל את CSF/LFD:
csf -r && service lfd restart
הבעיה השנייה: מתקפת מיילים מבוזרת (SMTP Brute Force)
תוך כדי ניטור השרת, גיליתי מקור עומס נוסף: מתקפה מבוזרת על שירות המייל (SMTP/Dovecot). בוטים רבים ניסו לנחש סיסמאות עבור שמות משתמש נפוצים כמו
michal,odeya,admin,info– גם אם הם לא היו קיימים בשרת. הניסיונות האלו בזבזו משאבים על אימות שמות משתמש וסיסמאות.הפתרון: הרחבת ה-Honeypot לרמת המייל.
הגדרת ה-LFD לסרוק לוג מייל: פתח את
vi /etc/csf/csf.confושנה את הערך:CUSTOM2_LOG = "/var/log/maillog"כלל Regex לחסימת ניחושי משתמשים במייל: הוסף כלל נוסף ל-
/etc/csf/regex.custom.pm(שוב, לפניreturn 0;):
# חסימה מיידית של ניסיונות פריצה למשתמשים שלא קיימים במייל (FakeUserBlock)
if (($lgfile eq "/var/log/maillog") && ($line =~ /password mismatch/i) && ($line =~ /user=<(michal|odeya|admin|webmaster|info|test)>/i) && ($line =~ /rip=(\S+),/)) {
return ("FakeUserBlock: Attempt to fake user $1",$1,"FakeUserBlock","1","25,110,143,465,587,993,995","86400","0");
}
הסבר קצר על הכלל:
lgfile eq "/var/log/maillog": הפעם סורק את לוג המייל.user=<(michal|odeya|admin|webmaster|info|test)>: רשימת שמות משתמש "מבוקשים" על ידי תוקפים."1": חסימה מיידית בניסיון הראשון! (מכיוון שאנו יודעים שמשתמשים אלו אינם קיימים, אין מה להפסיד)."25,110,...": חסימה על כל פורטי המייל הנפוצים.
שמור ואתחל:
csf -r && service lfd restart
הלקח השני: כוחו של ה-Regex
הבנתי שעם מעט יצירתיות ו-Regex, אפשר להפוך את ה-Firewall למערכת אבטחה פרואקטיבית שמזהה ונועלת תוקפים לפני שהם בכלל מגיעים למשאבים של השרת. העומס שהיה על השרת ירד באופן דרמטי, וה-Load התייצב על מספרים נמוכים (0.1-0.3) רוב הזמן.
מה מחכה לנו בפרק ג'?
בפרק האחרון נדבר על כלים נוספים לניטור, טיפים לניהול שוטף, ואיך בניתי "מרכז שליטה" בפקודה אחת כדי לקבל תמונת מצב מלאה של השרת בכל רגע נתון.
החזון: להיות הטלפון הראשון שלך לעולם האינטרנט.
יזם ומוביל טכנולוגי מחזון ורעיון למוצר מתפקד ומוכר בשטח. פיתח מעל 15 מוצרים טכנולוגיים במהלך השנים וכיום מאות אתרים – בעיקר וורדפרס ו REACT – ומספר אפליקציות אינטרנט ייחודיות.
מתמחה בפיתוח אפליקציות, תוספים ותבניות, בניית אתרים, קידום אתרים, שיפורי אבטחה ואתרים מהירים. מחפש תמיד לעשות את המדויק, מקצועי ואם צריך שיהיה שונה מאחרים.