Empolgado com a criação do filtro de conteúdo que verifica as headers From: e o Return-Path dos emails, percebi que seria interessante criar um único filtro de conteúdo para os AntiVírus, escaneando todos os emails que chegam no sistema com todos os AntiVírus que tivermos disponíveis em nossos servidores! 💡
Experimentei o ClamAV, F-Prot, avast!, AVG e Panda; todos em suas versões para linux, e dessa lista só não funcionou o AVG (que apresentou erros ao atualizar) e o Panda cuja última atualização do banco de dados de virus foi em 2005.
A idéia e o funcionamento são simples: escanear o email até encontrar um virus, e caso encontre, parar de escanear para não desperdiçar recursos. Além de utilizar os AntiVírus mais rápidos primeiro (como por exemplo o ClamAV que possui um daemon na memória, depois dele o F-Prot carrega e escaneia mais rápido que o avast!).
Esse script possui a opção de colocar os emails em quarentena e avisar o administrador por email caso algum vírus seja encontrado. Também aceita que se crie um daemon exclusivo no Postfix permitindo que seja cascateado mais um filtro de conteúdo!
O script pode ser encontrado aqui. E o suporte à outros AntiVírus pode ser adicionado facilmente derivando um dos módulos existentes dos outros scanners.
Os AntiVírus utilizados podem ser encontrados em:
http://www.f-prot.com/products/home_use/linux
http://www.avast.com/linux-unix-edition
Algumas notas: O avast! pede uma licensa de uso para cada usuário.. e como o nosso Postfix geralmente usa o usuário nobody, será preciso editar o /etc/passwd e apontar um diretório home para esse usuário (eu escolhi /etc) e então copiar os dados do root em ~/.avast/ para o novo /etc/.avast à cada atualização. Eu também fiz um script bacana que atualiza tanto o avast! quanto o F-Prot, e nos avisa por email quando ocorre alguma atualização. Tal qual o freshclam.sh, a atualização pode ser executada a toda hora! 😀
#!/bin/bash
# Make mail headers
echo 'From: "AntiVirus Updates" av-updates@`hostname --long`' > .update.tmp
echo "Subject: Updates `date "+%d/%m/%Y %H:%M"`" >> .update.tmp
echo "Date: `date` >> .update.tmp
echo "Message-ID: <`date +%Y%m%d%H%M%S`@`hostname`>" >> .update.tmp
echo "" >> .update.tmp
# Update ClamAV
#/etc/cron.hourly/freshclam.sh
# Update avast!
/usr/local/bin/avast-update > .update.tmp.avast 2>&1
if [ -z "`grep "No updates" .update.tmp.avast `" ]; then
cp -r /root/.avast/* /etc/.avast/
chgrp nobody /etc/.avast/*
chmod g+r /etc/.avast/*
fi
# Update F-Prot
/usr/local/bin/fpupdate > .update.tmp.fprot
# If the antivirus updated, send an email!
if [ -z "`grep "No updates" .update.tmp.avast `" ]; then
updated="yes"
echo "##### avast! results #####" >> .update.tmp
cat .update.tmp.avast >> .update.tmp
fi
if [ -n "`cat .update.tmp.fprot`" ]; then
updated="yes"
echo "##### F-Prot results #####" >> .update.tmp
cat .update.tmp.fprot >> .update.tmp
fi
if [ "$updated" = "yes" ]; then
sendmail -G -i -f av-updates -- root < .update.tmp
fi
rm .update.tmp*
Para não receber o email, basta comentar a linha do sendmail 🙂