Попросили подключить на нескольких серверах проверку антивирусом всего что загружается на сервер через ftp, желательно бесплатно. Первым антивирусом под *nix что пришел в голову, был ClamAV. Он бесплатный, с регулярными обновлениями антивирусных баз, и главное, через его сокеты можно подключать на обработку очень многое, в том числе и загружаемые файлы по ftp. Итак, в первую очередь - установим сам ClamAV:
cd /usr/ports/security/clamav make install clean
Для нашего случая опции конфигурации можно оставить без изменений. Добавляем в /etc/rc.conf управляющие сигнатуры для запуска антивируса в качестве демона во время запуска системы:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
Стандартно запускаем freshclam для загрузки антивирусных баз в /var/db/clamav, после чего можно запускать сам clamav.
В целом, нам надо чтобы Pure-FTPd при загрузке файлов запускал скрипт, который будет передавать файлы на проверку ClamAV. Для этого мне пришлось пересобрать имеющийся экземпляр, включив в конфигурации опцию UPLOADSCRIPT. После переустановки нужно добавить в /etc/rc.conf (кроме имеющегося там pureftpd_enable="YES") следующие строки:
pureftpd_upload_enable="YES"
pureftpd_uploadscript="/usr/local/etc/pure-ftpd/clamscan.sh"
А в конфигурационном файле /usr/local/etc/pure-ftpd.conf добавляем разрешение на вызов uploadscript:
CallUploadScript yes
Это позволит запускаться процессу pureftpd_uploadscript передающему файлы на сторону антивируса посредством запуска shell скрипта, в моем случае расположенного в /usr/local/etc/pure-ftpd/clamscan.sh (путь расположения может быть произвольным). В текущей версии Pure-FTPd пришлось подправить стартстопный скрипт /usr/local/etc/rc.d/pure-ftpd
В нем была такая вот строка:
pureftpd_uploadscript=${pureftpd_uploadscript:-"/usr/bin/touch"}
в которой на мой взгляд /usr/bin/touch совершенно лишние, и не дают прочитать путь до pureftpd_uploadscript указанный мной в rc.conf. В итоге pure-uploadscript попросту не запускается. После правки строка должна иметь следующий вид:
pureftpd_uploadscript=${pureftpd_uploadscript:-""}
Далее создаем сам shell скрипт /usr/local/etc/pure-ftpd/clamscan.sh со следующим содержанием:
#!/bin/sh
# использую /usr/local/bin/clamdscan так как он быстрее обрабатывает файлы при запущеном clamd
# если clamd не запущен, нужно пользовать clamscan CLAMLOC='/usr/local/bin/clamdscan';
if [ ! -x $CLAMLOC ];
then echo 'clamdscan not found';
exit;
fi
if [ "$1" = "" ];
then echo 'Variable is blank';
exit;
fi
if [ ! -f "$1" ];
then echo "$1 file not found"
exit;
fi
# здесь я буду не удалять вирусные файлы, а переносить их в директорию карантина, чтобы видеть когда на сервер заливались вирусы $CLAMLOC --move=/usr/home/clamav/infected $1
# А это можно использовать, если нужно удалять файлы с вирусами сразу
#$CLAMLOC --remove $1
Все, после этого можно запускать pure-ftpd и проверять наличие двух контрольных процессов:
pure-ftpd (SERVER) (pure-ftpd)
/usr/local/sbin/pure-uploadscript -B -r /usr/local/etc/pure-ftpd/clamscan.sh
Если оба процесса есть, то все работает и можно проверять работу отсечки вирусов. Можно стандартно передать сигнатуру EICAR в текстовом файле через ftp и наблюдать ее удаление, или перенос в карантин, в зависимости от настроек shell скрипта.
Сигнатура EICAR для тех кто забыл: X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*