Fail2ban للـ SSH: اقفل الباب قبل ما البوتات تملأ اللوج
هتخرج من المقال بإعداد عملي يقلل محاولات SSH الفاشلة من آلاف السطور في الساعة لعشرات قليلة، بدون ما تغيّر بورت SSH لمجرد الإحساس بالأمان.
مستوى القارئ: متوسط
المشكلة باختصار
لو عندك VM عامة على الإنترنت، أول حاجة هتحصل غالبًا إن بوتات كتير هتجرّب الدخول على SSH. اللي بيحصل فعلاً إن اللوج يمتلئ بمحاولات أسماء مستخدمين عشوائية، ووقت التحقيق في حادثة بسيطة يتحول لفرز آلاف السطور.
الافتراض هنا إن عندك Ubuntu أو Debian VM، وSSH مفتوح للإدارة، وعدد الأدمن قليل. السيناريو الواقعي: سيرفر صغير يستقبل 3200 محاولة فاشلة في الساعة على بورت 22. بعد Fail2ban بإعداد محافظ، الرقم ممكن ينزل لحوالي 85 محاولة ظاهرة في الساعة لأن العناوين المزعجة بتتحظر بسرعة. الرقم تقديري للتوضيح، ولازم تقيسه على لوجاتك.
الفكرة بمثال بسيط
ركز في المثال ده. عندك باب مكتب عليه حارس. أول محاولة بكلمة سر غلط مش معناها إن الشخص خطر. لكن لو نفس الشخص جرّب 5 مرات في 10 دقائق، الحارس يمنعه من الوقوف أمام الباب لمدة ساعة. Fail2ban بيعمل نفس الفكرة، لكن بدل الحارس بيقرأ لوج SSH، وبدل منعه بالكلام بيضيف rule في firewall.
علميًا، Fail2ban بيراقب ملفات اللوج أو systemd journal بفلاتر جاهزة. لما عدد الأحداث المطابقة يتجاوز maxretry داخل نافذة findtime، ينفذ banaction مثل حظر IP عبر nftables أو iptables. هو مش بديل لمفاتيح SSH، لكنه طبقة تقليل ضرر ممتازة.
الإعداد العملي على Ubuntu
ابدأ بالإعداد المحافظ. لا تعدّل jail.conf مباشرة لأنه ممكن يتغير مع تحديثات الحزمة. استخدم ملف تحت jail.d بالظبط.
sudo apt update
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.d/sshd-hardening.local > /dev/null <<'EOF'
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 YOUR_OFFICE_IP
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client reload
sudo fail2ban-client status sshdلو السيرفر بيستخدم nftables حديثًا، اترك Fail2ban يختار الإجراء الافتراضي من توزيعك الأول. لو احتجت تحديده لاحقًا، اختبر banaction على staging قبل الإنتاج. أفضل طريقة هنا إنك تبدأ بأقل تغيير ثم تقيس.
اقفل SSH نفسه قبل ما تعتمد على الحظر
الطريقة الشائعة الغلط هي تثبيت Fail2ban فقط وترك تسجيل الدخول بكلمة سر مفتوح. الطريقة دي بتفشل لأن أي IP جديد يقدر يجرّب قبل ما يتحظر. البديل: خلي SSH يقبل المفاتيح، قلل محاولات المصادقة، واقفل root login.