Вступление
Наверное, каждый из нас хотя бы раз слышал о вирусах. Более того, многие сталкивались с ними лично: на компьютере, телефоне или даже сервере. В этой статье речь пойдет не о гриппе или ОРВИ, а о компьютерных вирусах и другом вредоносном программном обеспечении. Вредоносные программы бывают разными. Одни используют ресурсы устройства для майнинга криптовалюты, другие собирают и передают злоумышленнику конфиденциальные данные, третьи могут подключать сервер к ботнету, рассылать спам или использоваться для атак на другие системы.
Если говорить более техническим языком, вирус - это один из видов вредоносного ПО. Более общий термин - 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". После этого, работа по сканированию на вирусы может считатся завершенной.