Validando remetentes por confirmação de mensagem

Antispam ASK - Validando remetentes por confirmação de mensagem
Fonte: linuxIT

Introdução

Por Patrick Brandão
http://www.patrick.eti.br
contato@patrick.eti.br

Aviso

Este artigo pode ser distribuído, publicado, impresso e copiado de todas as formas e meios possíveis, desde que se mantenha o nome, a página web e o e-mail do autor no cabeçalho, em local visível, abaixo do título e com a letra maior ou igual a usada no texto.

É segunda-feira, você chega no serviço, abre o cliente e e-mail, e de repente, chove mensagem: “Viagra”, “Trabalhe em casa”, “Você está sendo traido”, “Livre-se das multas”, etc...

Depois de implementar o SpamAssassin, a redução é drástica, mas não total, infelizmente você corre o risco de ter uma mensagem legítima excluída, e o risco aumenta a medida que você abaixa o nível, tornando o SpamAssassin mais agressivo. Programá-lo para apenas marcar as mensagens como SPAM ajuda, mas você de qualquer maneira, vai perder tempo separando algo do lixo.

Então, qual a solução?

Os spammers, pessoas desprezíveis, usam sistemas de envio de mensagens em massa, a maioria, um simples arquivo de texto com uma lista de endereços e um script que passa linha por linha enviando uma cópia do SPAM para cada um. Os mais modernos, tem sistemas com dicionários e funções de detecção de endereço de e-mail válido, sugando páginas de sites de busca, verdadeiros ROBOS.

O detalhe interessante, é que quando os SPAM’s são enviados usando remetentes inexistentes, o e-mail tende a voltar para o remetente (inventado pelo maligno), que não usa uma caixa postal válida, o resultado disso é uma fila enorme de mensagens em busca de um fim. Um dos servidores de e-mail que gerencio, certa vez chegou a ter 136 mil mensagens na fila, sendo que havia apenas 900 caixas válidas.

Bloquear o endereço do remetente é perca de tempo. Por que?
Os spammers criam strings aleatórias para o usuário no campo “From:” do SPAM e um domínio válido, e usam servidores open-relay aleatórios também, por exemplo:

From: xyz@yahoo.com.br
To: vitima@dominio.com
Subject: compre viagra, baratinho!

Assim, você bloqueia o xyz@yahoo.com.br, para que os SPAM’s sejam bloqueados, mas o próximo SPAM logo atrás dele terá o cabeçalho:

From: abc123@yahoo.com.br
To: vitima@dominio.com
Subject: compre viagra, baratinho!

Então vamos pelo assunto!
Bloqueia tudo que tiver "viagra" no assunto, e o próximo e-mail será:

From: xyz@yahoo.com.br
To: vitima@dominio.com
Subject: compre V 1
4 G R 4!

Se você bloquear o domínio yahoo.com.br, vai ter problemas de verdade pois e-mail legítimos serão afetados.

Conclusão do texto acima: spammers não recebem retornos por e-mail, apenas usuários legítimos, os sacanas não querem um reply de seu lixo, apenas que você leia o conteúdo ou visite o link indicado. Eles são malignos, conhecem bem os antis-spam's existentes e vivem criando e-mails capazes de burlar a avaliação dos mesmos.

Nesse artigo você vai aprender como implementar, personalizar e dar suporte a um servidor de e-mail com o anti-SPAM ASK, cujo funcionamento é igual e superior ao anti-SPAM UOL!

O objetivo é ter na caixa de entrada, apenas endereços de e-mail de pessoas legítimas, que pretendem receber retorno das mensagens enviadas.

Algoritmo e fluxograma

- Como funciona?

A mensagem parte do remetente em direção ao seu servidor de e-mail, dentro dele, a mensagem é analisada pelo MTA e entregue ao MDA (agente de entrega). É aqui que o ASK trabalha, no MDA, ou seja, no momento em que a mensagem está pronta para ser escrita na caixa do usuário ela entra no fluxograma do anti-SPAM.

O fluxo da mensagem é complexo, mas basicamente:

- Se é uma mensagem que retornou de um tira-teima, um código md5 é verificado para liberar a mensagem original e ela é movida para a caixa de entrada.
- Caso contrário, o remetente é verificado na lista branca (whitelist) e na lista de remetentes bloqueados (ignorelist). Se estiver permitido, a entrega é feita, se estiver bloqueado, já era. Caso contrário:
- É verificado se a palavra (ou frase) secreta se encontra na mensagem. Caso positivo, a mensagem é entregue. Caso contrário:
- A mensagem é salva em uma fila local, o tira teima é criado com um código md5 de validação e enviado para o remetente.

Fluxograma detalhado:
http://a-s-k.sourceforge.net/paper/img1.png

Servidor de e-mail

Como minha praia é qmail, usaremos ele para implementar o ASK. Esse capítulo é resumido e não é o foco do artigo.

Perguntas e dúvidas sobre o qmail devem ser evitadas para não fugir do tema aqui - ASK.

Se você leu o capítulo 2, viu que o ASK trabalha no MDA, então usaremos o genérico: vpopmail.

MTA - qmail
MDA e gerente de contas - vpopmail

Na instalação do qmail e vpopmail, você encontrará tudo que precisa nos links abaixo:

www.lifewithqmail.com.br
www.vivaolinux.com.br/scripts/verScript.php?codigo=596
www.lifewithqmail.org
www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1468
www.qmailrocks.com

Vou considerar que:

- qmail instalado em /var/qmail, como um domínio
- vpopmail instalado em /home/vpopmail domínio virtual adicionado: intranet.br

Se você já tem um servidor, próximo capítulo...

Download e instalação

Procedimentos:

* Verifique se você tem o pacote python instalado, o ASK invoca o interpretador de comandos a partir de /usr/bin/python

1 - baixe o ASK

http://prdownloads.sourceforge.net/a-s-k/ask-2.5.2.tar.gz?download

2 - Instalação

# tar -xvzf ask-2.5.2.tar.gz
# mv ask-2.5.2 /usr/share/ask
# chown root.root /usr/share/ask -R
# chmod +rx /usr/share/ask
# chmod +r /usr/share/ask -R


Isto basta. Próximo passo, ativar ASK em uma conta.

Ativando ASK em uma conta

Primeiramente, criemos uma conta:

# /home/vpopmail/bin/vadduser contato@intranet.br senhasecreta

Vá até a pasta do domínio intranet.br, caso não saiba onde é, digite:

# /home/vpopmail/bin/vdominfo intranet.br -d

Como vamos trabalhar com o usuário "contato" do domíno "intranet.br", na pasta do domíno crie o arquivo:

.qmail-contato

Esse arquivo receberá as mensagens do qmail, que serão processadas pelos comandos contidos nesse arquivo. Para que a mensagem seja simplesmente entregue, o seguinte conteúdo basta:

| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox

Porém, para usar o ASK, é necessário:

| preline /usr/share/ask/askfilter --loglevel=5 --logfile=/var/log/ask/contato_intranet.br.log --home=/home/vpopmail/domains/intranet.br/contato

O usuário vpopmail DEVE conseguir ler este arquivo, portanto:

# chown vpopmail.vchkpw /home/vpopmail/domains/intranet.br/.qmail-contato

Vamos estudar os parâmetros:
--loglevel: define o nível de sensibilidade do log, de 1 a
10
--logfile: arquivo onde os eventos serão registrados, é necessário que o usuário que executa a entrega (normalmente, vpopmail uid 89) tenha permissão de escrita.
--home: diretório do usuário, para descobrir, digite:

# /home/vpopmail/bin/vuserinfo contato@intranet.br -d

Ainda não está pronto, é necessário criar o arquivo de configuração e as subpastas do ASK trabalhar.

Dentro do diretório do usuário contato@intranet.br (/home/vpopmail/domains/intranet.br/contato), execute:

# mkdir .ask
# cd .ask
# cp /usr/share/ask/templates . -R
# mkdir queue
# mkdir tmp
# touch ignorelist.txt
# touch whitelist.txt
# chown vpopmail.vchkpw /home/vpopmail/domains/intranet.br/contato/.ask -R
# chmod 600 /home/vpopmail/domains/intranet.br/contato/.ask -R


Resultado na pasta do usuário contato:

# find

- contato
..|+Maildir/
..| - .ask/
........| --- queue/
........| ---- tmp/
........| ---+templates/
........| ---- whitelist.txt
........! ---- ignorelist.txt

As mensagens esperando por confirmação do remetente permanecerão no diretório "queue", arquivos temporários serão trabalhados em "tmp", remetentes conhecidos deverão estar cadastrados em "whitelist.txt" e remetentes bloqueados em "ignorelist.txt".

O mais importante aqui é que o usuário (uid) responsável pela entrega (vpopmail) seja capaz de escrever nesses diretórios.

O arquivo de configuração. Quando definimos "--home=/home/vpopmail/domains/intranet.br/contato" no comando askfilter, fizemos com que o ASK procure nessa pasta o arquivo .askrc, esse arquivo contem as configurações do ASK especificos para a conta em que vamos usá-lo. Crie o arquivo ".askrc" no diretório especificado e no conteúdo coloque:

#------------------- inicio da configuração
[ask]
rc_mymails = contato@intranet.br
rc_myfullname = Contato Intranet
rc_mymailbox = /home/vpopmail/domains/intranet.br/contato/Maildir/
rc_mailkey = ContatoImediatoSecreto
rc_md5_key = mamamiaASK

rc_remote_cmd_enable = on
rc_remote_cmd_htmlmail = off
rc_basic_headers = From:,To:,Cc:,Bcc:,Date:,Subject:,Return-Path:,Received:,Message-ID:
rc_max_attach_lines = 0
rc_askdir = ${HOME}/.ask
rc_msgdir = %(rc_askdir)s/queue
rc_tmpdir = %(rc_askdir)s/tmp
# Templates Padrao para Todos
rc_confirm_dirs = /usr/share/ask/templates
rc_whitelist_on_mailkey = true
rc_confirm_langs = ptbr
rc_whitelist = %(rc_askdir)s/whitelist.txt, %(rc_askdir)s/whitelist-local.txt
rc_ignorelist = %(rc_askdir)s/ignorelist.txt, %(rc_askdir)s/ignorelist-local.txt
rc_mta_command = /usr/sbin/sendmail -t < MAILFILE

#------------------- fim da configuração



Salve e garanta que o usuário vpopmail conseguirá ler este arquivo:

# chown vpopmail.vchkpw .askrc
# chmod g-rwx .askrc

Vamos ver a função de algumas opções:

* rc_mymails = contato@intranet.br

Define os endereços de email que passarão pelo ASK com destino ao mesmo diretório definido em rc_mymailbox, caso haja mais de um, coloque:

rc_mymails = contato@intranet.br , diretoria@intranet.br

Separando por espaço-virgula-espaço

* rc_myfullname = Contato Intranet

Define o nome do responsável pela conta, essa informação é usada no campo "From:" do e-mail de tira-teima, portanto, coloque um nome assimilativo, a maioria dos clientes de e-mails coloca o nome do campo "From" no catálogo de endereços quando uma mensagem é respondida.

* rc_mymailbox = /home/vpopmail/domains/intranet.br/contato/Maildir/

Define o diretório onde as mensagens serão gravadas para que os softwares servidores (POP3, IMAP) possam entregá-las ao usuário. A presença do barra ("/") no final define o tipo de entrega como Maildir. Caso fosse em mailbox, defina o caminho para o arquivo, sem o barra no final.

* rc_mailkey = ContatoImediatoSecreto

Esse recurso é interessante: define a frase ou palavra secreta. Caso este segredo esteja presente no corpo da mensagem, ela é considerada válida será entregue diretamente, sem tira-teima. Procure colocar algo não muito óbvio, como seu nome! O sobrenome é uma boa idéia, haja visto que apenas seus conhecidos sabem.

* rc_md5_key = mamamiaASK

Define a palavra ou frase usada para gerar o código MD5. Esse código é enviado no assunto da mensagem de tira-teima.

* rc_remote_cmd_enable = on

Habilita/desabilita comandos remotos.

* rc_remote_cmd_htmlmail = off

Habilita/desabilita comandos remotos em mensagens com formato html

* rc_basic_headers = From:,To:,Cc:,Bcc:,Date:,Subject:,Return-Path:,Received:,Message-ID:

Define cabeçalhos usados para verificações.

* rc_askdir = ${HOME}/.ask

Diretório onde as sub-pastas (tmp/, queue/, templates/) foram instalados.

rc_msgdir = %(rc_askdir)s/queue

Diretório onde as mensagens aguardarão por confirmação.

rc_tmpdir = %(rc_askdir)s/tmp

Diretório para manipulação de arquivos temporários

rc_confirm_dirs = %(rc_askdir)s/templates

Diretório onde estão os templates (modelos) para envio do tira-teima, esses templates pode ser personalizados, assim você coloca aqui a mensagem que deseja enviar para o remetente avaliado.

* rc_whitelist_on_mailkey = true

Se definido como "true", adiciona automaticamente na lista branca (whitelist.txt) o remetente que informou a frase/palavra secreta no conteúdo da mensagem. É necessário que o usuário responsável pela entrega (vpopmail) consiga escrever nesse arquivo.

* rc_confirm_langs = ptbr

Linguagem usada na mensagem de tira-teima, esse valor define os arquivos em templates/ que serão usados.

* rc_whitelist = %(rc_askdir)s/whitelist.txt, %(rc_askdir)s/whitelist-local.txt

Define os arquivos de lista branca, quando um remetente retorna o tira-teima, o endereço de e-mail dele é adicionado no primeiro arquivo definido. Assim, o usuário responsável pela entrega (vpopmail) deve ter privilégios de escrita nesse arquivo. Use o segundo parâmetro (opcional) para definir uma lista global, ou criar grupos de listas: use a imaginação!

* rc_ignorelist = %(rc_askdir)s/ignorelist.txt, %(rc_askdir)s/ignorelist-local.txt

Define os arquivos de lista negra.

* rc_mta_command = /usr/sbin/sendmail -t < MAILFILE

MUITO IMPORTANTE. Define o comando a ser executado para enviar a mensagem de tira-teima. No caso do qmail, /usr/sbin/sendmail deve ser um link simbólico para /var/qmail/bin/sendmail

Prontinho!

Envie uma mensagem para o usuário que está usando ASK e verifique o resultado. Caso erros ocorram, o ASK procura o primeiro diretório acima do diretório do usuário para escrever um arquivo ASK-XXXXX contendo os erros.

Ajuda e referencias

O artigo atualizado será mantido no site www.lifewithqmail.com.br

Caso deseja se aprofundar no ASK, aconselho que visite a página do autor e do ASK:

http://www.paganini.net
http://www.paganini.net/ask

Procure não fazer perguntas sem antes reler o artigo ou consultar a versão atualizada!

Grato, espero que gostem.

2 comentários:

  1. Sérgio Luiz

    Esta foi a segunda vez que tentei por o ASK pra funcionar. Com este artigo que está eu seu blog eu consegui.

    A única dificuldade que tive foi quanto ao templante, que tive que aponta para o próprio home do usuário e também os arquivos de log que eu não tinha criado e nem dado permissão. Ah, também tive que mudar o link do sendmail para o diretório do qmail que você citou.

    Este cliente estava com um Debian aplinux com o kernel 2.4.30.

    Obrigado,

    José Antônio de Moura Neto
    São Luis/MA

    ResponderExcluir
  2. Ivanluiz B. Trindadequarta-feira, 02 julho, 2008

    Gostei muito da solução. Contudo após revisar tudo estou tendo dificuldades para fazer funcionar.
    Estou tendo o seguinte erro no arquivo ASK-FATAL-ERROR.19778:

    Traceback (most recent call last):
    File "/usr/share/ask/askfilter", line 60, in ?
    config = askconfig.AskConfig(sys.argv)
    File "/usr/share/ask/askconfig.py", line 96, in __init__
    self.__read_config(self.rcfile)
    File "/usr/share/ask/askconfig.py", line 237, in __read_config
    sys.exit(self.RET_PROCMAIL_CONTINUE)
    SystemExit: 0

    Alguma sugestão do que fiz de errado ?

    Ivanluiz B. Trindade

    ResponderExcluir

Insira seu comentário - O mesmo será submetido à aprovação!

linux-cookbook

Grupos do Google
Participe do grupo linux-cookbook
E-mail:
Visitar este grupo