چگونه بفهمیم چه IPهایی به SSH سرور مجازی حمله می‌کنند
لینوکس

چگونه بفهمیم چه IPهایی به SSH سرور مجازی حمله می‌کنند؟

 

اگر یک بار هم که شده به لاگ‌های سرور مجازی‌تان نگاه انداخته باشید، احتمالاً با چیزی شبیه صدها یا حتی هزاران تلاش ورود ناموفق به SSH مواجه شده‌اید؛ آن هم از IPهایی که هیچ‌وقت خودتان با آن‌ها به سرور وصل نشده‌اید. نگران نباشید، این یک اتفاق نادر یا نشانه‌ای از اینکه فقط سرور شما هدف قرار گرفته نیست؛ در واقع تقریباً هر سروری که پورت ۲۲ (یا هر پورت باز دیگری برای SSH) روی اینترنت داشته باشد، به‌طور مداوم هدف اسکن و حمله بروت‌فورس (Brute Force) خودکار از سوی ربات‌ها قرار می‌گیرد.

نکته مهم این است که دیدن این تلاش‌ها در لاگ، به‌تنهایی به معنای نفوذ موفق نیست؛ اما نادیده گرفتن آن‌ها هم درست نیست. در این مقاله یاد می‌گیرید چطور دقیقاً بفهمید چه IPهایی سرورتان را هدف قرار داده‌اند، چطور بفهمید آیا واقعاً کسی موفق به ورود شده یا نه، و در نهایت چطور با ابزارهایی مثل Fail2Ban به‌صورت خودکار جلوی این حملات را بگیرید.

اول بفهمیم اصلاً چرا سرور من هدف قرار گرفته؟

خیلی از کاربران تازه‌کار فکر می‌کنند چون سرورشان کوچک است یا سایت پربازدیدی روی آن نیست، دلیلی ندارد کسی سراغش برود. اما واقعیت این است که این حملات معمولاً هدفمند و انسانی نیستند؛ بلکه باتنت‌های خودکار به‌صورت مداوم کل بازه‌های IP اینترنت را اسکن می‌کنند و به محض پیدا کردن پورت SSH باز، شروع به امتحان کردن ترکیب‌های رایج نام‌کاربری و پسورد می‌کنند (مثل root/123456 یا admin/admin). هدف آن‌ها معمولاً نفوذ به هر سروری است که امنیت پایینی داشته باشد، تا از آن برای ارسال اسپم، حملات DDoS یا استخراج ارز دیجیتال استفاده کنند. پس این حملات را شخصی نگیرید؛ اما جدی هم بگیرید.

قدم اول: بررسی لاگ‌های ورود SSH

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

/var/log/auth.log      # اوبونتو و دبیان
/var/log/secure        # CentOS, RHEL, AlmaLinux, Rocky Linux

برای مشاهده چند خط آخر این فایل، از دستور زیر استفاده کنید:

tail -n 100 /var/log/auth.log

اگر سرور شما از systemd استفاده می‌کند (که امروزه تقریباً همه توزیع‌ها استفاده می‌کنند)، می‌توانید مستقیماً لاگ‌های مربوط به سرویس SSH را با journalctl هم ببینید:

journalctl -u sshd -n 100 --no-pager

در این لاگ‌ها دنبال خطوطی با عبارت‌هایی مثل Failed password for یا Invalid user بگردید؛ این‌ها دقیقاً همان تلاش‌های ناموفق ورود هستند که هرکدام IP مبدأ خودشان را هم نمایش می‌دهند.

قدم دوم: استخراج و شمارش IPهای مهاجم

خواندن لاگ خط‌به‌خط برای هزاران خط عملاً غیرممکن است، پس بهتر است از ترکیب چند دستور ساده لینوکسی برای استخراج و شمارش IPها استفاده کنیم.

شمارش تعداد تلاش ناموفق به تفکیک IP (اوبونتو/دبیان)

grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

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

همان دستور برای CentOS / RHEL / AlmaLinux / Rocky

grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

مشاهده تلاش‌های ورود با نام‌کاربری نامعتبر

مهاجمان معمولاً نام‌کاربری‌های رایج (مثل admin، test، ubuntu، oracle) را هم امتحان می‌کنند. برای دیدن این موارد:

grep "Invalid user" /var/log/auth.log | awk '{print $(NF-1), $(NF)}' | sort | uniq -c | sort -nr | head -20

استفاده از دستور lastb برای دیدن لاگین‌های ناموفق

دستور lastb هم یک نمای کلی و خوانا از تلاش‌های ناموفق ورود اخیر به شما می‌دهد:

lastb -a | head -30

قدم سوم: آیا این IPها فقط تلاش کرده‌اند یا واقعاً وارد شده‌اند؟

این مهم‌ترین سوالی است که باید به آن پاسخ بدهید. برای این کار باید بین دو نوع لاگ تفاوت قائل شوید:

  • Failed password for یا Invalid user یعنی تلاش برای ورود انجام شده ولی موفق نبوده.
  • Accepted password for یا Accepted publickey for یعنی ورود با موفقیت انجام شده است.

برای پیدا کردن ورودهای موفق، این دستور را اجرا کنید:

grep "Accepted" /var/log/auth.log

اگر در خروجی این دستور، IP یا زمانی دیدید که مطمئن هستید خودتان یا هم‌تیمی‌هایتان از آن‌جا وارد نشده‌اید، این یک هشدار جدی است و باید بلافاصله به بخش «اگر سرورتان نفوذ شده» در پایین این مقاله مراجعه کنید. برای دیدن یک لیست کامل و خوانا از تمام ورودهای موفق اخیر هم می‌توانید از دستور زیر استفاده کنید:

last -a

قدم چهارم: پیدا کردن اطلاعات بیشتر درباره IP مهاجم

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

whois 185.xxx.xxx.xxx

خروجی این دستور معمولاً کشور، ارائه‌دهنده اینترنت (ISP) و سازمان مالک آن رنج IP را نشان می‌دهد. اگر whois روی سرور نصب نیست، با دستور زیر (بسته به توزیع) آن را نصب کنید:

apt install whois -y      # اوبونتو/دبیان
yum install whois -y      # CentOS/RHEL

همچنین می‌توانید از سایت‌های تخصصی مثل AbuseIPDB برای بررسی سابقه یک IP در حملات قبلی استفاده کنید؛ این سایت‌ها معمولاً نشان می‌دهند آیا این IP قبلاً هم توسط دیگر مدیران سرور به‌عنوان منبع حمله گزارش شده یا نه. جالب است بدانید خود شما هم می‌توانید IPهای مهاجم را در همین سایت‌ها گزارش کنید تا به جامعه‌ی امنیتی کمک کنید.

قدم پنجم: مسدودسازی خودکار مهاجمان با Fail2Ban

حالا که فهمیدید چطور مهاجمان را شناسایی کنید، وقت آن رسیده که این کار را به‌صورت خودکار انجام دهید. Fail2Ban محبوب‌ترین ابزار برای این کار است؛ این نرم‌افزار به‌صورت مداوم لاگ‌های سیستم را زیر نظر می‌گیرد و به محض اینکه یک IP بیش از تعداد مشخصی تلاش ناموفق داشته باشد، آن IP را به‌صورت خودکار و موقت (یا حتی دائم) در فایروال مسدود می‌کند.

نصب Fail2Ban

apt install fail2ban -y      # اوبونتو/دبیان
yum install fail2ban -y      # CentOS/RHEL (نیاز به فعال‌سازی مخزن EPEL دارد)

فعال‌سازی حفاظت از SSH

بعد از نصب، یک فایل تنظیمات محلی بسازید تا آپدیت‌های بعدی تنظیمات پیش‌فرض را بازنویسی نکنند:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

داخل این فایل، به بخش [sshd] بروید و تنظیماتی مثل موارد زیر را بررسی یا اضافه کنید:

[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 600
bantime = 3600

این تنظیمات یعنی: اگر یک IP در بازه ۶۰۰ ثانیه (۱۰ دقیقه) بیش از ۵ بار تلاش ناموفق داشته باشد، به مدت ۳۶۰۰ ثانیه (۱ ساعت) مسدود شود. برای مسدودسازی طولانی‌تر یا حتی دائمی مهاجمان مکرر، می‌توانید مقدار bantime را افزایش دهید یا آن را روی -1 بگذارید (مسدودسازی دائم).

سرویس را ری‌استارت کنید تا تنظیمات اعمال شود:

systemctl restart fail2ban

مشاهده لیست IPهای مسدودشده

برای دیدن اینکه چه IPهایی در حال حاضر توسط Fail2Ban مسدود شده‌اند:

fail2ban-client status sshd

قدم ششم: راهکارهای پیشگیرانه برای کاهش اصولی حملات

مسدودسازی خودکار خوب است، اما بهتر است اصلاً سطح حمله را کوچک‌تر کنید. این کارها را جدی بگیرید:

  • ورود با پسورد را برای روت کاملاً غیرفعال کنید. در فایل /etc/ssh/sshd_config مقدار PermitRootLogin را روی no تنظیم کنید و به‌جای آن از یک کاربر معمولی با دسترسی sudo استفاده کنید.
  • احراز هویت را از پسورد به کلید SSH تغییر دهید. با تنظیم PasswordAuthentication no در همان فایل، عملاً حملات بروت‌فورس پسورد را بی‌اثر می‌کنید، چون بدون داشتن کلید خصوصی شما، امکان ورود برای هیچ‌کس وجود ندارد.
  • پورت پیش‌فرض SSH را تغییر دهید. این کار امنیت واقعی ایجاد نمی‌کند، اما حجم اسکن‌های خودکار و ساده روی پورت ۲۲ را به‌شدت کاهش می‌دهد. مقدار Port را در sshd_config به یک عدد دلخواه (مثلاً بالای ۱۰۲۴) تغییر دهید.
  • دسترسی SSH را با فایروال محدود کنید. اگر همیشه از یک یا چند IP یا رنج ثابت به سرور وصل می‌شوید، با ufw یا firewalld فقط به همان IPها اجازه اتصال به پورت SSH را بدهید.
  • از تأیید هویت دو مرحله‌ای (2FA) برای SSH استفاده کنید. ابزارهایی مثل Google Authenticator PAM Module یک لایه امنیتی اضافه به فرآیند ورود اضافه می‌کنند.

اگر متوجه شدید سرور واقعاً نفوذ شده…

اگر در بخش «ورودهای موفق» به IP یا زمانی برخوردید که قطعاً کار شما یا تیم‌تان نبوده، دیگر با یک حمله ساده بروت‌فورس ناموفق طرف نیستید. در این حالت باید فرض کنید مهاجم به سرور دسترسی داشته و ممکن است بک‌دور، کاربر جدید، یا کران‌جاب مخفی روی سیستم ایجاد کرده باشد. توصیه اصلی در چنین شرایطی این است که به‌جای تلاش برای پاک‌سازی دستی یک سیستم آلوده (که همیشه ریسک باقی ماندن رد پای مهاجم را دارد)، سرور را از یک نسخه پشتیبان سالم و قبل از تاریخ نفوذ بازسازی کنید و پسوردها و کلیدهای SSH را به‌طور کامل تعویض نمایید.

جمع‌بندی

دیدن صدها تلاش ناموفق ورود در لاگ‌های SSH سرورتان، اتفاقی عجیب یا نشانه یک حمله شخصی نیست؛ این بخشی طبیعی از زندگی هر سروری است که به اینترنت متصل باشد. نکته اصلی این است که این تلاش‌ها را نادیده نگیرید: به‌طور دوره‌ای لاگ‌ها را چک کنید، بین تلاش ناموفق و ورود موفق تفاوت قائل شوید، و مهم‌تر از همه، با ابزارهایی مثل Fail2Ban و غیرفعال کردن ورود پسوردی، اصلاً فرصت را از مهاجمان بگیرید.


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

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

آیا تغییر پورت SSH به‌تنهایی کافی است؟ خیر. تغییر پورت فقط حجم اسکن‌های ساده و خودکار را کاهش می‌دهد، اما جایگزین امنیت واقعی مثل غیرفعال کردن ورود با پسورد و استفاده از کلید SSH نمی‌شود.

Fail2Ban چطور IPهای مهاجم را مسدود می‌کند؟ Fail2Ban با خواندن مداوم لاگ‌های سیستم، الگوهای تلاش ناموفق را شناسایی می‌کند و به‌صورت خودکار با استفاده از فایروال سیستم (مثل iptables یا nftables) یک قانون موقت برای مسدود کردن آن IP اضافه می‌کند.

اگر IP مهاجم هر بار تغییر کند چه باید کرد؟ این رفتار رایج در حملات باتنتی توزیع‌شده است. در این حالت، به‌جای تکیه صرف بر مسدودسازی IP، بهتر است اصلاً ورود با پسورد را غیرفعال کرده و فقط احراز هویت با کلید SSH را فعال نگه دارید؛ در این صورت هر تعداد IP هم که تلاش کند، بدون کلید خصوصی امکان ورود نخواهد داشت.

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

💬 دیدگاه‌ها 0

هنوز دیدگاهی ثبت نشده است. اولین نفری باشید که نظر می‌دهید!

✍️ دیدگاه خود را بنویسید