Назад | Перейти на главную страницу

Как сканировать файлы только за последние 24 часа с помощью clamav

Я создал сценарий bash для сканирования всего сервера на наличие вирусов через clamav. Скрипт запускался через cron каждую ночь. По этой причине я хочу сканировать только те файлы, которые были добавлены за последние 24 часа. Сейчас я использую эту команду в своем скрипте:

find /home -type f -mmin -1440  -print0 | xargs -0 -r clamscan --infected

Но это слишком медленно, причина того, что команда find работает медленно? Если да, то какой способ лучше сканировать файлы только за последние 24 часа с помощью clamscan? Есть ли у clamav возможность это сделать?

Любая помощь приветствуется.

Я наткнулся на эту страницу, когда искал скрипт сканирования моллюсков. Я последовал приведенному выше совету и получил работу с:

#!/usr/bin/bash
# Create Hourly Cron Job With Clamscan

# Directories to scan
scan_dir="/home"

# Temporary file
list_file=$(mktemp -t clamscan.XXXXXX) || exit 1

# Location of log file
log_file="/var/log/clamav/hourly_clamscan.log"

# Make list of new files
if [ -f  "$log_file" ]
then
        # use newer files then logfile
        find "$scan_dir" -type f -cnewer "$log_file" -fprint "$list_file"
else
        # scan last 60 minutes
        find "$scan_dir" -type f -cmin -60 -fprint "$list_file"
fi

if [ -s "$list_file" ]
then
        # Scan files and remove (--remove) infected
        clamscan -i -f "$list_file" --remove=yes > "$log_file"

        # If there were infected files detected, send email alert
        if [ `cat $log_file | grep Infected | grep -v 0 | wc -l` != 0 ]
        then
                HOSTNAME=`hostname`
                echo "$(egrep "FOUND" $log_file)" | mail -s "VIRUS PROBLEM on $HOSTNAME" -r     clam@nas.local you@yourhost.com
        fi
else
        # remove the empty file, contains no info
        rm -f "$list_file"
fi
exit

В моем случае это был почасовой сценарий, но он должен работать ежедневно (измените вторую находку).

В зависимости от того, сколько файлов на самом деле затронуто, я не думаю, что 2 часа - это столько времени для проверки на вирусы. В любом случае, вы можете попробовать увеличить скорость следующим образом:

Выведите find результат в файл вместо того, чтобы передавать его в xargs а затем используйте clamscan с --file-list=FILE вариант. Это, возможно, улучшило бы время выполнения, потому что clamav нужно будет запускать и инициализировать только один раз, а не несколько раз. Пожалуйста, оставьте комментарий и скажите, насколько это ускорило процесс, если вообще это ускорило.

Другой вариант (или дополнительный) - ограничить сканирование определенными уязвимыми типами файлов, но лично мне такой подход не нравится.

Я еще не тестировал это, но я планирую интегрировать мой запуск clamscan с моим резервным запуском. Мой инструмент резервного копирования создает список файлов, измененных для выполнения инкрементного резервного копирования, так зачем повторно вычислять один и тот же список файлов дважды?

Для создания резервных копий я использую dirvish, а внизу - rsync. В итоге я получаю log.bz2 дает мне отчет обо всех файлах, для которых были созданы резервные копии, включая список файлов, для которых были созданы резервные копии.

это genclamfilelist.sh скрипт извлечет список файлов из log.bz2 последней резервной копии и распечатайте ее:

#!/bin/sh

AWK=/usr/bin/awk
BUNZIP2=/bin/bunzip2
HEAD=/usr/bin/head
HOSTNAME=/bin/hostname
LS=/bin/ls
SED=/bin/sed

SNAPSHOT_HOME=/path/to/dirvish/snapshots

   for vaultHome in ${SNAPSHOT_HOME}/*; do

      # vault naming convention: <hostname>-<sharename>
      vaultName="`echo ${vaultHome} | ${SED} -e 's/^.*\/\([^\/]\+\)$/\1/'`"
      vaultHost="`echo ${vaultName} | ${SED} -e 's/\([^\-]\+\)\-.*$/\1/'`"

      # only proceed if vault being considered is for the same host
      if [ "${vaultHost}" = "`${HOSTNAME}`" ]; then
         logfile="`${LS} -1t ${vaultHome}/20??????-???? \
                      | ${HEAD} -1 \
                      | ${SED} -e 's/^\(.*\)\:$/\1/'`/log.bz2"

         if [ -f ${logfile} ]; then
            ${BUNZIP2} -c ${logfile} | ${AWK} '
               /^$/ {
                  if (start) {
                     start=0
                  }
               }

               {
                  if (start) {
                     print $0
                  }
               }

               /^receiving\ file\ list\ \.\.\.\ done$/ {
                  start=1
               }' | ${SED} -e "s/^\(.*\)$/\/\1/"
         fi
         # else skip - no log file found, probably backup didn't run or failed
      fi
      # else skip - another vault
   done

exit 0

это /etc/cron.d/clamav cron-скрипт будет использовать список файлов:

# /etc/cron.d/clamav: crontab fragment for clamav
CLAMAV_FILELIST=/tmp/clamav_filelist_`/bin/hostname`.txt

# run every night
0 19 * * *     root      /usr/bin/test -f ${CLAMAV_FILELIST} && /usr/bin/clamscan --any-desired-options --file-list=${CLAMAV_FILELIST} && /bin/rm ${CLAMAV_FILELIST}

Так как я использую dirvish, я изменил его /etc/dirvish/dirvish-cronjob для вызова первого сценария для создания списка файлов для использования последним сценарием:

# ...
/usr/sbin/dirvish-expire --quiet && /usr/sbin/dirvish-runall --quiet rc=$?

# v--- BEGIN ADDING NEW LINES
touch /tmp/clamav_filelist_`hostname`.txt
chmod 400 /tmp/clamav_filelist_`hostname`.txt
/usr/local/bin/genclamfilelist.sh >> /tmp/clamav_filelist_`hostname`.txt
# ^--- END ADDING NEW LINES

umount /mnt/backup0 || rc=$?
# ...