ایمن سازی سرور های لینوکسی: پیاده سازی معماری دفاع در عمق با پیکربندی پیشرفته UFW و Fail2Ban

3–5 دقیقه

مفهوم «دفاع در عمق» (Defense in Depth) یکی از اصول بنیادین در امنیت سایبری است. تکیه بر یک لایه امنیتی، خطای استراتژیکی است که می‌تواند منجر به نفوذهای جبران‌ناپذیر شود. در محیط‌های لینوکسی (مانند Debian و Ubuntu)، فایروال‌ها در لایه شبکه عمل می‌کنند، اما حملاتی مانند Brute-Force در لایه اپلیکیشن (Application Layer) رخ می‌دهند. در این مقاله مستند، نحوه ترکیب UFW (لایه شبکه) و Fail2Ban (لایه اپلیکیشن) را برای ایجاد یک سد دفاعی مستحکم بررسی خواهیم کرد.

چرا UFW انتخاب هوشمندانه‌ای برای مدیریت ترافیک است؟

برای یک مدیر سیستم، پایداری و سرعت در پیکربندی اهمیت بالایی دارد. UFW (Uncomplicated Firewall) در واقع یک رابط کاربری ساده‌سازی شده (Frontend) برای iptables و فریم‌ورک زیرساختی Netfilter در هسته لینوکس است.

تفاوت کلیدی با Iptables: در حالی که Iptables نیازمند درک عمیق از زنجیره‌ها (Chains) و جداول (Tables) است، UFW با انتزاع این پیچیدگی‌ها، احتمال خطای انسانی در نوشتن رول‌ها (Rules) را به حداقل می‌رساند، بدون اینکه از قدرت Netfilter کاسته شود.

پیکربندی اصولی UFW در محیط پروداکشندر هر معماری امنیتی، سیاست پیش‌فرض (Default Policy) باید بر مبنای “مسدودسازی همه‌چیز” (Default Deny) باشد.

۱. تنظیم سیاست‌های پایه

ابتدا ترافیک ورودی را مسدود و ترافیک خروجی را مجاز می‌کنیم:

sudo ufw default deny incoming
sudo ufw default allow outgoing

۲. مدیریت هوشمندانه پورت SSH

باز گذاشتن پورت ۲۲ (پیش‌فرض SSH) در سطح اینترنت، دعوتنامه‌ای برای بات‌نت‌هاست. تغییر پورت SSH به یک پورت غیرمعمول (مانند ۲۲۸۸) یک لایه امنیتی مبتنی بر ابهام (Security through Obscurity) ایجاد می‌کند.

علاوه بر تغییر پورت، ما از ماژول limit در UFW استفاده می‌کنیم. این پارامتر در صورت وجود بیش از ۶ اتصال در ۳۰ ثانیه از یک IP، اتصال را مسدود می‌کند:

# باز کردن پورت‌های وب
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# تنظیم پورت سفارشی SSH با محدودیت اتصال (Rate Limiting)
sudo ufw limit 2288/tcp

# فعال‌سازی فایروال
sudo ufw enable

چالش: محدودیت‌های فایروال در برابر حملات Brute-Force

با وجود استفاده از ufw limit، مهاجمی که با سرعت پایین (Low and Slow) اقدام به تست رمزهای عبور کند، از رادار فایروال عبور خواهد کرد. فایروال‌های سنتی محتوای ترافیک یا لاگ‌های احراز هویت را درک نمی‌کنند. اینجاست که نیازمند یک ابزار Application-Aware هستیم که لاگ‌های سیستم (مانند /var/log/auth.log) را تحلیل کند.

معرفی Fail2Ban: سیستم تشخیص و جلوگیری از نفوذ (IPS)

Fail2Ban به عنوان یک ناظر هوشمند، لاگ سرویس‌ها را به صورت لحظه‌ای (Real-time) پایش می‌کند. اگر تعداد دفعات لاگین ناموفق از حد مجاز فراتر رود، Fail2Ban با ارسال دستور به فایروال (UFW یا Iptables)، آدرس IP مهاجم را مسدود (Ban) می‌کند.

پیکربندی حرفه‌ای فایل jail.local

پس از نصب Fail2Ban (sudo apt install fail2ban)، نباید فایل اصلی jail.conf را ویرایش کنیم، زیرا در به‌روزرسانی‌ها بازنویسی می‌شود. یک کپی با نام jail.local ایجاد می‌کنیم.

تنظیمات زیر نشان‌دهنده درک عمیق از رفتار مهاجمان است:

# /etc/fail2ban/jail.local

[DEFAULT]
# آی‌پی‌هایی که هرگز نباید مسدود شوند (Loopback و IP مدیر سیستم)
ignoreip = 127.0.0.1/8 ::1 192.168.1.50

# مدت زمان مسدود ماندن مهاجم (۱ ساعت)
bantime = 3600

# بازه زمانی بررسی لاگ‌ها (۱۰ دقیقه)
findtime = 600

# حداکثر تعداد تلاش ناموفق مجاز
maxretry = 3

# تنظیم UFW به عنوان اکشن اجرایی
banaction = ufw

[sshd]
enabled = true
port = 2288
logpath = %(sshd_log)s
backend = systemd

برای اعمال تنظیمات:

sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

تست و اثبات عملکرد (Proof of Concept)

به عنوان یک مهندس سیستم، پیکربندی بدون تست بی‌معنی است. برای بررسی وضعیت سرویس‌ها و مشاهده IPهای مسدود شده، از دستورات زیر استفاده می‌کنیم:

sudo fail2ban-client status
sudo fail2ban-client status sshd

نمونه خروجی مورد انتظار:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   198.51.100.23

با اجرای sudo ufw status مشاهده خواهید کرد که Fail2Ban به صورت خودکار یک Rule در بالای لیست UFW برای مسدودسازی IP مهاجم (198.51.100.23) اضافه کرده است.

نتیجه‌گیری

ترکیب UFW و Fail2Ban یک معماری امنیتی پویا و واکنش‌گرا ایجاد می‌کند. با این حال، در محیط‌های Enterprise، تغییر پورت و مسدودسازی IPها تنها یک لایه از دفاع هستند. قدم نهایی و قطعی برای امن‌سازی دسترسی ریموت، غیرفعال کردن کامل احراز هویت با رمز عبور (PasswordAuthentication no) در پیکربندی SSH و استفاده انحصاری از کلیدهای رمزنگاری نامتقارن (SSH Keys) است.

Leave a Comment