آموزش سرور

آموزش نصب و تنظیم Fail2ban برای جلوگیری از حملات Brute Force

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۸ دقیقه

Fail2banBruteForceآموزش سرورآموزش نصب و تنظیمFail2ban برای جلوگیری ازحملات Brute Forceمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

Fail2ban لاگ سرویس‌هایی مثل SSH و Nginx را می‌خواند و آی‌پی‌هایی را که پشت سر هم رمز اشتباه می‌زنند برای مدتی در فایروال مسدود می‌کند. روی اوبونتو با apt install fail2ban نصب می‌شود؛ تنظیمات را در فایل jail.local بنویسید نه jail.conf، jail مربوط به sshd را فعال کنید، آی‌پی خودتان را در ignoreip بگذارید و با fail2ban-client status وضعیت را بررسی کنید.

Fail2ban چیست و چه مشکلی را حل می‌کند؟

هر سرور مجازی که آی‌پی عمومی دارد، چند دقیقه پس از روشن شدن هدف ربات‌هایی قرار می‌گیرد که روی پورت SSH نام‌های کاربری و رمزهای رایج را امتحان می‌کنند. اگر نگاهی به لاگ ورود بیندازید، احتمالاً ده‌ها یا صدها تلاش ناموفق از آی‌پی‌های ناشناس می‌بینید:

sudo grep "Failed password" /var/log/auth.log | tail -n 20
# یا روی سیستم‌هایی که فقط journald دارند:
sudo journalctl -u ssh --since "1 hour ago" | grep -i "failed"

این حملات که «Brute Force» (امتحان کردن پشت‌سرهم رمزها) نام دارند، اگر رمز ضعیف باشد بالاخره موفق می‌شوند و حتی اگر موفق نشوند، CPU و لاگ سرور را بی‌دلیل مشغول می‌کنند. Fail2ban یک ابزار متن‌باز و سبک است که لاگ‌ها را زیر نظر می‌گیرد، الگوی تلاش ناموفق را تشخیص می‌دهد و آی‌پی مهاجم را برای مدت مشخصی در فایروال مسدود (Ban) می‌کند.

Fail2ban چطور کار می‌کند
تلاش ورودخواندن لاگقانون بنربات مهاجمحدس رمز پشت‌سرهملاگ SSHauth.log / journaldFail2banشمارش تلاش ناموفقفایروالمسدود کردن آی‌پیتلاش ورودخواندن لاگقانون بنربات مهاجمحدس رمز پشت‌سرهملاگ SSHauth.log / journaldFail2banشمارش تلاش ناموفقفایروالمسدود کردن آی‌پی
شکل ۱ Fail2ban لاگ را می‌خواند و وقتی تعداد تلاش ناموفق از maxretry بیشتر شود، آی‌پی را برای مدت bantime در فایروال مسدود می‌کند.

Fail2ban جایگزین احراز هویت با کلید SSH نیست؛ بهترین نتیجه وقتی است که ورود با رمز را غیرفعال کرده باشید و Fail2ban را به‌عنوان لایهٔ دوم داشته باشید. اگر هنوز این کار را نکرده‌اید، ابتدا راهنمای ورود با کلید SSH و تغییر پورت را ببینید.

مفاهیم اصلی: jail، filter و action

قبل از نصب، سه اصطلاح را بشناسید تا فایل‌های تنظیمات برایتان معنا داشته باشد:

  • filter (فیلتر): مجموعه‌ای از عبارت‌های منظم (Regex) که مشخص می‌کند کدام خط لاگ «تلاش ناموفق» حساب شود. فیلترها در پوشهٔ /etc/fail2ban/filter.d/ هستند و برای SSH، Nginx، Postfix و ده‌ها سرویس دیگر از قبل آماده‌اند.
  • action (اقدام): کاری که پس از تشخیص انجام می‌شود؛ معمولاً اضافه کردن یک قانون به iptables، nftables یا UFW. فایل‌ها در /etc/fail2ban/action.d/ قرار دارند.
  • jail (زندان): ترکیب یک فیلتر، یک منبع لاگ و یک اقدام، همراه با پارامترهایی مثل تعداد تلاش مجاز. برای هر سرویس یک jail فعال می‌کنید.

سه پارامتر کلیدی هر jail این‌ها هستند:

پارامتر معنی
maxretry تعداد تلاش ناموفق مجاز پیش از مسدود شدن
findtime بازهٔ زمانی که تلاش‌ها در آن شمرده می‌شوند
bantime مدت مسدود ماندن آی‌پی؛ مقدار -1 یعنی دائمی

نصب Fail2ban روی اوبونتو و دبیان

Fail2ban در مخازن رسمی اوبونتو و دبیان وجود دارد:

sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager

روی AlmaLinux و Rocky ابتدا مخزن EPEL را فعال کنید و سپس با dnf install fail2ban نصب کنید. بعد از نصب، سرویس اجرا می‌شود ولی تا jail مناسب را فعال نکنید کار مفیدی انجام نمی‌دهد (در نسخه‌های جدید اوبونتو jail مربوط به sshd به‌طور پیش‌فرض فعال است، اما بهتر است صریحاً تنظیمش کنید).

ساخت فایل jail.local و تنظیم jail مربوط به SSH

فایل اصلی تنظیمات /etc/fail2ban/jail.conf است، اما هرگز آن را مستقیم ویرایش نکنید؛ با به‌روزرسانی بسته بازنویسی می‌شود. به‌جای آن یک فایل jail.local بسازید که فقط تغییرات شما را دارد و روی تنظیمات پیش‌فرض اعمال می‌شود:

sudo nano /etc/fail2ban/jail.local

محتوای پیشنهادی:

[DEFAULT]
# آی‌پی‌هایی که هرگز نباید بن شوند (آی‌پی ثابت دفتر یا سرور مدیریت)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
# روی اوبونتو ۲۲.۰۴ به بعد لاگ‌ها از journald خوانده شوند
backend  = systemd

[sshd]
enabled  = true
port     = ssh
maxretry = 4

اگر پورت SSH را تغییر داده‌اید، به‌جای ssh عدد پورت را بنویسید؛ مثلاً port = 2222. این نکته مهم است، چون Fail2ban قانون فایروال را فقط روی همان پورتی می‌گذارد که اینجا معرفی کرده‌اید.

سپس سرویس را بازخوانی کنید و مطمئن شوید jail فعال شده است:

sudo fail2ban-client reload
sudo fail2ban-client status
sudo fail2ban-client status sshd
root@server: ~
$ sudo fail2ban-client status sshdStatus for the jail: sshd|- Filter|  |- Currently failed: ...|  `- Total failed:     ...`- Actions   |- Currently banned: ...   `- Banned IP list:   198.51.100.7 ...$ 
شکل ۲ خروجی status نشان می‌دهد jail مربوط به SSH فعال است و کدام آی‌پی‌ها هم‌اکنون مسدودند.

بن تصاعدی برای مهاجمان تکراری

نسخه‌های جدید Fail2ban قابلیت افزایش تدریجی زمان بن را دارند. با افزودن این خطوط به بخش [DEFAULT]، آی‌پی‌ای که بارها برمی‌گردد هر بار برای مدت طولانی‌تری مسدود می‌شود:

bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 1w

هماهنگی با UFW و فایروال‌های دیگر

به‌طور پیش‌فرض Fail2ban از iptables یا nftables استفاده می‌کند و در کنار UFW هم بدون مشکل کار می‌کند. اگر ترجیح می‌دهید بن‌ها در خروجی ufw status دیده شوند، اقدام پیش‌فرض را عوض کنید:

[DEFAULT]
banaction = ufw

در هر حال، اول فایروال را درست راه بیندازید و پورت SSH را باز کنید؛ آموزش کامل آن در مقالهٔ فایروال UFW در اوبونتو آمده است. ترتیب منطقی برای سرور تازه این است: کلید SSH، سپس UFW، سپس Fail2ban.

محافظت از Nginx و سرویس‌های وب

Fail2ban فقط برای SSH نیست. اگر روی سرور وب‌سایت دارید، چند jail آماده برای Nginx وجود دارد. مثلاً برای صفحه‌هایی که با رمز عبور HTTP محافظت شده‌اند و برای ربات‌هایی که دنبال فایل‌های حساس می‌گردند:

[nginx-http-auth]
enabled  = true
logpath  = /var/log/nginx/error.log

[nginx-botsearch]
enabled  = true
logpath  = /var/log/nginx/access.log
maxretry = 2

برای سرویس‌هایی که از Nginx لاگ می‌گیرند، backend باید از خواندن فایل استفاده کند؛ اگر در بخش DEFAULT مقدار systemd گذاشته‌اید، در این jailها backend = auto را اضافه کنید.

نکتهٔ مهم: اگر سایت شما پشت CDN است، آی‌پی‌ای که Nginx می‌بیند آی‌پی سرور لبهٔ CDN است، نه بازدیدکننده. در این حالت بن کردن آن آی‌پی ممکن است بخشی از کاربران واقعی را قطع کند. یا IP واقعی را از هدر CDN استخراج کنید یا این jailها را فقط روی سرویس‌هایی فعال کنید که مستقیم در دسترس‌اند. برای آشنایی با نحوهٔ کار CDN، مقالهٔ CDN چیست را بخوانید.

مدیریت روزمره: دیدن، آزاد کردن و تست

دستورهایی که بیشترین کاربرد را دارند:

# فهرست jailهای فعال
sudo fail2ban-client status
# آی‌پی‌های بن‌شدهٔ SSH
sudo fail2ban-client status sshd
# آزاد کردن یک آی‌پی (مثلاً آی‌پی خودتان)
sudo fail2ban-client set sshd unbanip 203.0.113.25
# بن دستی یک آی‌پی
sudo fail2ban-client set sshd banip 198.51.100.7
# دیدن لاگ خود Fail2ban
sudo tail -f /var/log/fail2ban.log

برای آزمودن فیلتر روی لاگ واقعی، ابزار fail2ban-regex بسیار مفید است و نشان می‌دهد هر فیلتر چند خط را تطبیق داده است:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
ترتیب درست امن‌سازی ورود
  1. ورود با کلید SSH

    کلید بسازید، روی سرور بگذارید و ورود با رمز را غیرفعال کنید.

  2. فعال‌سازی UFW

    پیش از فعال‌سازی پورت SSH را باز کنید تا قفل نشوید.

  3. نصب Fail2ban

    با apt نصب و سرویس را enable کنید.

  4. تنظیم jail.local

    jail مربوط به sshd، پورت درست و ignoreip را تعریف کنید.

  5. بررسی دوره‌ای

    با fail2ban-client status و لاگ fail2ban از کارکرد درست مطمئن شوید.

شکل ۳ Fail2ban لایهٔ آخر است؛ اول کلید SSH و فایروال را درست کنید.

خطاهای رایج و رفع آن‌ها

خودتان را بن کردید: اگر چند بار رمز اشتباه زدید و دیگر به SSH وصل نمی‌شوید، از کنسول وب ارائه‌دهنده (VNC) وارد شوید و آی‌پی خود را با unbanip آزاد کنید. یا چند دقیقه صبر کنید تا bantime تمام شود. برای جلوگیری از تکرار، آی‌پی ثابت خود را در ignoreip بگذارید. اگر اتصال کاملاً قطع است، راهنمای خطای Connection timed out در SSH کمک می‌کند علت را از بن شدن جدا کنید.

سرویس اجرا نمی‌شود: معمولاً خطای نگارشی در jail.local است. با دستور زیر پیکربندی را تست کنید؛ خطا همراه با شمارهٔ خط نمایش داده می‌شود:

sudo fail2ban-client -t

هیچ آی‌پی‌ای بن نمی‌شود: احتمالاً منبع لاگ اشتباه است. روی سیستم‌هایی که فایل /var/log/auth.log ندارند، backend = systemd لازم است. با fail2ban-regex بررسی کنید فیلتر اصلاً خطی را پیدا می‌کند یا نه.

بعد از ری‌استارت، بن‌ها پاک شدند: Fail2ban بن‌های فعال را در پایگاه دادهٔ خودش نگه می‌دارد و پس از راه‌اندازی دوباره اعمال می‌کند، اما اگر dbfile را غیرفعال کرده باشید این اطلاعات از بین می‌رود.

چک‌لیست نهایی امنیت ورود

  • ورود با کلید SSH فعال و ورود با رمز غیرفعال است.
  • UFW فعال است و فقط پورت‌های لازم باز هستند.
  • jail مربوط به sshd با پورت درست فعال است.
  • آی‌پی ثابت مدیریت در ignoreip قرار دارد.
  • هر چند وقت یک‌بار fail2ban-client status sshd را نگاه می‌کنید تا از کار کردنش مطمئن شوید.

برای مرور کامل اقدامات امنیتی بعد از تحویل سرور، چک‌لیست امنیت سرور جدید را دنبال کنید. اگر برای تمرین این تنظیمات به یک سرور آزمایشی نیاز دارید، می‌توانید در کلودیفای یک سرور ساعتی بسازید، تنظیمات را امتحان کنید و پس از پایان کار حذفش کنید تا فقط هزینهٔ همان چند ساعت را بپردازید.

سؤالات متداول

آیا Fail2ban جای فایروال را می‌گیرد؟

خیر. Fail2ban خودش فایروال نیست، بلکه با خواندن لاگ‌ها قاعدهٔ موقت به فایروال اضافه می‌کند. همچنان باید با UFW یا nftables پورت‌های غیرضروری را ببندید و Fail2ban را به‌عنوان لایهٔ تکمیلی استفاده کنید.

وقتی ورود با رمز SSH را بسته‌ام، باز هم Fail2ban لازم است؟

خطر نفوذ با حدس رمز عملاً از بین می‌رود، اما ربات‌ها همچنان تلاش می‌کنند و لاگ را پر می‌کنند. Fail2ban این ترافیک مزاحم را کم می‌کند و برای سرویس‌های دیگر مثل پنل وب یا ایمیل هم مفید است.

چطور بفهمم Fail2ban واقعاً کار می‌کند؟

دستور fail2ban-client status sshd تعداد تلاش‌های ناموفق و آی‌پی‌های بن‌شده را نشان می‌دهد. روی سروری که آی‌پی عمومی دارد، معمولاً پس از مدت کوتاهی چند آی‌پی در فهرست بن دیده می‌شود.

مقدار مناسب bantime چقدر است؟

برای شروع یک ساعت مناسب است. اگر حملات تکراری زیاد است، بن تصاعدی را فعال کنید تا مهاجمان تکراری هر بار مدت طولانی‌تری مسدود شوند، بدون اینکه کاربر واقعی‌ای که یک بار اشتباه کرده برای همیشه پشت در بماند.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.