הגנה מפני בוטים: fail2ban וניקוד Redis
האתר שלך תחת מתקפת בוטים — CPU ב-100%, השרת מאט, ומשתמשים לגיטימיים לא מצליחים להתחבר. אנו פורסים מערכת שחוסמת כתובות IP חשודות, וחותכת 99% מהמתקפות לפני שהן מגיעות ליישום. עם ניסיון של למעלה מ-7 שנים באבטחת אינטרנט, הגנו על יותר מ-50 פרויקטים מפני בוטים, סורקים והתקפות כוח גס. הגישה שלנו — שילוב של fail2ban וניקוד Redis — מפחיתה את עומס השרת ב-60% וחותכת בקשות זדוניות פי 10. זה מניב חיסכון של 40–60% במשאבי אירוח, בדרך כלל חיסכון של 500–1,500 דולר בחודש. עלויות ההטמעה מתחילות ב-2,000 דולר, עם החזר השקעה תוך חודשיים. צרו קשר לייעוץ בנושא אבטחת האתר שלכם עוד היום.
אילו בעיות פותר חסימת IP?
תרחישי מתקפה אופייניים:
- כוח גס על לוחות ניהול — עד 1000 בקשות בדקה מכתובת IP אחת.
- סריקת פרצות (ניסיונות גישה ל-.env, wp-admin, phpMyAdmin).
- גרידת תוכן ושליחת ספאם דרך טפסי יצירת קשר.
ללא חסימה אוטומטית, פעולות אלו מבזבזות משאבי שרת ועלולות להוביל למניעת שירות. הפתרון שלנו עוצר אותן בשלב מוקדם.
מערכת ניקוד מבוססת Redis
כל פעולה חשודה מעניקה נקודות לכתובת ה-IP, המאוחסנות ב-Redis עם TTL. כאשר מגיעים לסף (לדוגמה, 100 נקודות), ה-IP נחסם ל-24 שעות. הספים ומשכי החסימה ניתנים להגדרה לפי פרופיל סיכון. פעולות אופייניות ומשקלן:
| פעולה | נקודות | דוגמה להפעלה |
|---|---|---|
| אימות נכשל | 20 | סיסמה שגויה יותר מ-3 פעמים בדקה |
| הפעלת Honeypot | 80 | GET /wp-admin מכתובת IP לא ידועה |
| חריגה ממגבלת קצב | 10 | יותר מ-100 בקשות API ב-10 שניות |
| סדרת שגיאות 404 | 15 | סריקת נתיבים שאינם קיימים |
למה לשלב fail2ban ו-Redis?
הכלי fail2ban פועל ברמת הליבה, וחוסם כתובות IP לפני שהתעבורה מגיעה ליישום — מפחית את עומס השרת פי 5 בהשוואה לחסימה ברמת היישום. לפי תיעוד fail2ban בויקיפדיה, כללי iptables מעובדים במיקרו-שניות. ניקוד Redis מתחשב בהתנהגות מורכבת: Honeypot, סשנים, כללים מותאמים אישית. השילוב עדיף בהרבה על כל אחד בנפרד, ומטפל גם במתקפות פשוטות וגם במתקפות מתוחכמות.
כיצד אנו מגדירים fail2ban עבור היישום שלך
Fail2ban מנתח לוגים של שרתי אינטרנט (Nginx, Apache) וחוסם כתובות IP ברמת iptables. דוגמת תצורה עבור Nginx:
# /etc/fail2ban/filter.d/nginx-scan.conf
[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD) /\.env.*" .*$
^<HOST> .* "(GET|POST) /wp-admin.*" .*$
^<HOST> .* ".*\.php\?" .*$
# /etc/fail2ban/jail.d/nginx-custom.conf
[nginx-scan]
enabled = true
filter = nginx-scan
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime = 86400 # 24 часа
action = iptables-multiport[name=nginx-scan, port="http,https"] %(action_mwl)s # + email-уведомлениеFail2ban עולה על חסימת Redis מבודדת מכיוון שהוא חוסם תעבורה לפני עיבוד היישום. אבל הוא מפספס התנהגות מורכבת — לשם כך Redis עוזר.
חסימה מבוססת Redis ביישום
מערכת הניקוד של Redis מגיבה בגמישות לחריגות בתוך הקוד. דוגמת Middleware ב-Laravel:
// app/Http/Middleware/BlockSuspiciousIp.php
class BlockSuspiciousIp {
public function handle(Request $request, Closure $next) {
$ip = $request->ip();
// Проверить Redis-блэклист
if (Cache::has("blocked_ip:{$ip}")) {
abort(403, 'Access denied');
}
// Проверить счётчик подозрительных действий
$suspicionKey = "suspicion:{$ip}";
$score = (int) Cache::get($suspicionKey, 0);
if ($score >= 100) {
Cache::put("blocked_ip:{$ip}", true, now()->addHours(24));
Log::warning("IP blocked: {$ip}", ['score' => $score]);
abort(403);
}
return $next($request);
}
}
// Сервис начисления очков подозрительности
class SuspicionScorer {
public function increment(string $ip, int $points, string $reason): void {
$key = "suspicion:{$ip}";
Cache::increment($key, $points);
Cache::put($key, Cache::get($key), now()->addHour());
Log::info("Suspicion score", ['ip' => $ip, 'points' => $points, 'reason' => $reason]);
}
}
// Использование
$scorer->increment($ip, 20, 'failed_login');
$scorer->increment($ip, 50, 'honeypot_triggered');
$scorer->increment($ip, 10, 'rate_limit_exceeded');
אינטגרציה עם AbuseIPDB ו-Honeypot
AbuseIPDB הוא מאגר מוניטין המכיל מיליוני כתובות IP זדוניות. אנו מתחברים דרך API: בכל בקשה נכנסת, אנו בודקים את ציון האמינות. אם הוא מעל 50%, ה-IP נחסם מיד. אנו שומרים את התוצאה במטמון לשעה כדי להפחית את עומס ה-API.
class AbuseIpDbService {
public function checkIp(string $ip): array
{
$response = Http::withHeaders([
'Key' => config('services.abuseipdb.key'),
'Accept' => 'application/json',
])->get('https://api.abuseipdb.com/api/v2/check', [
'ipAddress' => $ip,
'maxAgeInDays' => 90,
]);
return $response->json('data');
}
public function isSuspicious(string $ip): bool
{
$data = Cache::remember("abuseipdb:{$ip}", 3600, fn() => $this->checkIp($ip));
return $data['abuseConfidenceScore'] > 50;
}
}נתיבי Honeypot — כתובות URL שמשתמשים אמיתיים לעולם לא מבקרים בהן. כל בקשה אליהן מעניקה נקודות חשד גבוהות. דוגמאות:
// Маршруты, которые никогда не вызывают реальные пользователи
Route::any('/wp-admin', function(Request $request) {
app(SuspicionScorer::class)->increment($request->ip(), 80, 'honeypot_wp_admin');
abort(404);
});
Route::any('/.env', function(Request $request) {
app(SuspicionScorer::class)->increment($request->ip(), 100, 'honeypot_env_file');
abort(404);
}); כיצד להימנע מתוצאות חיוביות שגויות
כדי למזער תוצאות חיוביות שגויות, אנו מוסיפים רשימת היתרים לרשתות משנה מהימנות: Cloudflare, Googlebot, כתובות IP פנימיות, שותפים ידועים. החסימות זמניות — עם TTL (לדוגמה, 24 שעות). לאחר פקיעת החסימה, ה-IP יכול לעבוד כרגיל אם הוא לא חוזר על המתקפות. דוגמת פקודה לניקוי חסימות שפגו:
// Команда для очистки устаревших блокировок
class CleanExpiredBlocksCommand extends Command
{
protected $signature = 'security:clean-blocks';
public function handle(): void
{
// Redis TTL обрабатывает это автоматически
// Для database-хранилища:
BlockedIp::where('expires_at', '<', now())->delete();
}
}
// Whitelist для известных источников
$whitelist = ['10.0.0.0/8', '192.168.1.0/24', '1.2.3.4'];
// Cloudflare IP-диапазоны — никогда не блокировать
מה כלול
לאחר ההטמעה, אנו מספקים:
- תיעוד מלא של הארכיטקטורה
- תצורת fail2ban עם מסננים מותאמים אישית
- מערכת ניקוד Redis עם אינטגרציה של AbuseIPDB ו-DNSBL
- נתיבי Honeypot
- לוח מחוונים לניטור עם סטטיסטיקות חסימות
- הדרכה למהנדסים שלך
- חודש של תמיכה טכנית לאחר הפריסה
דוגמת הטמעה
לאחר פריסת המערכת על פרויקט אחד, רשמנו הפחתה של 95% בתעבורה זדונית וירידה של 70% בעומס השרת. תוצאות חיוביות שגויות היו מתחת ל-0.3%. בקשו ביקורת אבטחה לאתר שלכם — נעריך את הפרויקט תוך יום אחד.תהליך ההטמעה
- ביקורת על המחסנית הנוכחית — ניתוח לוגים, עומס, סוגי מתקפות (יום אחד).
- הגדרת fail2ban — מסננים מותאמים אישית ליישום שלך (יום אחד).
- פיתוח מערכת ניקוד Redis — אינטגרציה לתוך הקוד, חיבור AbuseIPDB ו-DNSBL (3–5 ימים).
- יצירת נתיבי Honeypot — פיתיונות לבוטים (יום אחד).
- בדיקות וניטור — לוח מחוונים עם סטטיסטיקות, הדרכת המהנדסים שלך (1–2 ימים).
תוצאות ומדדים
השוואת גישות:
| פרמטר | fail2ban בלבד | fail2ban + ניקוד Redis |
|---|---|---|
| ביצועים | גבוהים (ליבה) | בינוניים (ליבה + יישום) |
| גמישות תצורה | נמוכה | גבוהה (כללים מותאמים אישית) |
| תוצאות חיוביות שגויות | שכיחות יותר | פחות שכיחות (ניקוד) |
| אינטגרציה עם API חיצוני | לא | כן (AbuseIPDB, Spamhaus) |
לאחר ההטמעה, אנו מבטיחים הפחתה של 80–99% בתעבורה זדונית ולפחות 60% הפחתה בעומס השרת. צרו קשר כדי לדון בפרטי אבטחת הפרויקט שלכם.







