Вступ
Напевно, кожен із нас принаймні раз чув про віруси. Більше того, багато хто стикався з ними особисто: на комп’ютері, телефоні або навіть сервері. У цій статті йтиметься не про грип чи ГРВІ, а про комп’ютерні віруси та інше шкідливе програмне забезпечення. Шкідливі програми бувають різними. Одні використовують ресурси пристрою для майнінгу криптовалюти, інші збирають і передають зловмиснику конфіденційні дані, треті можуть підключати сервер до ботнету, розсилати спам або використовуватися для атак на інші системи.
Якщо говорити технічною мовою, вірус — це один із видів шкідливого ПЗ (malware). Під цим терміном зазвичай розуміють програми, скрипти або процеси, які потрапили на пристрій без дозволу власника і виконують небажані дії: крадуть дані, створюють прихований доступ, змінюють файли, навантажують систему або використовують сервер в інтересах зловмисника. У цій статті ми зосередимося на серверному випадку, а саме — на Linux-сервері. Розберемо, як шкідливі файли можуть потрапити на сервер, за якими ознаками можна запідозрити зараження, а також як виконати перевірку за допомогою Maldet — антивірусного сканера для Linux-систем.
Як віруси потрапляють на сервер
Сценаріїв зараження сервера досить багато. Шкідливий файл може потрапити через вразливість на сайті, небезпечну форму завантаження файлів, застарілий плагін CMS, слабкий пароль від SSH/FTP або неправильно налаштовані права доступу. У деяких випадках зловмиснику достатньо завантажити один PHP-файл у директорію сайту, щоб отримати можливість виконувати команди на сервері.
Головні рекомендації від Zomro:
- Якщо сайт працює на WordPress, Joomla, Drupal або іншій CMS, стежте за актуальністю версії та регулярно встановлюйте оновлення.
- Це ж стосується фреймворків, бібліотек та мовних середовищ. Якщо сайт написаний на PHP, Node.js або іншому стеку, не забувайте оновлювати залежності та версію середовища.
- Перевіряйте права доступу до директорій. Не варто без необхідності виставляти права 777, особливо для каталогів, куди користувачі можуть завантажувати файли.
- Для сайту, бота або окремого сервісу краще використовувати окремого користувача з мінімальними необхідними правами. Не рекомендується запускати такі процеси від імені root.
- Використовуйте складні паролі: мінімум 12 символів, літери у верхньому та нижньому регістрі, цифри та спеціальні символи. Ще краще — використовувати SSH-ключі та вимкнути вхід за паролем там, де це можливо.
Як запідозрити зараження
Перевірити сервер можна і вручну. Наприклад, звернути увагу на підозрілі процеси, невідомі cron-завдання, файли з дивними назвами, різке зростання навантаження на CPU або появу нових файлів у директоріях сайту. Для первинної діагностики можна використовувати наступні команди.
Якщо ви помітили, що ваш сервер став працювати повільніше, ніж раніше, спробуйте запустити на ньому команду:
htopЦя команда покаже докладний вивід усіх процесів, які запущені в цей момент на сервері. Зверніть увагу на процес з PID 29357 — він позначений на рисунку нижче. У стовпці "CPU%" у цього процесу значення 100. Це означає, що процес активно споживає ресурси процесора, також його "дивна" назва може натякати нам на те, що це шкідливий файл.

crontab -lЦя команда виводить відкладені завдання. Нею також досить часто користуються зловмисники, для так званого persistence, тобто для закріплення в системі. Наприклад, вони можуть створити завдання, яке після перезавантаження сервера завантажуватиме або запускатиме потрібний файл на сервер.

Така перевірка не замінює повноцінне сканування, але допомагає швидко помітити дивну активність. Наприклад, якщо в htop з'явився невідомий процес, який постійно використовує CPU, або в crontab виявилася незрозуміла команда, що запускається щохвилини, це привід провести глибшу перевірку.
Що таке Maldet
Після первинної ручної перевірки можна переходити до повноцінного сканування файлової системи. Для цього ми будемо використовувати Maldet, також відомий як Linux Malware Detect або LMD. Maldet — це антивірусний сканер для Linux-систем, який часто використовують на web-серверах та shared-hosting оточеннях. Він допомагає знаходити шкідливі PHP-файли, веб-шелли, бекдори, підозрілі скрипти та інші файли, які могли б з'явитися після зламу сайту або компрометації сервера. Важливо розуміти, що Maldet не замінює базовий захист сервера. Він не скасовує необхідність оновлювати CMS, стежити за правами доступу, використовувати складні паролі, обмежувати SSH-доступ і робити резервні копії. Але як інструмент для перевірки файлів і первинного пошуку шкідливих об'єктів Maldet дуже зручний.
Підготовка до сканування
Ми проводитимемо сканування поза рівнем ОС, для цього скористаємося функціоналом хмарних серверів, а конкретно переведемо послугу в режим system-rescue — таким чином ми завантажимося з підключеного образу, який використовується окремо від ОС. Для початку увійдіть у панель із послугами https://cp.zomro.com/services/cloud_vps. Далі виберіть потрібну послугу — натисніть на неї, потім, коли ви потрапите на панель управління сервером, зверніть увагу на кнопку "Boot from ISO":

Натисніть на цю кнопку. Ви побачите образ systemrescue, з якого можете завантажитися. Виберіть його і натисніть "Confirm".

Потрібно почекати кілька хвилин, поки послуга не змінить свій статус на "booted from iso".

Далі, щоб отримати доступ до сервера, потрібно зайти через консоль або, як це ще називають, — VNC. Після відвідування консолі в браузері ви побачите приблизно такий вигляд:

Після завантаження в SystemRescue ми потрапляємо в окреме live-середовище. Це означає, що основна ОС сервера зараз не запущена. Такий підхід зручний під час перевірки: підозрілі процеси з основної ОС не будуть активні й не зможуть заважати скануванню. Тепер нам потрібно визначити, який диск належить встановленій системі, змонтувати його і виконати перевірку файлів. Для початку подивимося список дисків і розділів:
lsblk -f
У виводі команди потрібно знайти розділ, на якому знаходиться коренева файлова система сервера. Він може називатися по-різному, наприклад, у моєму випадку це /dev/vda1. Зазвичай його можна визначити за двома ознаками: розділ має тип файлової системи, наприклад, ext4; розділ має найбільший розмір серед розділів диска.
Створимо директорію, в яку буде змонтовано диск сервера:
mkdir -p /mnt/serverДалі змонтуємо потрібний розділ. У нашому прикладі використовується /dev/vda1:
mount /dev/vda1 /mnt/server Перевіримо, що диск успішно змонтовано. Якщо у виводі видно стандартні Linux-директорії, наприклад etc, var, home, root — значить диск змонтовано коректно.
ls -lah /mnt/server

У SystemRescue зазвичай використовується pacman для встановлення пакетів: нам потрібно встановити git, wget, perl і clamav. ClamAV встановлюємо додатково, щоб Maldet міг використовувати його як додатковий скануючий рушій. SystemRescue використовує pacman для встановлення додаткових пакетів, а офіційна документація Maldet вказує на підтримку інтеграції з ClamAV.
pacman -Sy --noconfirm git wget perl clamavПісля встановлення ClamAV оновимо його антивірусні бази:
freshclamТепер встановимо Maldet. Перейдемо в директорію /root, завантажимо проект з GitHub і запустимо інсталяційний скрипт. Такий спосіб встановлення вказано на офіційній сторінці Linux Malware Detect.
cd /root
git clone https://github.com/rfxn/linux-malware-detect.git
cd linux-malware-detect
bash install.shПеревіримо, що команда maldet доступна:
which maldet

Перед першим запуском сканування рекомендується оновити сигнатури Maldet:
maldet -uТакож можна запустити оновлення версії Maldet:
maldet -dПеревіримо, що maldet буде використовувати ClamAV:
sed -i 's/^scan_clamscan=.*/scan_clamscan=1/' /usr/local/maldetect/conf.maldet
grep 'scan_clamscan' /usr/local/maldetect/conf.maldetНа першому запуску краще не вмикати автоматичний карантин. Спочатку безпечніше отримати звіт, подивитися знайдені файли і тільки після цього приймати рішення:
sed -i 's/^quarantine_hits=.*/quarantine_hits=0/' /usr/local/maldetect/conf.maldet
sed -i 's/^quarantine_clean=.*/quarantine_clean=0/' /usr/local/maldetect/conf.maldet

Також важливо ввімкнути дозвіл для maldet на пошук вірусів серед файлів користувача root. Для цього запустіть таку команду:
sed -i 's/^scan_ignore_root=.*/scan_ignore_root=0/' /usr/local/maldetect/conf.maldetТепер запустимо перевірку тестової директорії:
maldet -a /mnt/server/tmpКлюч "-a" означає сканування всіх файлів за вказаним шляхом. Після завершення maldet виведе короткий результат перевірки. Тепер maldet повертає сформований список файлів і показує нормальний результат. Після сканування відкрийте звіт, який видно у виводі — Maldet покаже ідентифікатор звіту SCAN ID:

У звіті спостерігаємо той самий шкідливий файл за шляхом /mnt/server/tmp/maldet-demo/weird_name_9xQ7_demo:

Для боротьби зі знайденими файлами ми можемо помістити їх у карантин, для цього використовується команда:
maldet -q SCANID

Завершення роботи та правильний вихід із SystemRescue
Перед виходом із rescue-середовища потрібно розмонтувати диск сервера. Спочатку перейдемо в директорію, яка не знаходиться всередині /mnt/server:
cd /rootПотім виконаємо розмонтування:
umount /mnt/serverПеревіримо, що диск більше не змонтовано:
findmnt /mnt/serverЯкщо ця команда нічого не вивела, значить розділ успішно розмонтовано. Якщо під час розмонтування з'являється помилка "target is busy", ймовірно, що якийсь процес все ще використовує файли всередині змонтованої директорії. У такому разі переконайтеся, що ви не перебуваєте всередині змонтованої директорії:
pwd
cd /rootПісля цього знову повторіть:
umount /mnt/serverДалі можна повернути сервер до звичайного завантаження з системного диска. Для цього в панелі управління сервером вимкніть завантаження з ISO:

Ваша послуга перейде в статус "unrescuing" на кілька хвилин. Дочекайтеся, поки її статус зміниться на "active". Після цього роботу зі сканування на віруси можна вважати завершеною.