Я создал сценарий 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=$?
# ...