«На Linux антивірус не потрібен» — поширена думка, і в первісному вигляді вона правильна: вірусів, що заражають системні файли Linux, майже не існує. У 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 і за активним swap.
Альтернатива — 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 як джерело спеціалізованих сигнатур.
Що робити зі знахідкою
Знайдений вебшелл — не кінець розслідування, а його початок. Файл у каталозі завантажень означає, що хтось зміг туди записати, і видалення файла цієї можливості не прибирає.
- Не видаляйте одразу — збережіть копію й зафіксуйте час зміни файла.
- За цим часом знайдіть у журналах вебсервера, який запит його туди поклав. Це і є уразливість.
- Пошукайте сусідів: бекдор майже ніколи не лишають в одному примірнику.
- Перевірте, що ще на диску змінилося в той самий період і чи не з’явилися нові завдання cron і ключі SSH.
Окремо про хибні спрацювання. Бібліотеки шаблонів і мінімізований JavaScript іноді збігаються із сигнатурами. Звідси карантин замість видалення, і звідси ж порада не підключати кожен сторонній набір сигнатур, який трапиться: довіра до звіту, де половина рядків — шум, зникає за тиждень, і його перестають читати.
Практична цінність сканера в тому, щоб його результати потрапляли вам на очі: коли було останнє сканування, наскільки старі бази, що знайдено. Це один рядок, але його відсутність перетворює встановлений антивірус на галочку. Який вигляд має цей рядок, показує демосторінка нижче.