Gleydson Soares (gsoares) e Deives Michellis
(thefallen)
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).
Primeiramente, descompacte o tar.gz do ClamAV e crie os usuarios padrao.
root@maquina:/usr/src# tar -xvzf clamav-0.70.tar.gz root@maquina:/usr/src# groupadd clamav root@maquina:/usr/src# adduser -g clamav -s/bin/false -c"ANTI-VIRUS Clamav" clamav
Para compilarmos, vamos usar algumas opcoes no ./configure:
root@maquina:/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". Voce pode querer tambem alterar algumas variaveis do ClamAV, como lugar em que eh gerado o unix socket. Segue abaixo um exemplo de clamav.conf:
#/etc/clamav.conf LogTime # Voce 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 diretorios (inexistentes) /var/run/clam, /var/log/clam. Crie ambos e de permissoes para o usuario "clamav" (caso queira usar essa estrutura de diretorios):
root@maquina:# mkdir /var/run/clam /var/log/clam root@maquina:# chown -R clamav:clamav /var/run/clam /var/log/clam
Nao se esqueca de colocar o /usr/sbin/clamd para ser iniciado no boot. Note que eh uma boa ideia inicia-lo ANTES do Postfix (assim, quando o Postfix requisitar o antivirus, ele ja 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.bz2
Descompacte o script no diretorio : /usr/lib/postfix (ou /usr/libexec/postfix), e dê permissao de execução com o comando "chmod 0755 clamav-filter.sh".
Nao se esqueca de criar o diretorio de spool /var/spool/filter com o usuario "clamav" como owner.
root@maquina:/usr/lib/postfix# bunzip2 clamav-filter.sh.bz2 root@maquina:/usr/lib/postfix# chmod 0755 clamav-filter.sh root@maquina:/usr/lib/postfix# mkdir /var/spool/filter root@maquina:/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 voce antes usava amavis, nao 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.
Eh bastante simples integrarmos o SpamAssassin ao nosso script do Clamav Filter. Supondo que voce ja tenha o SpamAssassin instalado, e o "spamd" rodando, basta editar o clamav-filter.sh e mudar a linha:
SENDMAIL="/usr/sbin/sendmail -i "
Para:
SENDMAIL="/usr/bin/spamc -f -e /usr/sbin/sendmail -i "
Agradecimentos a David da Guia Carvalho pela dica :)
Podemos acertar alguns detalhes no Postfix para evitar que o filtro de timeout sob carga pesada. No master.cf, voce pode limitar a quantidade de processos do filtro rodando ao mesmo tempo (para evitar que o workload da maquina suba muito). No exemplo abaixo, limitamos a 15 instancias do filtro; aumente esse limite com calma e veja ate 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 tambem ajustar a variavel "command_time_limit" no main.cf. Essa variavel diz quanto tempo um comando externo ao Postfix pode rodar antes de ser "morto" pelo processo "master". O default eh de 1000s; esse valor deve ser suficiente para a maioria dos ambientes. No entanto, em horarios de pico de utilizacao da maquina, 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 ja vem com uma ferramenta para fazer isso, o "freshclam". Pode-se inicia-lo como um "daemon" no sistema e deixar que ele verifique se ha atualizacoes no "banco de dados" do ClamAV. Voce 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 ja tiver mostrado pro seu chefe que o ClamAV se atualiza sozinho mesmo :D), voce pode remover as opcoes de "verbose" do clamav.conf e do freshclam. Isso economiza espaco em disco, descartando logs desnecessarios.
Ah, nao se esqueca de colocar o freshclam para rodar no boot tambem :)
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 verificacoes pelo cliente agiliza bastante o processo de verificacao. Dessa maneira, voce evita o desperdicio de recursos que seria carregar todo o banco de dados de virus apenas para scanear um arquivo.
Eh por esse motivo que precisamos rodar o script com o mesmo usuario que o "clamd" estara rodando, para que ele possa acessar as mensagens na fila de filtragem.
Faca um teste rodando o clamdscan e rodando o clamscan (esse nao usa o clamd; ele carrega todas as definicoes 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 opcoes de content_filter do Postfix ligadas ao processo "pipe" do mesmo, que permite que enviemos mensagens "para fora" do Postfix.
Ha mais explicacoes sobre isso na Palestra do evento LinuxChix-BR de 2004, disponivel no 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, qualquer dúvida envie um email
[],s
Gleydson Soares "gsoares"
Deives Michellis "thefallen"
David da Guia Carvalho - Analista
Ultima Revisao: 25/08/2004
A menos que especificado de outra maneira, todos
os documentos e textos sao protegidos sob licenca BSD - Veja a
licenca