ورود غیرمجاز به سرور معمولاً اولین قدم یک نفوذ جدی است. خوشبختانه لینوکس تقریباً هر ورود و تلاش ناموفق را ثبت میکند. در این راهنما یاد میگیریم Loginهای مشکوک لینوکس را با دستورهای last، lastb، w و who و تحلیل لاگهای auth.log و journald بررسی کنیم، ورودهای غیرعادی را تشخیص دهیم و برای هر ورود موفق هشدار فوری دریافت کنیم.
فهرست مطالب
لینوکس ورودها را کجا ثبت میکند؟
| منبع | محتوا | ابزار خواندن |
|---|---|---|
/var/run/utmp |
کاربران وارد در همین لحظه | w، who |
/var/log/wtmp |
تاریخچه ورود و خروجها و ریاستارتها | last |
/var/log/btmp |
تلاشهای ناموفق ورود | lastb |
/var/log/auth.log (Debian و Ubuntu) یا /var/log/secure (RHEL) |
جزئیات احراز هویت، SSH و sudo | grep، less |
| journald | همه لاگهای سرویسها، از جمله SSH | journalctl |
در برخی توزیعهای جدید که rsyslog بهطور پیشفرض نصب نیست (مثل Debian ۱۲)، فایل auth.log وجود ندارد و باید از journalctl استفاده کنید. ممکن است نام سرویس SSH در Ubuntu و Debian ssh و در RHEL sshd باشد.
چه کسی همین الان وارد است؟
w
who -a
خروجی w نام کاربر، ترمینال، IP مبدأ، زمان ورود و دستوری که در حال اجراست را نشان میدهد. اگر نشستی از IP ناشناس میبینید، فوراً بررسی کنید.
تاریخچه ورودهای موفق و ناموفق
last -a -n 30 # ۳۰ ورود اخیر با IP در انتهای خط
last -a root # ورودهای کاربر root
last reboot # زمان ریاستارتها
sudo lastb -a -n 30 # تلاشهای ناموفق اخیر
lastlog # آخرین ورود هر کاربر
خروجی lastlog بهخصوص برای کاربران سیستمی مفید است: کاربری که هرگز نباید وارد شود (مثل www-data یا mysql) نباید هیچ ورودی ثبتشدهای داشته باشد.
تحلیل لاگ SSH
# ورودهای موفق و روش احراز هویت
sudo grep -E "Accepted (password|publickey)" /var/log/auth.log | tail -20
# معادل با journald
sudo journalctl -u ssh --since "7 days ago" | grep Accepted
# پرتکرارترین IPهای ناموفق
sudo grep "Failed password" /var/log/auth.log | grep -oE "from [0-9.]+" | sort | uniq -c | sort -rn | head
# تلاش برای نامهای کاربری نامعتبر
sudo grep "Invalid user" /var/log/auth.log | awk '{print $8}' | sort | uniq -c | sort -rn | head
یک خط ورود موفق شامل نام کاربر، IP، پورت و روش احراز هویت است؛ مثلاً Accepted publickey for admin from 203.0.113.10. اگر ورود با کلید انجام شده، اثر انگشت کلید هم ثبت میشود که با آن میتوانید تشخیص دهید کدام کلید استفاده شده است:
ssh-keygen -lf ~/.ssh/authorized_keys
ورود مشکوک چه شکلی دارد؟
- ورود موفق بعد از تعداد زیادی تلاش ناموفق از همان IP؛ نشانه حدس موفق رمز.
- ورود با رمز عبور در حالی که فکر میکردید فقط ورود با کلید فعال است.
- IP، کشور یا ارائهدهنده ناآشنا، بهخصوص اگر شما و تیمتان همیشه از IPهای مشخصی وصل میشوید.
- ساعت غیرعادی، مثلاً نیمهشب.
- ورود کاربر سیستمی یا کاربری که مدتهاست استفاده نشده.
- فاصلههای خالی در لاگها یا فایلهای wtmp و auth.log که ناگهان کوچک شدهاند؛ نشانه پاکسازی لاگ.
تعداد زیاد تلاش ناموفق بهتنهایی طبیعی است؛ هر سرور عمومی هر روز هدف رباتهاست. چیزی که اهمیت دارد، ورود موفق غیرمنتظره است. برای کاهش این نویز، Fail2ban را نصب کنید.
پیگیری استفاده از sudo
sudo grep "sudo:" /var/log/auth.log | grep COMMAND | tail -20
sudo journalctl _COMM=sudo --since today
هر دستوری که با sudo اجرا شده، همراه با کاربر و مسیر ثبت میشود. دستورهایی مثل ساخت کاربر، تغییر authorized_keys یا دانلود و اجرای اسکریپت از اینترنت توسط کاربر ناشناس، علامت خطر جدی هستند.
هشدار فوری برای هر ورود
با PAM میتوانید برای هر ورود موفق SSH یک اسکریپت اجرا کنید. فایل /usr/local/bin/login-alert.sh:
#!/bin/bash
[ "$PAM_TYPE" = "open_session" ] || exit 0
MSG="ورود SSH: کاربر $PAM_USER از $PAM_RHOST به $(hostname) در $(date '+%F %T')"
curl -s -m 5 --data-urlencode "text=$MSG" \
"https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage?chat_id=YOUR_CHAT_ID" >/dev/null
exit 0
sudo chmod 700 /usr/local/bin/login-alert.sh
echo "session optional pam_exec.so /usr/local/bin/login-alert.sh" | sudo tee -a /etc/pam.d/sshd
گزینه optional باعث میشود اگر اسکریپت خطا داد، ورود شما مسدود نشود. بهجای تلگرام میتوانید از ایمیل یا هر سرویس پیامرسان دیگری استفاده کنید. پس از تنظیم، در یک ترمینال جدید وارد شوید و دریافت پیام را آزمایش کنید.
نگهداری لاگها خارج از سرور
مهاجمی که دسترسی root بگیرد، میتواند لاگها را پاک یا دستکاری کند. ارسال لاگها به یک سرور مرکزی (با rsyslog، Loki، Graylog یا ابزارهای مشابه) باعث میشود حتی پس از نفوذ، سابقه ورودها حفظ شود. ارتباط سرورها با سرور لاگ را از طریق شبکه خصوصی برقرار کنید.
اگر ورود مشکوک پیدا کردید
- نشست فعال مهاجم را قطع کنید:
sudo pkill -KILL -u USERNAMEیا فرایند sshd مربوط به آن نشست را متوقف کنید. - رمز کاربر را تغییر دهید و کلیدهای ناشناس را از authorized_keys حذف کنید.
- بررسی کنید مهاجم پس از ورود چه کرده است؛ نشانهها و دستورهای بررسی در چگونه بفهمیم سرور Linux هک شده است.
- اگر دسترسی root گرفته شده، سرور را آلوده فرض کنید و از نو بسازید.
- ورود با رمز را غیرفعال و SSH را محدود کنید؛ راهنما در امنیت SSH.
سوالات متداول
آیا مهاجم میتواند تاریخچه last را پاک کند؟
اگر دسترسی root داشته باشد، بله؛ میتواند فایلهای wtmp، btmp و auth.log را تغییر دهد. ارسال لاگها به سرور مرکزی و هشدار فوری ورود، این ریسک را پوشش میدهد.
چرا هر روز صدها تلاش ناموفق در لاگ میبینم؟
رباتها دائماً کل اینترنت را برای SSH اسکن میکنند. با ورود فقط با کلید، این تلاشها بیخطرند و Fail2ban حجم آنها را کم میکند.
دستور lastb خروجی ندارد؛ یعنی تلاش ناموفقی نبوده؟
نه لزوماً. در برخی سیستمها فایل btmp ثبت نمیشود یا به دلیل تنظیمات SSH، تلاشهای ناموفق فقط در auth.log یا journald دیده میشوند.
لاگها چه مدت نگهداری میشوند؟
بسته به تنظیمات logrotate و journald، معمولاً چند هفته. اگر به سابقه طولانیتر نیاز دارید، مدت نگهداری را افزایش دهید یا لاگها را به سرور مرکزی بفرستید.
مدیریت امن سرورهای لینوکس
برای پایش ورودها، هشداردهی و سختسازی سرورها، از پشتیبانی تخصصی سرور و مانیتورینگ ۲۴ ساعته تراست هاست کمک بگیرید.