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

Tecnicas Anti-SPAM com o Postfix - Parte 1

by Deives Michellis "thefallen"



1. Introducao

Voce, com certeza, ja recebeu muitos SPAMS. Hoje mesmo ja deve ter recebido vaaarios :)

Aqui vao algumas dicas simples pra diminuir a quantidade de SPAMS com algumas configuracoes no Postfix. Embora nao se trate de um documento "for dummies", procurei ser bastante explicativo nos "porques" :)

Obs - Estou assumindo que voce esta usando uma versao razoavelmente recente do Postfix (da serie 2.0.x). As versoes mais antigas possuem a maioria das opcoes listadas aqui, embora o modo como o Postfix lida com os backends/mapeamentos possa diferir um pouco. Em todo caso, aconselho-o a atualizar seu Postfix se ele ainda nao estiver na serie 2.0.x.

2. Uma breve introducao aos tipos de backends, ou mapeamentos

A parte mais interessante disso eh que todas as macros utilizadas nessas restricoes sao independentes do backend utilizado.

O Postfix implementa diversos backends, ou mapeamentos, que podem ser usados transparentemente pelas macros. Por exemplo, uma macro pode ser declarada como:

  (...) check_sender_access regexp:/etc/postfix/regexpsenders, check_sender_access hash:/etc/postfix/hashsenders, check_sender_access ldap:ldapsenders, (...)

Perceba como a mesma macro pode usar diversos tipos de backends ao mesmo tempo.

As palavras reservadas "regexp:", "hash:", "ldap:" e outras sao backends suportados pelo Postfix. Dependendo de como voce compila o seu, ele pode ter alguns backends adicionais. O padrao eh: static, nis, regexp, environ, btree, unix e hash (voce pode ver quais estao compilados no seu Postfix com o comando "postconf -m").

3. Bloqueios Simples

Vamos ver algumas configuracoes que realizam as verificacoes basicas, um "feijao com arroz" no combate ao SPAM.

Essas opcoes vem desativadas por default gracas ao enorme numero de clients SMTP "meia boca", que nao implementam as especificacoes das RFCs. Entre esses clients mal-feitos, o mais notorio de todos eh aquele feito pelo "Tio Bill", que embora seja bonitinho, ignora a maioria das especificacoes internacionais.

3.1. Rejeitando Dominios Invalidos

O Postfix ja inclui algumas macros pra verificar os dominios de remetentes antes de aceitar a mensagem.

  /etc/postfix/main.cf:
  smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain, (...)

O reject_non_fqdn_sender rejeita remetentes sem dominio completamente qualificado (Fully-Quallified Domain Name - fqdn). Por exemplo, nao posso mandar emails com o usuario fulano, ou fulano@localhost. Acredite, isso pega uma BOA quantidade de Mailers.

O reject_unknown_sender_domain faz uma consulta no DNS e verifica se o dominio do remetente existe ou nao (o dominio precisa possuir um registro MX ou A para o dominio). Isso impede que eu envie emails como fulano@kasjdkajsdkajksdjaskdja.net. Bastante efetivo tambem.

3.2. Exigindo Identificacao (HELO/EHLO)

Quando um client SMTP conecta-se a um servidor SMTP, ele precisa se identificar com o comando HELO, ou solicitar informacoes de autenticacao e outras com o comando EHLO.

A maioria dos Mailers de SPAM ignora esse comando (uma sessao SMTP funciona perfeitamente bem, tecnicamente falando, SEM essa identificacao). Podemos pega-los exigindo q eles usem a identificacao. Vamos configurar isso no /etc/postfix/main.cf:

  /etc/postfix/main.cf:
  smtpd_helo_required = yes

3.3. Forçando o envelopamento correto de enderecos

Embora o titulo soe imponente e complicado, a restricao eh bem simples. Quando se vai informar o remetente e os destinatarios numa sessao SMTP, usa-se o comando MAIL FROM/RCPT TO. Normalmente uma sessao SMTP pode ser assim:

  thefallen@KlingonRealm:~$ telnet localhost 25
  220 KlingonRealm ESMTP Postfix
  HELO KlingomRealm
  250 KlingonRealm
  MAIL FROM: thefallen@unitednerds.rog
  250 Ok
  RCPT TO: thefallen
  250 Ok

A RFC 821 basicamente exige que os enderecos sejam "envelopados" ou contidos por <>. A opcao strict_rfc821_envelopes do Postfix faz com que se use essa notacao na sessao SMTP. Isso ajuda a barrar alguns Mailers. Vamos setar essa opcao para "yes" no /etc/postfix/main.cf

  /etc/postfix/main.cf:
  strict_rfc821_envelopes = yes

Veja agora como fica uma sessao STMP "mal-educada":

  thefallen@KlingonRealm:~$ telnet localhost 25
  220 KlingonRealm ESMTP Postfix
  HELO KlingonRealm
  250 KlingonRealm
  MAIL FROM: thefallen@unitednerds.org
  501 Bad address syntax
  MAIL FROM: <thefallen@unitednerds.org>
  250 Ok

3.4. Bloqueando "pipe lining"

Uma outra tecnica bastante comum em mailers eh enviar toda a mensagem de uma vez soh, sem aguardar as respostas do servidor SMTP. Podemos facilmente bloquear isso com a macro "reject_unauth_pipelining". Basta coloca-la no /etc/postfix/main.cf no fim da definicao do smtpd_sender_restrictions:

  /etc/postfix/main.cf:
  smtpd_sender_restrictions = (...) reject_unauth_pipelining

4. Bloqueios com Listas de Acesso

O Postfix permite que se usem diversas listas e arquivos de configuracao para bloquear determinados clientes SMTP de se conectarem ao servidor. Podem ser listas de Hostnames, listas de IPs, listas de identificacao de maquina (HELO/EHLO), listas de remetentes/destinatarios, e mesmo listas de enderecos MX (Mail Exchanger, o servidor que recebe email para um dominio).

4.1. Bloqueio de IPs/Hostnames

Podemos colocar diversas restricoes dentro da configuracao "smtpd_client_restrictions", que se aplica a todas as conexoes recebidas pelo servidor SMTP. Vamos usar a macro "check_client_access" que verifica o acesso do hostname/endereco IP numa fonte de dados.

Vamos primeiro criar nossa base de IPs proibidos no arquivo /etc/postfix/ip-access. Estaremos usando o backend "hash", que nada mais eh que um arquivo texto indexado pela Berkeley DB. Mapeamentos "hash" sao os mais rapidos para processar.

  /etc/postfix/ip-access:
  127.0.0.1      REJECT IP nao permitido
  200.200.200.200    REJECT Sai fora, spammer
  10.10.0.1       REJECT IP Nao permitido
  localhost.localdomain TAB REJECT IP nao permitido

Mapeamentos "hash" precisam ser indexados com o comando "postmap".

  postmap /etc/postfix/ip-access

Agora vamos fazer o Postfix enxergar esse mapeamento no /etc/postfix/main.cf:

  /etc/postfix/main.cf:
  smtpd_client_restrictions = check_client_access hash:/etc/postfix/ip-access

Agora "postfix reload" para que as novas configuracoes entrem em vigor.

No caso de enderecos IPs ou Hostnames, o mapeamento "hash" talvez nao seja o mais indicado, uma vez que teriamos que bloquear IP por IP, nao sendo possivel bloquear uma subrede inteira. Vamos entao converte-lo para um padrao "regexp". Neste exemplo, estamos supondo que voce conhece pelo menos o basico de Regular Expressions (aquelas que o perl usa).

  /etc/postfix/ip-access:
  /^127\..*/             TAB  REJECT Subrede IP nao permitida!
  /^200\.200\.200\..*$/  TAB  REJECT Subrede IP de Spammers
  /^10\..*$/             TAB  REJECT Subrede IP nao permitida!
  /.*localhost.*/        TAB  REJECT Hostname nao permitido!
  /.*\.dsl\..*/          TAB  REJECT DSLs nao permitidas!
  /.*\.adsl\..*/         TAB  REJECT DSLs nao permitidas!

Apenas mapeamentos do tipo "hash" precisam ser indexados/compilados pelo postmap. Os outros formatos nao necessitam.

Vamos atualizar o main.cf:

  /etc/postfix/main.cf:
  smtpd_client_restrictions = regexp:/etc/postfix/ip-access

Agora um "postfix reload" e boa! Ja temos restricoes de hostnames e enderecos/classes IP.

4.2. Restricoes de identificacao HELO/EHLO

A exemplo da configuracao anterior, podemos usar algumas macros dentro da configuracao "smtpd_helo_restrictions". Existem diversas macros disponiveis (reject_invalid_hostname, reject_unknown_hostname, reject_non_fqdn_hostname, check_helo_access), mas todas elas, com excessao da check_helo_access, vao dar problemas com softwares microsoft, que costumam nao mandar seus hostnames na identificacao.

Vamos ver entao como configurar o check_helo_access. Vamos criar o arquivinho de configuracao /etc/postfix/helo-proibidos. Vamos usar a notacao regexp (Regular Expressions) para escrever as regrinhas.

  /etc/postfix/helo-proibidos:
  /.*tmpstr.*/  REJECT Sai fora, spammer
  /^hotmail\.com.*/ REJECT Nada de fake hotmail por aqui
  /^uol\.com.*/ REJECT Nada de fake UOL por aqui

Agora vamos referencia-lo dentro do main.cf:

  /etc/postfix/main.cf:
  smtpd_helo_restrictions = check_helo_access regexp:/etc/postfix/helo-proibidos

Agora, vamos pedir ao Postfix para re-carregar suas configuracoes com um "postfix reload". Faca um teste agora:

  thefallen@KlingonRealm:~$ telnet localhost 25
  220 KlingonRealm ESMTP Postfix
  HELO tmpstr
  554 <tmpstr>: Helo command rejected: Sai fora, spammer
  HELO hotmail.com
  554 <hotmail.com>: Helo command rejected: Nada de fake hotmail por aqui

Mais um filtro adicionado :)

4.3. Bloqueando Remetentes/Destinatarios

Podemos aplicar filtros de bloqueio direto na sessao SMTP, na hora dos comandos "MAIL FROM" e "RCPT TO". As configuracoes que controlam essas caracteristicas no SMTP sao, respectivamente, smtpd_sender_restrictions e smtpd_recipient_restrictions. Eh necessario um cuidado todo especial com o "smtpd_recipient_restrictions", uma vez que eh essa configuracao que controla o relay do servidor SMTP.

Assim como as configuracoes anteriores, temos as macros "check_sender_access" e "check_recipient_access". Se formos bloquear remetentes individuais apenas (1 por 1), seria indicado usarmos um mapeamento "hash". Como normalmente queremos bloquear dominios, ou remetentes, baseados em padroes (ou Regular Expressions), vamos estar usando um mapeamento "regexp".

Vamos passar aqui algumas regras bastante funcionais para bloquearmos remetentes indesejados. Vamos criar o arquivo /etc/postfix/sender-proibidos

  /etc/postfix/sender-proibidos:
  # Bloquear remetentes com 3 ou mais _ no username
  /.*_.*_.*_.*@.*/          TAB  REJECT Endereco de e-mail invalido
  # Bloquear remetentes com 3 ou mais numeros consecutivos no username
  /.*[0-9][0-9][0-9].*@.*/  TAB  REJECT Endereco de e-mail invalido
  # Bloquear emails do site XYZ
  /.*@xyz\.com\.br$/        TAB  REJECT Dominio proibido
  # Bloquear o usuario *marketing*
  /.*marketing.*@.*/        TAB  REJECT Enderecos de Marketing nao permitidos

Agora, vamos referencia-lo no main.cf:

  /etc/postfix/main.cf:
  smtpd_sender_restrictions = (...), check_sender_access regexp:/etc/postfix/sender-proibidos

Vamos agora passar as configuracoes de destinatarios/recipients. Podemos usar o mesmo arquivo de bloqueio de remetentes (pode-se criar outro tambem). Mas, como eu disse antes, cuidado para nao "escancarar" seu relay :)

  /etc/postfix/main.cf:
  smtpd_recipient_restrictions = permit_mynetworks, (...), check_recipient_access regexp:/etc/postfix/sender-proibidos, (...), reject_unauth_destination

Atente para a ultima macro "reject_unauth_destination". Eh ela quem efetivamente fecha o relay do servidor. A macro "permit_mynetworks" abre o relay apenas para a rede interna (ou as redes definidas no mynetworks).

Note que a sequencia em que voce poe as macros eh muito importante. Nesse exemplo, quaisquer destinatarios, que supostamente seriam barrados, passarao pelos filtros quando voce for fazer o teste, uma vez que o permit_mynetworks esta antes do check_recipient_access.

5. Conclusao

Essas sao regras bastante simples mas que ja sao uma boa ajuda no combate aos malignos SPAMs.

Nos proximos artigos, vamos ver algumas configuracoes pra usar RBLs e outros bloqueios mais especificos, inclusive bloqueando dominios pelo seu endereco de servidor MX, alem de instalarmos alguns softwares que ajudam nessa Guerra Santa contra os Spammers Infieis :)

Sobre o autor

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

Ultima Revisao: Wed May 19 15:20:08 2004

Criado com o txt2tags



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.