Areas: Principal | Apache | DNS | FreeSWAN | giFT | LDAP | Mutt | Postfix | Sincronia | Vim | VNC

INTEGRANDO O POSTFIX COM O CLAMAV

Gleydson Soares (gsoares) - Deives Michellis "thefallen"



Aumento de Desempenho

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).

1. Software Utilizado

2. Partindo pra instalacao

2.1. ClamAV

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.)

2.2. ClamAV Filter

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.

3. Integrando com o SpamAssassin

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 :)

4. Acertando alguns detalhes no Postfix

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

5. Mantendo o "banco de dados" do ClamAV sempre atualizado

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 :)

6. Um pouquinho de Teoria (para os nao tao apressados :D)

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 neste mesmo site (http://www.unitednerds.org/thefallen/docs/?area=Postfix).

7. Finalizando

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

Autores

Gleydson Soares - Analista - gsoares@securityanalyze.com gsoares@nerdgroup.org gsoares@fib.br

Deives Michellis "thefallen" <dmichellis@yahoo.com | thefallen@unitednerds.org>

Colaboradores

David da Guia Carvalho - Analista - dguiarj@globo.com

Ultima Revisao: Wed May 19 17:16:55 2004

A menos que especificado de outra maneira, todos os documentos e textos sao protegidos sob licenca BSD - Veja a licenca para mais detalhes
Leia tambem sobre o motivo de uso de licencas em documentacao.