Maldet. Поиск проблемных скриптов на сервере.

Материал для владельцев собственных VDS или выделенных серверов, которые озабочены вопросами безопасности своих площадок. Автор заранее предупреждает, что никакое антивирусное ПО не даёт 100% гарантии на то что сервер не будет взломан, никакое ПО не даёт 100% гарантии на то, что ложных срабатываний не случится, однако автор убеждён, что при наличии удобного и понятного инструмента защиты, его стоит использовать в работе.

Linux Malware Detect (он же LMD, он же Maldet) — это сканер, с помощью которого можно проверить сервер на наличие подозрительных и проблемных скриптов (шеллы, скрипты для спама и т. п.) в системе в принципе или, например, в файлах сайта в частности. Сканер самодостаточен, однако если в системе установлен ClamAV, то он определит это и будет использовать его для сканирования данных. В программу заложен большой функционал, имеется возможность…

  • Находить подозрительные файлы (и уведомлять об этом);
  • Находить и отправлять на карантин проблемные скрипты (и уведомлять об этом);
  • Находить и по возможности лечить обнаруженное (и уведомлять об этом);
  • Сканировать только те файлы, которые появились и были изменены за определённые промежуток времени;
  • В интерактивном режиме осуществлять мониторинг в определённой директории;
  • Работать с исключениями, добавляя в них как конкретные сигнатуры, так и пути/конкретные файлы на сервере;
  • Отправлять подозрительные файлы на анализ, на серверы Maldet’а;
  • Автоматически и вручную обновлять собственные сигнатуры и версию самого сканера;

Установка и базовая настройка maldet.

Скачиваем архив с сайта разработчиков и устанавливаем Maldet:

cd /usr/local/src/
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar xvfz maldetect-current.tar.gz
cd maldetect-1.6/ # Здесь имя директории может немного отличаться.
sh install.sh

Конфигурационный файл maldet находится здесь /usr/local/maldetect/conf.maldet Он хорошо прокомментирован, дублировать его целиком нет смысла, так что остановимся только на основных моментах:

# [ General Options ]
email_alert="1" Включаем уведомления от maldet’а на почту. Ведь мы сознательные администраторы и следим за происходящим на сервере.
email_addr="mail@sysadmin.pm" Указываем ящик, на который хотим получать уведомления.
email_ignore_clean="0" Получение уведомлений об очищенных файлах. Ставим здесь 0, если далее мы включим автоматическое «лечение» найденных проблемных скриптов. На этом вопросе остановимся отдельно.

# [ SCAN OPTIONS ]
scan_max_depth="15"  Определяем максимальную глубину сканирования.
scan_min_filesize="24"  Задаём минимальный размер файла.
scan_max_filesize="2048k" Задаём максимальный размер файла, на который будет образать внимание сканер.
scan_clamscan="1" Будет ли сканер использовать установленный на сервере ClamAV.
scan_tmpdir_paths="/tmp /var/tmp /dev/shm /var/fcgi_ipc" Директории для временных файлов, которые maldet будет проверять.
scan_user_access="0" Разрешить ли не root пользователям запускать сканирование.
scan_ignore_user="" Пользователи через запятую или пробел, которые будут игнорироваться при сканировании.
scan_ignore_group="" Группы через запятую или пробел, которые будут игнорироваться при сканировании.

# [ QUARANTINE OPTIONS ]
quarantine_hits="1" Сразу же отправляем в карантин найденные подозрительные файлы.
quarantine_clean="0" Попытаться «вылечить» обнаруженное. Стоит ли включать эту опцию, каждый администратор решает сам. Автор предпочитает держать её отключенной, при включенном автоматическом карантине и уведомлениях об этом.

Ежедневная проверка новых файлов на сервере.

При установке, maldet создаёт для планировщика файл /etc/cron.daily/maldet, если ежедневные провекри новых файлов на сервере не нужны, то файл достаточно просто удалить, либо переместить его куда-то оттуда. В самом файле уже учтены все пути, которые создаются при работе с современными панелями управления сервером, обычно, модификация этого файла не требуется, только если администратору понадобится добавить какой-то не стандартный путь для ежедневной проверки.

Запускаясь ежедневно, maldet будет проверять новые файлы на сервере, найденное будет обрабатываться в соответствии с настройками в конфигурационном файле.

Основные команды для работы с Maldet.

Запустить проверку в определённой директории. Необходимо указывать полный путь до нужной директории от корня:

maldet -a /path/to/dir

Когда сканирование будет завершено, сканер сообщит какой SCANID был присвоен отчёту (в примере 170501-0036.29912)…

maldet(25173): {scan} scan report saved, to view run: maldet --report 170501-0036.29912

… далее с этим отчётом можно работать.

Отправить на карантин всё найденное в отчёте:

maldet -q 170501-0036.29912

Попытаться «вылечить» найденные при сканировании 170501-0036.29912 файлы. При успешном лечении, файлы будут восстановлены без проблемного кода:

maldet -n 170501-0036.29912

Восстановить отправленные на карантин файлы во время сканирования 170501-0036.29912:

maldet -s 170501-0036.29912

Важный момент — если какие-то файлы были «вылечены», восстановление по отчёту может пройти не совсем корректно. Разумеется, удалённый в процессе лечения код данной командой восстановлен быть не может.

Восстановить конкретный файл из карантина:

maldet -s /usr/local/maldetect/quarantine/config.php.12345

Показать список всех имеющихся отчётов:

maldet -e list

Открыть отчёт сканирования 170501-0036.29912:

maldet -e 170501-0036.29912

В случае, когда работа ведётся с файлами и отчётами при сканировании от имени пользователя (например когда maldet настроен в связке с modsecurity), необходимо использовать параметр -U (—user). Например восстановление файлов из карантина, при этом, будет выглядеть вот так:

maldet -U nobody -s 170430-2322.25776

Где 170430-2322.25776 — это отчёт о сканировании и обработке файла, загруженного по http скриптами от пользователя nobody.

Даст куда более подробную информацию об этих и других доступных для работы со сканером командах:

maldet -h

Мониторинг в реальном времени.

Maldet позволяет настроить мониторинг файлов в нужных администратору директориях в реальном времени. Свои параметры мониторинг берёт из конфигурационного файла, там необходимое можно найти в секции [ MONITORING OPTIONS ]. Для работы мониторинга необходимо установить inotify-tools (в CentOS можно взять из EPEL), без него мониторинг работать не будет…

maldet(31124): {mon} could not find inotifywait command, install yum package inotify-tools or download from https://github.com/rvoicilas/inotify-tools/wiki/

Сам мониторинг имеет три варианта запуска:

1. Мониторинг пользователей. В этом режиме под контролем у сканера окажутся все директории пользователей. Запускается командой:

maldet -m users

2. Мониторинг только нужных Вам директорий (включая вложенные в них). Нужные пути указыватся через запятую. Команда для запуска следующая:

maldet -m /home/vasys,/var/www/sites

3. Мониторинг путей из списка. Администратор может указать путь до файла, в котором будет содержаться список необходимых для мониторинга мест. Запускается такой режим командой:

maldet -m /root/check_this_dirs

Автивность можно проследить по логу /usr/local/maldetect/logs/inotify_log. Сам процесс в системе выглядит примерно так:

# ps aux | grep maldet
root 23580 9.3 0.0 9804 3832 pts/2 SN 22:38 0:08 /usr/bin/inotifywait -r --fromfile /usr/local/maldetect/sess/inotify.paths.23486 --exclude \(^/var/tmp/mysql.sock$|^/tmp/mysql.sock$|^/var/cache/buagent/md0.cache.data$|^/var/tmp/#sql_.*\.MYD$|^/tmp/#sql_.*\.MYD$|^/var/tmp/clamav-.*|^/tmp/clamav-.*|^/usr/local/maldetect*|^/dev/pts*|^/dev/null\) --timefmt %d %b %H:%M:%S --format %w%f %e %T -m -e create,move,modify
root 23593 0.0 0.0 119132 3012 pts/2 S 22:38 0:00 bash /usr/local/sbin/maldet -m /home/sysadmin/

Остановить мониторинг можно командой:

maldet -k

Для серверов работающих под нагрузкой и/или для серверов работающих с огромным количеством файлов, имеет смысл обратить внимание на настройки в секции MONITORING OPTIONS конфига maldet’а. В случае если мониторинг будет создавать избыточную нагрузку, с помощью опций в этой секции можно ограничить его работу до разумных пределов.

Мониторинг загрузок по http.

Maldet и ModSecurity можно настроить на совместную обработку всего что загружается на сервер по http. Это особенно актуально для сайтов, которые подвергаются частым попыткам взлома и загрузки проблемных скриптов. Для того что бы настроить проверку всего загружаемого на сайтах налету необходимо:

1. Включить опцию scan_user_access в конфигурационном файле Maldet’а.

2. Подготовить maldet к работе с файлами пользователей командой:

maldet --mkpubpaths

Эта команда создаст пользовательские директории с нужными правами в /usr/local/maldetect/pub/

3. В файл с правилами ModSecurity необходимо добавить следующее:

SecRequestBodyAccess On
SecRule FILES_TMPNAMES "@inspectFile /usr/local/maldetect/hookscan.sh" \
 "id:'999999',log,auditlog,deny,severity:2,phase:2,t:none"

ID правила (id:’999999′), при этом, должен быть уникальный. При использовании ModSecurity >=2.9, необходимо перед SecRule FILES_TMPNAMES добавить строку SecTmpSaveUploadedFiles On.

4. После сохранения изменений необходимо перезапустить apache.

Теперь, если всё сделано верно, всё что загружается на сайт по http будет попадать на проверку Maldet’у, а тот в свою очередь будет проверять загрузку и в случае обнаружения проблемного файла будет обрабатывать его в соответствии с настройками, которые указаны в последней строке файла /usr/local/maldetect/hookscan.sh после --config-option:

cd /tmp ; $inspath/maldet --hook-scan --config-option quarantine_hits=$quarantine_hits,quarantine_clean=$quarantine_clean,tmpdir=/var/tmp,scan_tmpdir_paths=$scan_tmpdir_paths,scan_clamscan=$clamd_scan -a "$file"

Здесь при необходимости можно добавить свои параметры обработки файла, указать email для уведомления (email_addr=alert@sysadmin.pm) и т. д.

Настройка исключений.

Maldet поддерживает несколько списков исключений при сканировании и мониторинге:

/usr/local/maldetect/ignore_paths Список, в котором можно указать какие файлы и\или директории будут игнорироваться. Пример:

/home/sysadmin/public_html/blabla

/usr/local/maldetect/ignore_file_ext Список, в котором можно указать какие расширения будут игнорироваться. Пример:

.txt
.css

/usr/local/maldetect/ignore_sigs Список, в котором можно указать какие сигнатуры будут игнорироваться. Пример:

base64.inject.unclassed

/usr/local/maldetect/ignore_inotify Список, в котором регекспами можно указать, что мониторинг будет игнрировать при проверке. Пример:

^/home/user$
^/var/tmp/#sql_.*\.MYD$

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *