Como escanear apenas os arquivos das últimas 24 horas com o clamav

2

Eu criei um script para escanear todo o servidor para vírus via clamav. O script foi executado via cron todas as noites. Por causa disso, quero verificar apenas os arquivos que foram adicionados nas últimas 24 horas. Por enquanto estou usando este comando no meu script:

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

Mas é muito lento, o comando de localização é a razão de ser lento? Em caso afirmativo, qual é a melhor maneira de verificar apenas os últimos 24 horas arquivos com clamscan? O Clamav tem alguma opção para fazer isso?

Qualquer ajuda seria muito apreciada.

    
por Ehsan 18.02.2013 / 13:43

3 respostas

6

Eu tropecei nesta página, quando eu estava procurando por um script clamscan. Eu segui o conselho acima e consegui trabalhar com ele:

#!/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     [email protected] [email protected]
        fi
else
        # remove the empty file, contains no info
        rm -f "$list_file"
fi
exit

Era um script de hora em hora no meu caso, mas deveria funcionar diariamente (modificar a segunda descoberta).

    
por 24.10.2014 / 23:53
2

Dependendo de quantos arquivos são realmente afetados, não acho que 2 horas seja esse tempo para uma verificação de vírus. De qualquer forma, você poderia tentar melhorar a velocidade da seguinte maneira:

Gere o resultado de find em um arquivo em vez de colocá-lo em xargs e, em seguida, use clamscan com a opção --file-list=FILE . Isso possivelmente aumentaria o tempo de execução porque clamav precisaria apenas iniciar e inicializar uma vez em vez de várias vezes. Por favor, deixe um comentário e me diga o quanto isso acelerou as coisas.

Outra opção (ou uma adicional) seria limitar sua varredura a determinados tipos de arquivos vulneráveis, mas, pessoalmente, não gosto dessa abordagem.

    
por 18.02.2013 / 14:21
0

Ainda não testei isso, mas planejo integrar meu clamscan com minha execução de backup. Minha ferramenta de backup produz uma lista de arquivos modificados para executar um backup incremental, então, por que recompilar a mesma lista de arquivos duas vezes?

Eu uso o dirvish para criar meus backups, que usam o rsync por baixo. No final, recebo um log.bz2 dando-me um relatório de todos os arquivos de backup, incluindo a lista de arquivos que foram copiados.

Este script genclamfilelist.sh extrairá a lista de arquivos do log.bz2 do último backup e o imprimirá:

#!/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/^.*\/\([^\/]\+\)$//''"
      vaultHost="'echo ${vaultName} | ${SED} -e 's/\([^\-]\+\)\-.*$//''"

      # 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/^\(.*\)\:$//''/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/^\(.*\)$/\//"
         fi
         # else skip - no log file found, probably backup didn't run or failed
      fi
      # else skip - another vault
   done

exit 0

Este script /etc/cron.d/clamav cron usará a lista de arquivos:

# /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}

Como eu uso o dirvish, modifiquei seu /etc/dirvish/dirvish-cronjob para chamar o primeiro script para gerar a lista de arquivos a ser usada pelo último script:

# ...
/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=$?
# ...
    
por 23.12.2015 / 01:32