opened image

Сканирование на вирусы на Linux-сервере

Вступление

 

Наверное, каждый из нас хотя бы раз слышал о вирусах. Более того, многие сталкивались с ними лично: на компьютере, телефоне или даже сервере. В этой статье речь пойдет не о гриппе или ОРВИ, а о компьютерных вирусах и другом вредоносном программном обеспечении. Вредоносные программы бывают разными. Одни используют ресурсы устройства для майнинга криптовалюты, другие собирают и передают злоумышленнику конфиденциальные данные, третьи могут подключать сервер к ботнету, рассылать спам или использоваться для атак на другие системы.


Если говорить более техническим языком, вирус - это один из видов вредоносного ПО. Более общий термин - 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. Это значит, что процесс активно потребляет ресурсы процессора, также его “странное” название может намекать нам о том, что это зловредный файл. 

 

Сканирование на вирусы на Linux-сервере - 1

 

crontab -l

Эта команда выводит отложенные задачи. Ею также достаточно часто пользуются злоумышленники, для так называемого persistence, то есть для закрепления в системе. К примеру, они могут создать задачу, которая будет после перезагрузки сервера загружать или запускать нужный файл на сервер.

 

Сканирование на вирусы на Linux-сервере - 2

 

Такая проверка не заменяет полноценное сканирование, но помогает быстро заметить странную активность. Например, если в 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”: 

 

Сканирование на вирусы на Linux-сервере - 3

 

Нажмите на эту кнопку. Вы увидите образ systemrescue, с которого можете загрузится. Выберите его и нажмите “Confirm”. 

 

Сканирование на вирусы на Linux-сервере - 4

 

Нужно подождать несколько минут, пока услуга не сменит свой статус на “ booted from iso”. 

 

Сканирование на вирусы на Linux-сервере - 5

 

Далее для того чтоб получить доступ к серверу, нужно зайти через консоль или как это ещё называют – VNC. После посещения консоли в браузере, Вы увидите примерно такой вид:

 

Сканирование на вирусы на Linux-сервере - 6

 

После загрузки в 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 

 

Сканирование на вирусы на Linux-сервере - 7

 

В 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

 

Сканирование на вирусы на Linux-сервере - 8

 

Перед первым запуском сканирования рекомендуется обновить сигнатуры 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

 

Сканирование на вирусы на Linux-сервере - 9

 

Также важно включить разрешение для 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:

 

Сканирование на вирусы на Linux-сервере - 10

 

В отчете наблюдаем тот самый вредоносный файл по пути /mnt/server/tmp/maldet-demo/weird_name_9xQ7_demo:

 

Сканирование на вирусы на Linux-сервере - 11

 

Для борьбы с найденными файлами мы можем поместить их в карантин, для этого используется комманда:

maldet -q SCANID

 

Сканирование на вирусы на Linux-сервере - 12

 

Завершение работы и правильный выход из SystemRescue

 

Перед выходом из rescue-среды нужно размонтировать диск сервера. Сначала перейдем в директорию, которая не находится внутри /mnt/server:

cd /root

Затем выполним размонтирование:

umount /mnt/server

Проверим, что диск больше не смонтирован:

findmnt /mnt/server

Если эта комманда ничего не вывела, значит раздел успешно размонтирован. Если при размонтировании появляется ошибка "target is busy", вероятно, что какой-то процесс все ещё использует файлы внутри смонтированной директории. В таком случае убедитесь, что вы не находитесь внутри смонтированной директории:

pwd
cd /root

После этого снова повторите:

umount /mnt/server

Далее можно вернуть сервер к обычной загрузке с системного диска. Для этого в панели управления сервером отключите загрузку с ISO: 

 

Сканирование на вирусы на Linux-сервере - 13

 

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