Muitos admins sofreram ou ainda sofrem com o aumento de virus na Internet, causando lentidao na entrega e recebimento em seus MTAs. Tudo isso por falta de um filtro que trabalhasse diretamente com o postfix sem precisar passar pelo amavis ou mailscanner (os famosos consumidores de memoria e cpu ;)).
Quem não já teve a experiencia de integrar o postfix com expressões body_checks para rejeitar o email antes mesmo que ele passe pelo amavis ou mailscanner e se surpreendeu com o alto desempenho. Porem a solução ideal é integrar um antivirus diretamente com o MTA. Nesse tutorial usaremos o postfix junto com o clamav (antivirus livre).
Opcionais:
Primeiramente, descompacte o tar.gz do ClamAV e crie os usuários padrão.
root@máquina:/usr/src# tar -xvzf clamav-0.70.tar.gz root@máquina:/usr/src# groupadd clamav root@máquina:/usr/src# adduser -g clamav -s/bin/false -c"ANTI-VIRUS Clamav" clamavPara compilarmos, vamos usar algumas opções no ./configure:
root@máquina:/usr/src/clamav-0.70# ./configure --prefix=/usr --sysconfdir=/etc && make && make install
Pronto, seu ClamAV está instalado, agora so falta configurar o seu /etc/clamav.conf.
Apenas algumas linhas precisam ser alteradas. Entre elas, precisamos comentar a linha "Example" e descomentar as linhas "ScanMail" e "User clamav". Você pode querer também alterar algumas variaveis do ClamAV, como lugar em que é gerado o unix socket. Segue abaixo um exemplo de clamav.conf:
#/etc/clamav.conf LogTime # Você pode ter o log no syslog ou em um arquivo de log, ou os 2. LogSyslog LogFile /var/log/clam/clamd.log PidFile /var/run/clam/clamd.pid LocalSocket /var/run/clam/clamd.sock FixStaleSocket MaxThreads 50 ThreadTimeout 600 MaxDirectoryRecursion 15 FollowFileSymlinks SelfCheck 600 User clamav ScanMail ScanArchive ArchiveMaxFileSize 10M ArchiveMaxRecursion 5 ArchiveMaxFiles 1000
Nesse exemplo, foram usados os diretórios (inexistentes) /var/run/clam, /var/log/clam. Crie ambos e de permissoes para o usuário "clamav" (caso queira usar essa estrutura de diretórios):
root@máquina:# mkdir /var/run/clam /var/log/clam root@máquina:# chown -R clamav:clamav /var/run/clam /var/log/clam
Não se esqueca de colocar o /usr/sbin/clamd para ser iniciado no boot. Note que é uma boa idéia inicia-lo ANTES do Postfix (assim, quando o Postfix requisitar o antivirus, ele já esta la.)
Bem, aqui devemos dar nosso agradecimento ao thefallen em ter aberto nossos olhos em relação a essa implementação e pelo desenvolvimento desse filtro.
Pegue o script em http://www.unitednerds.org/projects/mail/clamav-filter.sh.gz
Descompacte o script no diretório : /usr/lib/postfix (ou /usr/libexec/postfix), e dê permissão de execução com o comando "chmod 0755 clamav-filter.sh".
Não se esqueca de criar o diretório de spool /var/spool/filter com o usuário "clamav" como owner.
root@máquina:/usr/lib/postfix# bunzip2 clamav-filter.sh.bz2 root@máquina:/usr/lib/postfix# chmod 0755 clamav-filter.sh root@máquina:/usr/lib/postfix# mkdir /var/spool/filter root@máquina:/usr/lib/postfix# chown clamav:clamav /var/spool/filter
Dentro do arquivo master.cf insira as seguintes linhas:
smtp inet n - n - - smtpd
-o content_filter=clamav:clamav
clamav unix - n n - - pipe
flags=Rq user=clamav argv=/usr/lib/postfix/clamav-filter.sh -f ${sender} -- ${recipient}
OBS - se você antes usava amavis, não se esqueca de comentar as linhas referentes a ele no master.cf e se atente em tirar a linha "content_filter = smtp-amavis:[127.0.0.1]:10024" dentro do main.cf.
É bastante simples integrarmos o SpamAssassin ao nosso script do Clamav Filter. Supondo que você já tenha o SpamAssassin instalado, e o "spamd" rodando, basta editar o clamav-filter.sh e mudar algumas linhas (dica de David da Guia Carvalho) .
Se você quiser o metodo "convencional" de apenas taggear a mensagem, faça essas alterações:
SENDMAIL="/usr/sbin/sendmail -i "Para:
SENDMAIL="/usr/bin/spamc -f -e /usr/sbin/sendmail -i "
Se você quiser descartar a mensagem (ao invez de apenas taggea-la), faça essas alterações:
viruscanPara:
#
# SpamAssassin
#
spamc -c < $nome_arquivo >/dev/null ; RETVAL=$?
if [ $RETVAL -ne 0 ]; then
# Se quiser redireciona-la para outro lugar...
sed -e "s/^Subject: /Subject: --- SPAM (SpamAssassin): $from -> $@ --- /i" $nome_arquivo | $SENDMAIL -f postmaster@$MYHOSTNAME -- postmaster@$MYHOSTNAME
rm -f $nome_arquivo
exit 0
fi
viruscan
Aproveitando o embalo do SpamAssassin, você pode também integrar (ou apenas integrar) o BogoFilter. Lembre-se de que o bogofilter vai usar a lista de palavras dentro do homedirectory do usuário que esta rodando o bogofilter...
Basta fazer as alterações semelhantes as do SpamAssassin acima...
#
# BogoFilter
#
bogofilter -l < $nome_arquivo >/dev/null ; RETVAL=$?
if [ $RETVAL -ne 1 ]; then
# Se quiser redireciona-la para outro lugar...
sed -e "s/^Subject: /Subject: --- SPAM (BogoFilter): $from -> $@ --- /i" $nome_arquivo | $SENDMAIL -f postmaster@$MYHOSTNAME -- postmaster@$MYHOSTNAME
rm -f $nome_arquivo
exit 0
fi
viruscan
Podemos acertar alguns detalhes no Postfix para evitar que o filtro de timeout sob carga pesada. No master.cf, você pode limitar a quantidade de processos do filtro rodando ao mesmo tempo (para evitar que o workload da máquina suba muito). No exemplo abaixo, limitamos a 15 instancias do filtro; aumente esse limite com calma e veja até onde seu servidor aguenta sem "abrir o bico" :)
clamav unix - n n - 15 pipe
flags=Rq user=clamav argv=/usr/lib/postfix/clamav-filter.sh -f ${sender} -- ${recipient}
Precisamos também ajustar a variável "command_time_limit" no main.cf. Essa variável diz quanto tempo um comando externo ao Postfix pode rodar antes de ser "morto" pelo processo "master". O default é de 1000s; esse valor deve ser suficiente para a maioria dos ambientes. No entanto, em horarios de pico de utilização da máquina, ou sob ataque, esse limite pode causar erros de "Timeout Exceeded" no Postfix. Pode aumenta-lo para um valor maior (talvez 1h) para evitar isso. Basta colocar no main.cf uma linha assim:
#/etc/postfix/main.cf: command_time_limit = 1h
O ClamAV já vem com uma ferramenta para fazer isso, o "freshclam". Pode-se inicia-lo como um "daemon" no sistema e deixar que ele verifique se há atualizações no "banco de dados" do ClamAV. Você pode inicia-lo com o comando:
/usr/bin/freshclam --log-verbose --daemon-notify --daemon --checks=50 --log=/var/log/clam/freshclam.log
Depois que se sentir "seguro" com o funcionamento do ClamAV (depois que já tiver mostrado pro seu chefe que o ClamAV se atualiza sozinho mesmo :D), você pode remover as opções de "verbose" do clamav.conf e do freshclam. Isso economiza espaco em disco, descartando logs desnecessarios.
Ah, não se esqueca de colocar o freshclam para rodar no boot também :)
O comando "clamdscan" conecta ao daemon (via unix-domain ou tcp sockets) "clamd" e solicita que o daemon verifique o arquivo. Manter o clamd rodando e apenas solicitar verificações pelo cliente agiliza bastante o processo de verificação. Dessa maneira, você evita o desperdicio de recursos que seria carregar todo o banco de dados de virus apenas para scanear um arquivo.
É por esse motivo que precisamos rodar o script com o mesmo usuário que o "clamd" estara rodando, para que ele possa acessar as mensagens na fila de filtragem.
Faça um teste rodando o clamdscan e rodando o clamscan (esse não usa o clamd; ele carrega todas as definições de virus e depois scaneia). No ultimo benchmarking que eu fiz, o clamscan levava em media 80 segundos para fazer o que o clamdscan fazia em 5-7 segundos.
Para integrarmos o ClamAV Filter ao Postfix, usamos as opções de content_filter do Postfix ligadas ao processo "pipe" do mesmo, que permite que enviemos mensagens "para fora" do Postfix.
Há mais explicações sobre isso na Palestra do evento LinuxChix-BR de 2004, disponivel neste mesmo site (http://www.unitednerds.org/thefallen/docs/?area=Postfix).
Bem, agora é so digitar "postfix reload" e ver como a performance de seu MTA vai melhorar em 99%. Bom agora você pode pedir seu aumento salarial ao seu chefe que com certeza ele vai aceitar hehehehehe abração e espero ter ajudado, qualquér dúvida envie um email
[],s
Gleydson Soares - Analista - gsoares@securityanalyze.com gsoares@nerdgroup.org gsoares@fib.br
David da Guia Carvalho - Analista - dguiarj@globo.com