«روی لینوکس به ضدویروس نیازی نیست» باوری گسترده است و در شکل اصلی‌اش درست: ویروس‌هایی که فایل‌های سامانه لینوکس را آلوده کنند تقریباً وجود ندارند. اما ClamAV روی سرور کار دیگری دارد، و چنین بیان می‌شود: بیابد آنچه از راه سایت شما بارگذاری شده است. پیش از همه وب‌شل‌ها را.

دقیقاً به دنبال چه می‌گردیم

وب‌شل فایل کوچکی از PHP است که اجرای فرمان از راه مرورگر را ممکن می‌کند. از راه فرم بارگذاری، یا افزونه‌ای آسیب‌پذیر، یا گذرواژه مدیری که حدس زده شده می‌آید، میان تصویرها در پوشه بارگذاری می‌نشیند و ماه‌ها آنجا زندگی می‌کند. نه دیوار آتش می‌بیندش و نه Fail2ban: درخواست‌ها به آن مانند درخواست‌های معمولی به سایت به نظر می‌رسند.

جز این، ClamAV اینها را می‌یابد:

  • فایل‌های زیان‌بار که کاربران بارگذاری کرده‌اند و از سرور شما به دیگران داده می‌شوند — نامه ارائه‌دهنده معمولاً درباره همین است؛
  • پیوست‌های ایمیل، اگر سرور ایمیل را پردازش کند؛
  • بدافزار Windows در انبار فایل‌ها — خود سرور را نگران نمی‌کند، اما کارمندی که فایل را دانلود کند آسیب می‌بیند.

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

نصب و یک تنظیم که اهمیت دارد

sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam

فرمان دوم از نخستین مهم‌تر است. freshclam سرویس به‌روزرسانی امضاهاست، و اگر کار نکند ClamAV بی‌فایده می‌شود در حالی که همچنان از پویش‌های کامیاب گزارش می‌دهد. سن پایگاه‌ها را چنین بررسی کنید:

sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam

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

حافظه: دیمن یا اجرای یک‌باره

دو راه استفاده هست، و انتخاب باید آگاهانه باشد.

clamd دیمنی است که پیوسته اجرا می‌شود و پایگاه‌ها را در حافظه نگه می‌دارد. سریع پاسخ می‌دهد اما حدود یک گیگابایت RAM می‌گیرد. روی VPS با یک یا دو گیگابایت این پذیرفتنی نیست: دیمن پایگاه داده و PHP-FPM را کنار می‌زند و سرور بی‌دلیل آشکاری به خزیدن می‌افتد. با free -m و با فعال‌بودن ناحیه مبادله تشخیص داده می‌شود.

جایگزین، clamscan بر پایه زمان‌بندی است. کندتر است (در هر اجرا پایگاه‌ها را بار می‌کند، حدود یک دقیقه) اما تنها هنگام پویش کار می‌کند:

sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www

پرچم -i تنها آنچه یافته شده را چاپ می‌کند؛ وگرنه خروجی به صدها هزار سطر می‌رسد.

پوشه‌ها را پویش کنید نه دیسک را

پویش تمام دیسک روی سروری ضعیف ساعت‌ها طول می‌کشد و بار می‌سازد، و به همین سبب برای شب زمان‌بندی می‌شود و سپس یکسره خاموش. عملی‌تر آن است که آنچه واقعاً از بیرون تغییر می‌کند را پویش کنید:

0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads

سه چیز در این سطر اهمیت دارد. ionice و nice اثر بر سایت را برمی‌دارند. --move به‌جای --remove — فایل به قرنطینه می‌رود نه اینکه حذف شود: هشدار نادرست پیش می‌آید و فایل مشتری که به‌خطا حذف شود از هیچ‌جا بازنمی‌گردد. و پوشه پویش همان است که فایل‌ها در آن بارگذاری می‌شوند نه ریشه.

امضاها برای وب‌شل‌ها

پایگاه‌های استاندارد ClamAV در برابر درهای پشتی PHP ضعیف‌اند — بیشتر به ترافیک ایمیل گرایش دارند. Linux Malware Detect (maldet) اینجا آشکارا بهتر است: مجموعه امضای خودش را دارد که دقیقاً گرد وب‌شل‌ها ساخته شده، و اگر ClamAV نصب باشد با موتور آن پویش می‌کند. ترکیب همیشگی ClamAV همچون موتور و پایگاه به‌روزشدنی است، و maldet همچون سرچشمه امضاهای تخصصی.

با یافته چه کنیم

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

  1. بی‌درنگ حذفش نکنید — رونوشتی نگه دارید و زمان تغییر فایل را ثبت کنید.
  2. با همان زمان، در گزارش‌های وب‌سرور بیابید کدام درخواست آن را آنجا گذاشته است. همان آسیب‌پذیری است.
  3. دنبال همسایه‌ها بگردید: در پشتی تقریباً هرگز در یک نسخه رها نمی‌شود.
  4. بررسی کنید در همان بازه چه چیز دیگری روی دیسک تغییر کرده و آیا وظایف cron و کلیدهای SSH تازه‌ای پیدا شده‌اند.

و سخنی جداگانه درباره هشدارهای نادرست. کتابخانه‌های قالب و JavaScript فشرده‌شده گاهی با امضاها همخوان می‌شوند. از همین‌روست قرنطینه به‌جای حذف، و از همین‌رو این توصیه که هر مجموعه امضای شخص ثالثی را که یافتید نچسبانید: اعتماد به گزارشی که نیمی از سطرهایش نویز است در یک هفته از میان می‌رود و خواندنش را رها می‌کنند.

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