--=XliN=-- пишет:Дело вот какое. Хочу на сервере samba прикрутить связку clamav+samba-vscan
......
UPD: Или у кого есть другие решения.
Я тоже немного подумал на эту тему (много - вредно). И пришел к выводу, что заниматься пересборкой самбы на промышленных серверах не есть гуд. Она должна быть из кАропки, из репозитория.
Есть ли иной путь решения поставленной задачи? Безусловно есть. Есть замечательная утилита inotifywait. Она следит за событиями в том или ином каталоге (рекурсивно, со всеми подкаталогами) и если означенные события возникают, то можно по ним запустить свою любуэ задачу на эти события. Например, антивирусный сканер на события создания/модификации файлов.
Вот что у меня есть:
1. Старующий весь этот колхоз скрипт start_monitor_av.sh:
#!/bin/sh
if [ "$*" = "--stop" ]; then
killall inotifywait;
if [ "$(ps -A | grep clamd)" ]; then
killall clamd
fi
exit;
fi
if [ "$(ps -A | grep 'inotifywait')" ]; then
## Если inotify запущен, значит монитор уже работает.
exit;
fi
if [ "x$(ps -A | grep clamd)" == "x" ]; then
## Если clamd не запущен - запустить.
/usr/local/sbin/clamd
fi
MonDirs="test FirmDocs homes WorkDocs"
for dir in $MonDirs
do
/bin/nice -n 20 monitor_av.sh $dir &
done
Этот скрипт умеет остановиться, проверить запущенность колхоза и запуститься на несколько контролируемых "корневых" каталогов. Точнее - напустить на контролируемые каталоги скрипты monitor_av.sh вида:
#!/bin/sh
mondir="/data/glusterfs/export/exports/$1/"
echo $mondir
INF=/usr/bin/inotifywait
$INF -m -r -q --format '%:e %w%f' -e close -e moved_to -e create "$mondir" | while read row; do
#echo row=$row
set `echo $row | awk '{ print $1 }'`; event=$1;
#echo event=$event
name=""
if [ "$event" == "CLOSE_WRITE:CLOSE" ]; then
name=`echo $row | awk '{ print substr($0,19) }'`;
fi
if [ "$event" == "MOVED_TO" ]; then
name=`echo $row | awk '{ print substr($0,10) }'`;
fi
#echo name=$name
if ! [ "x$name" == "x" ]; then
/bin/nice -n 20 ScanFile.sh "$name" &
fi # Есть имя файла
done
Этот монитор по ряду событий файловой системы вызывает собственно антивирусный сканер с помощью скрипта ScanFile.sh:
#!/bin/sh
name=$1
scanlist="/mnt/glusterfs/scripts/antivir/logs/monitor_av.log"
Dir=${name%/*}
Fn=${name##*/}
sleep 2
if ! [ -d "$Dir" ]; then
exit
fi
cd "$Dir"
if ! [ -f "$Fn" ]; then
exit
fi
res=`clamdscan "$Fn" --no-summary`
if [ $? -eq 1 ]; then # найден вирус
name1=`echo $name | awk '{ print substr($0,24) }' `
name_gl=/mnt/glusterfs/${name1}
#echo name_gl=$name_gl
name_inf=/mnt/nfs/clamav/infected/glusterfs/${name1}
Dir=${name_inf%/*}
if ! [ -d "$Dir" ]; then
mkdir -p "$Dir"
fi
user=`ls -la "$name_gl" | awk '{ print $3 }'`
cp -f --backup=t "$name_gl" "$name_inf"
rm -f "$name_gl"
set `date`; y=$6; d=$3; t=$4;
set `date +%m`; m=$1;
echo $y.$m.$d $t $user $res >>"$scanlist";
fi
Этот скрипт, подождав 2 секунды (я так захотел из чисто психологических соображений) проверяет новое или измененное файло с помощью clamav'а и если там найден вирус, то это файло переносится в карантин. Да, и еще коммент для ясности. Весь этот колхоз ориентирован на gusterfs-том. И с целью повышения производительности он смотрит не на сам смотнированный том, а "под него", на то, что в том монтируется. А вот операции с зараженными файлами осуществляются на гластерном томе. Это небольшая особенность, которая затрудняет понимаение скриптов, но повышает их скорострельность в конкретной ситуации. Для иной ситуации скрипты надо скорректировать.