این پرسش به‌ندرت از هیچ‌جا پیدا می‌شود. سرور کندتر شده، یا ارائه‌دهنده میزبانی درباره ترافیک خروجی نامه فرستاده، یا در ایمیل شما اعلانی درباره ورودی هست که هرگز انجامش نداده‌اید. سپس بخش ناخوشایند از راه می‌رسد: روشن نیست به کجا نگاه کنید و با چه ترتیبی، و نخستین واکنش — همه‌چیز را پاک کن و از نو شروع کن — تقریباً همیشه زودهنگام است.

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

گام نخست: چه کسی وارد شد

از ورودها آغاز کنید. اگر کسی دیگر وارد شده باشد، تقریباً به‌یقین از راه SSH آمده و ردی به‌جا گذاشته است.

last -20
lastb | head -20
who

last آخرین ورودهای موفق را نشان می‌دهد، lastb ناموفق‌ها را، و who کسی را که هم‌اکنون متصل است. آنچه اهمیت دارد شمار نیست بلکه شکل است. هزاران تلاش ناموفق از نشانی‌هایی که هرگز بازنمی‌گردند، پس‌زمینه معمول حدس‌زدن کورکورانه است؛ بی‌وقفه علیه هر نشانی عمومی اجرا می‌شود و هیچ معنایی ندارد.

آنچه باید نگرانتان کند چیز دیگری است:

  • ورود موفق از نشانی‌ای که هیچ‌کس از تیم شما آنجا نیست؛
  • ورود با نام کاربری‌ای که هرگز نساخته‌اید؛
  • تلاش‌های ناموفق علیه نام کاربری‌ای که روی این ماشین واقعاً وجود دارد — یعنی کسی دریافته کاربران شما چه کسانی‌اند، به‌جای آنکه واژه‌نامه‌ای را بیازماید؛
  • نشستی که هم‌اکنون باز است و شما بازش نکرده‌اید.

جداگانه بررسی کنید که کلیدهای ناآشنا پیدا نشده باشند. فایل ~/.ssh/authorized_keys رایج‌ترین راه ماندن در درون است: گذرواژه را هر چقدر بخواهید می‌توان عوض کرد، اما کلید می‌ماند.

cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys

هر سطر آنجا دسترسی کسی است. اگر نمی‌توانید بگویید از آنِ کیست، بیگانه‌اش بشمارید.

گام دوم: چه چیزی در سامانه تغییر کرد

نفوذ تقریباً همیشه ردی روی دیسک می‌گذارد: فایل اجرایی جایگزین‌شده، سطری اضافی در پیکربندی، فایلی تازه در پوشه وب‌سرور. بررسی این با چشم بیهوده است — به یک مرجع نیاز دارید.

روی Debian و Ubuntu مرجع از پیش موجود است: هر بسته جمع‌های کنترلی فایل‌های خودش را می‌داند.

sudo apt install debsums
sudo debsums -c

این فرمان فایل‌هایی را فهرست می‌کند که با آنچه توزیع نصب کرده تفاوت دارند. بخشی از یافته‌ها مشروع خواهد بود — فایل‌های پیکربندی در /etc اصلاً برای ویرایش‌شدن هستند. اما فایل اجرایی تغییریافته در /usr/bin، /usr/sbin یا /bin روی سروری که هرگز با دست لمسش نکرده‌اید، چیز دیگری است.

سرچشمه دوم فایل‌های تازه‌اند در جایی که نباید باشند. وب‌شل معمولاً در پوشه بارگذاری می‌نشیند و مانند یک .php بی‌آزار به نظر می‌رسد:

find /var/www -type f -name '*.php' -mtime -14 -ls

چهارده روز تنها یک نقطه آغاز است؛ بازه‌ای را به کار ببرید که می‌دانید در آن چیزی منتشر نکرده‌اید.

گام سوم: چه چیزی بیرون می‌رود

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

ss -tulpn
ss -tp state established

فرمان نخست نشان می‌دهد چه چیزی گوش می‌دهد، و دومی چه چیزی هم‌اکنون متصل است. ستون فرایند را بخوانید. آنچه پرسش برمی‌انگیزد: فرایندی ناآشنا که روی 0.0.0.0 گوش می‌دهد؛ اتصال‌های خروجی به پورت‌های بالای نشانی‌هایی که برنامه شما با آن‌ها کاری ندارد؛ و بیش از همه فرایندی که از /tmp یا /dev/shm اجرا شده — هیچ چیز مشروعی از این پوشه‌ها اجرا نمی‌شود.

حالا که آنجایید، به بار پردازنده هم نگاهی بیندازید. استخراج‌کننده رمزارز خود را با مشغول نگه‌داشتن پردازنده روی سایتی که هیچ محبوبیتی ندارد لو می‌دهد.

اگر نشانه‌ها موجود باشند

نخستین انگیزه پاک‌سازی سریع است: کلید بیگانه را حذف کن، فرایند را بکش، فایل را بردار. این کار را نکنید — دقیقاً همان چیزی را نابود می‌کنید که می‌توانست بعدها توضیح دهد چگونه وارد شدند. و اگر این ناروشن بماند، بازخواهند گشت، شاید همین فردا.

ترتیبی که هم داده‌ها و هم تصویر را نگاه می‌دارد:

  1. اگر نزد ارائه‌دهنده‌تان ممکن است، یک تصویر لحظه‌ای از دیسک بگیرید. این تنها گامی است که بعدها تکرارشدنی نیست.
  2. ماشین را از شبکه جدا کنید یا همه‌چیز جز نشانی IP خودتان را ببندید — اما خاموشش نکنید. خاموش‌کردن فهرست فرایندها و اتصال‌های باز را از دست می‌دهد، و این نیمی از شواهد است.
  3. گزارش‌ها را از ماشین بیرون کپی کنید: /var/log/auth.log، گزارش‌های وب‌سرور، و خروجی سه فرمان بالا.
  4. و تنها اکنون دریابید چگونه وارد شدند.

نصب مجدد پاک پایان درستی است اگر دسترسی با اختیارات root به دست آمده باشد. هیچ اندازه‌ای از پاک‌سازی تضمین نمی‌کند که چیزی جا نمانده است. اما نصب مجدد بدون فهمیدن علت بی‌فایده است: همان سوراخ را روی سامانه‌ای تازه بازمی‌گردانید.

چگونه نگذاریم این پرسش ناگهانی از راه برسد

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

هر یک از این بررسی‌ها همچون ابزاری جداگانه وجود دارد که می‌تواند پیوسته پایش کند: ورودهای ناموفق — fail2ban، تغییر فایل‌ها — AIDE، یکپارچگی بسته‌ها — debsums، پورت‌های باز — تصویری منظم از ss. نصب یکایک آن‌ها دشوار نیست؛ دشوار آن است که عادت کنید هر روز وارد شوید و شش خروجی گوناگون بخوانید، و به همین دلیل در عمل کسی آن‌ها را نمی‌خواند.

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