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

Integrando o Postfix com o ClamAV e SpamAssassin/Bogofilter

Gleydson Soares (gsoares) - Deives Michellis "thefallen"
Revisão $Id: Clamav-SA-Bogo.t2t,v 1.2 2004/09/23 20:20:28 thefallen Exp $



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

1.1. ClamAV

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" clamav
Para 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.)

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

2. Integrando com o SpamAssassin

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

  viruscan
Para:
  #
  # 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

3. Integrando o Bogofilter

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

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, 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

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

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

6. Um pouquinho de Teoria (para os não tão 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 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).

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, qualquér 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 Revisão: Thu Sep 23 17:26:12 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.