Protegendo o Postfix contra spam.

Como é de se imaginar, filtro contra spams é interessante e, o postfix possui algumas configurações específicas que tem como intuito se certificar de que o email enviado a você venha de um servidor real, bem configurado, e que não esteja em uma lista de bloqueio!

Vejamos algumas configurações interessantes para o main.cf:

Observações Relevantes:

  1. A ordem na seqüência das opções é fundamental!
  2. Todas as configurações se dão no arquivo main.cf,
  3. Embaixo de cada bloco de opções, segue uma explicação acerca das mesmas.
  4. [Atualizado 18/07/2010] Com a implementação Gerência da porta 25, as configurações removidas estão riscadas.
  5. Regras atualizadas em 06/08/2010.
  6. Regras RegEx revisadas e otimizadas em 20/08/2010.
  7. Alguns detalhes revistos em 14/09/2010.
  8. Mais detalhes revistos em 04/01/2011. (dynamic_checks, sender_checks, body_checks)
  9. Atualizado em 28/06/2012. Link para o filtro de conteúdo do postfix, executando body_checks em mensagens base64.
smtpd_delay_reject = yes no smtpd_helo_required = yes smtpd_helo_restrictions =  permit_sasl_authenticated check_helo_access hash:/etc/postfix/access check_helo_mx_access hash:/etc/postfix/access check_helo_ns_access hash:/etc/postfix/access check_helo_access pcre:/etc/postfix/helo_checks check_helo_access pcre:/etc/postfix/dynamic_checks reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname reject_rhsbl_helo multi.surbl.org reject_rhsbl_helo dnsbl.njabl.org reject_rhsbl_helo ...

smtpd_delay_reject Atrasa a recusa do helo, é utilizado com as conexões autenticadas pois esses clientes falam helo antes de autenticar.

permit_sasl_authenticated Permite as conexões autenticadas.

reject_*_hostname Verificações acerca de que o hostname fornecido seja real e válido.

reject_rhsbl_helo Verifica as listas RBL pelo hostname fornecido.

O arquivo helo_checks utiliza expressões regulares para certificar que o comando de helo não foi falsificado com o nome do seu servidor, nem que tenha sido enviado um ip ao invés de um domínio completo.

Também poderá conter bloqueios de outros helo’s conhecidos de spammers, disseminadores de virus, open relays, etc…

Exemplo do arquivo:

/(dominio1|dominio2)\.com\.br/ REJECT improper use of my domain /[\[\]]/ REJECT invalid ip address

Bloqueando quem disser ser dominio1.com.br ou dominio2.com.br e ou seus respectivos subdomínios, bloqueando também quem tentar fornecer um ip entre chaves.

O arquivo /etc/postfix/dynamic_checks contém expressões regulares para identificar hostnames de ips dinâmicos. Montei a lista a seguir que bloqueia as notações mais conhecidas:

/\d{1,3}[\.\-\_]\d{1,3}[\.\-\_]\d{1,3}[\.\-\_]\d{1,3}[\.\-\_].*\./ REJECT generic host access denied /(^|[\.\-\_]|@)dial([\-\_]?up)?[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)a?dsl[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)dhcp[\.\-\_]/              REJECT dynamic host access denied /(^|[\.\-\_]|@)client[\.\-\_]/            REJECT dynamic host access denied /(^|[\.\-\_]|@)(home)?user[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)dyn(amic)?(ip)?\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)cable[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)3g[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)static[\.\-\_]/ REJECT generic host access denied /(^|[\.\-\_]|@)rev(ers(e|o))?[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)ip[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\_\-]|@)ppp([\.\_\-]?oe)?[\.\_\-]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)pools?[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)dip\d[\.\-\_]/ REJECT dynamic host access denied /(^|[\.\-\_]|@)cpe[\.\-\_]/               REJECT dynamic host access denied /(^|[\.\-\_]|@)broadband[\.\-\_]/         REJECT dynamic host access denied /(^|@)[\da-f]{8}\..*\.[a-z]{2}/ REJECT generic host access denied

Vericamos essa lista no comando Helo e também de quem se conecta ao smtp:

smtpd_client_restrictions = permit_sasl_authenticated check_client_access hash:/etc/postfix/access check_client_mx_access hash:/etc/postfix/access check_client_ns_access hash:/etc/postfix/access check_client_access pcre:/etc/postfix/dynamic_checks reject_unknown_client_hostname reject_multi_recipient_bounce reject_rhsbl_client dnsbl.sorbs.net reject_rhsbl_client bl.spamcop.net reject_rhsbl_client ... sleep 4, reject_unauth_pipelining

permit_sasl_authenticated Permite conexões autenticadas.

check_client_access Verifica o ip ou hostname de conexão do cliente de acordo com o mapa ‘access’.

reject_unknown_client Rejeita conexões sem dns reverso.

reject_rhsbl_sender lista-rbl Verifica se o endereço da conexão não provém de um endereço bloqueado em alguma lista rbl.

reject_unauth_pipelining Faz o servidor aguardar alguns segundos (sleep) antes de responder os comandos, assim, se algum cliente for enviando os comandos sem aguardar pela confirmação dos comandos anteriores terá acesso negado. É excelente para bloquear scripts de envio de email comuns em virus e spams.

alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf local_recipient_maps = mysql:/etc/postfix/mysql_virtual_recipients_maps.cf smtpd_sender_login_maps = $local_recipient_maps, $alias_maps

alias_maps Contém a lista de todas as aliases do seu servidor.

local_recipient_maps Contém a lista de todos os logins de seu servidor.

smtpd_sender_login_maps Contém a lista de todos os logins de seu servidor e seus respectivos aliases que serão verificados com a regra reject_sender_login_mismatch.

# mysql_virtual_recipients_maps.cf
# ------------------------------
hosts = localhost user = user password = senha dbname = mail table = mailbox select_field = username where_field = username additional_conditions = AND active = '1'

Esse arquivo lista todas as contas de emails válidas em seu sistema.

# mysql_virtual_alias_maps.cf
# ------------------------------
hosts = localhost user = user password = senha dbname = mail table = alias select_field = goto where_field = address additional_conditions = AND active = '1'

Esse arquivo lista todas as aliases das contas de emails válidas do sistema.

smtpd_sender_restrictions = reject_sender_login_mismatch permit_sasl_authenticated reject_unauthenticated_sender_login_mismatch check_sender_access hash:/etc/postfix/access check_sender_mx_access hash:/etc/postfix/access check_sender_ns_access hash:/etc/postfix/access check_sender_access pcre:/etc/postfix/sender_checks check_sender_access pcre:/etc/postfix/dynamic_checks reject_non_fqdn_sender reject_unknown_sender_domain reject_rhsbl_sender dnsbl.sorbs.net reject_rhsbl_sender bl.spamcop.net reject_rhsbl_sender ...

reject_sender_login_mismatch Certifica de que o remetente do email é o mesmo que se autenticou no servidor, e pede que a opção smtpd_sender_login_maps contenha a lista de todos os logins válidos de seu sistema.

permit_sasl_authenticated Permite que os usuários autenticados enviem email.

reject_unauthenticated_sender_login_mismatch Nega o envio se o remetente for um cliente do seu sistema e que não esteja autenticado. (Recomenda-se adicionar o seu domínio em sender_checks, assim apenas os envios pela porta 25 serão negados caso o remetente tente utilizar o seu domínio, pois a porta 587 -submission- não faz essa verificação. Isso se dá ao fato de que um usuário inválido dentro do seu domínio não pode ser verificado se foi autenticado ou não, abrindo a porta para que explorem essa falha.)

check_sender_access Verifica os remetentes no arquivo de mapa access.

reject_rhsbl_sender lista-rbl Verifica se o endereço do remetente não está bloqueado em alguma lista rbl.

reject_* Verificações de sanidade, se o email do remetente está em formato válido, se o domínio existe, se o email existe, etc…

O arquivo /etc/postfix/sender_checks contém as regras a seguir:

/@.*@/ REJECT bad sender address syntax /[^a-z\d\!\#\$\%\&\'\*\+\/\-\=\?\^\_\{\}\|\~\`\.\@]/ REJECT bad sender address syntax

Essas regras evitam que sejam enviados emails de remetentes no formato usuario@[ip] ou usuario@dominio@dominio, bloqueando assim uma boa parcela de spams, pishing e virus.

smtpd_recipient_restrictions = reject_non_fqdn_recipient reject_unknown_recipient_domain  permit_sasl_authenticated permit_auth_destination reject

reject_* Verifica se o domínio do email do destinatário está em formato válido e existe.

permit_sasl_authenticated Permite o envio se o usuário estiver autenticado.

permit_auth_destination Recebe o email se o destino final for uma conta de email válida no sistema.

smtpd_client_connection_count_limit = 1 smtpd_data_restrictions = sleep 4 reject_unauth_pipelining reject_multi_recipient_bounce smtpd_error_sleep_time = 0 smtpd_hard_error_limit = 1 smtpd_soft_error_limit = 1 smtpd_junk_command_limit = 1 smtpd_timeout = 60s

smtpd_client_connection_count_limit Limita o número de conexões simultâneas do mesmo ip. (O ideal é que seja igual ao número de domínios que você hospeda).

reject_unauth_pipelining Evita que se enviem comandos adiantados ao servidor, recusando quem não aguarda pelas respostas dos comandos antes de enviar novos comandos, incluindo o tempo de espera de sleep. Bloqueando assim diversos virus e spams que automatizam o envio das mensagens e não se atentam a esse detalhe.

reject_multi_recipient_bounce Rejeita emails de vários destinatários em que um ou mais destinatários causem um retorno de mensagem (bounce).

smtpd_error_sleep_time Tempo que o servidor aguarda antes de enviar uma mensagem de erro. Quanto mais breve (0 segundos = instantâneamente), mais rápido o seu servidor fica livre para atender novos clientes.

smtpd_*_error_limit Termina a conexão no primeiro erro encontrado (irrita quando se quer testar o smtp via telnet… hehehe :P)

smtpd_junk_error_limit Evita que clientes maliciosos “segurem” a conexão com comandos nulos.

smtpd_timeout Tempo máximo antes de desconectar uma conexão ociosa (60 segundos é o padrão dos clientes de emails atuais).

header_checks = pcre:/etc/postfix/header_checks

O arquivo header_checks trabalha com expressões regulares e pode nos ajudar muito a combater o spam, basta adicionar os cabeçalhos dos spams que você encontrar para tomar a atitude desejada! Ou por exemplo, bloquear anexos de tipos de arquivos desconhecidos ou incomuns de se enviar por email.

Segue um exemplo de algumas verificações interessantes para o arquivo header_checks:

# verificação de anexos que não se deseja receber /^Content-(Type|Disposition): .*name[[:space:]]*=.*\.(exe|com|cmd|bin|vbs)/ REJECT anexo não permitido, procure zipar antes de enviar. # ou uma verificação ao contrário, permitindo apenas o que se deseja receber if /^Content-(Type|Disposition): .*name[[:space:]]*=.*\./ !/^Content-(Type|Disposition): .*name[[:space:]]*=.*\.(zip|rar|7z|txt|dat)/ REJECT anexo não permitido, procure zipar antes de enviar. endif # verificação contra spammers /^Received:*from.*(t5|virtualtarget)\.com\.br/ REJECT spam /^X-Mailer:.*(Chilkat|SendBlaster|eComm|Emailtob|Instar Mail)/ REJECT spam /^X.*Spam.*: *yes/ REJECT spam /viagra|erect(ion)? med/ REJECT spam # verificação contra pishing /Seguranca.*Bradesco/ REJECT pishing /World of Warcraft account/ REJECT pishing

Utilize a criatividade para adaptar e criar regras em novos contextos!

body_checks = pcre:/etc/postfix/body_checks

O arquivo body_checks trabalha com expressões regulares e também pode nos ajudar muito a combater o spam, basta adicionar os textos dos spams e virus que você encontrar para recusar o email! E se o spam vier codificado, basta codificar o texto e adicionar a versão codificada no arquivo de verificação! Por exemplo, se vier codificado em Base64, utilize o seguinte comando para obter a versão codificada das palavras:

perl -e 'use MIME::Base64 (); \
            print MIME::Base64::encode("Palavra a ser Codificada");'

Observação: essa técnica não funciona para palavras muito curtas (quando a saída codificada apresenta dois ou mais sinais de = ) mas é possível codificar uma frase e selecionar apenas as palavras desejadas 😉

Atualmente com o meu novo filtro de conteúdo para o Postfix é possível efetuar as verificações de REJECT do body_checks em mensagens codificadas em base64! 💡

Segue um exemplo de algumas verificações interessantes:

# verificação contra exploits /iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0/ REJECT exploit # verificação contra javascript /(src|href).*(javascript|\.js[^p])/ REJECT no code /script.*src=/ REJECT no code # verificação contra spammers /(cancelar|Y2FuY2VsYXI).*(mensagens|bWVuc2FnZW5z)/ REJECT spam /(cartaexpressa|carteiroonline)\.com/ REJECT spam # verificação contra pishing /(internet|plugin|modulo).*(seguran.a|segurança).*(Banco ?do ?Brasil|BB|Bradesco)/ REJECT pishing

Utilize a criatividade para adaptar e criar as regras em novos contextos!

Ao fim dessas configurações, o seu servidor estará muito bem configurado e apto a enviar e receber somente emails verdadeiramente autênticos! 💡

Links de algumas listas negras para incrementar as regras RBL (apesar das regras acima, especificamente a verificação dynamic_checks, serem suficientes para barrarem quase todos os spams e virus e pishings):

www.spamhaus.org
www.uribl.com
www.njabl.org
www.sorbs.net
www.spamcop.net
www.abuseat.org
www.surbl.org
www.ahbl.org
www.anti-spam.org.cn
www.barracudacentral.org
dnsbl.abuse.ch
dnsbl.inps.de
dul.ru
www.emailbasura.org
korea.services.net
www.lashback.com
www.msrbl.com
psbl.surriel.com
www.rbl.jp
spam.deadbeef.com
www.spamcannibal.org
www.spamrats.com
www.uceprotect.net
virbl.bit.nl

Existem também filtros de conteúdo, antivirus, mais regras de validação RFC, bloqueios automáticos de ips no firewall, bloqueio automáticos de remetentes, e muito mais coisas que você pode acrescentar ao seu postfix para torná-lo muito mais seguro e eficiente!

Continue lendo mais artigos relacionados ao Postfix!

3 ideias sobre “Protegendo o Postfix contra spam.

  1. Meu caro Eduardo, eu queria lhe parabenizar pelo excelente site que você tem! Foi e está sendo de muita ajuda pra mim… Estou fazendo com que meu postfix fique tinindo nas regras. Queria aproveitar e te pergunta sem tem mais endereço na regra reject_rhsbl_helo do comando helo. Já vasculhei na net e só achei esses:

    reject_rhsbl_helo black.uribl.com,
    reject_rhsbl_helo multi.surbl.org,
    reject_rhsbl_helo multi.uribl.com,
    reject_rhsbl_helo rhsbl.ahbl.org,
    reject_rhsbl_helo bogusmx.rfc-ignorant.org,
    reject_rhsbl_helo dsn.rfc-ignorant.org,
    reject_rhsbl_helo bl.open-whois.org,
    reject_rhsbl_helo uribl.swinog.ch,
    reject_rhsbl_helo dnsbl.othello.ch,
    reject_rhsbl_helo dnsbl.njabl.org

    Se veres meu comentário, peço que entre em contato comigo pelo e-mail por favor…
    FIQUE COM DEUS E BOA SORTE!!!…

    • Olá Bento!

      Primeiramente fico muito feliz em saber que as informações compartilhadas aqui estão sendo úteis inclusive à você!!

      Quanto às regras rhsbl funciona assim:
      o RHSBL quer dizer que o postfix fará a verificação pelo nome de domínio, o RBL quer dizer que o postfix fará a verificação pelo IP.

      Existem diversos tipos de listas, RHSBL e RBL, e todas tem a sua forma correta de utilizar, por exemplo: É viável utilizar as listas RHSBL em helo, client e sender, mas RBL é mais viável utilizar apenas em client.

      Dessa forma precisas saber qual o tipo de lista tu tens em mãos, se é RBL ou RHSBL ou ambas.

      A grosso modo tu poderá utilizar todos os endereços de listas negras em todas as regras e de todas as formas, se assim desejar, ficando muito mais seguro (e também demandando um bocado mais de tempo para efetivar todas as múltiplas verificações, e de certa forma ineficiente pois poderia estar tentando utilizar uma lista apenas RBL como se fosse RHSBL). Assim sendo, tu poderia utilizar black.uribl.com como reject_rhsbl_helo, reject_rhsbl_sender, reject_rhsbl_client, reject_rhsbl_reverse_client e reject_rbl_client.

      Novas listas sempre surgem na internet, é bom ficar ligado e googlando por “RHSBL” tu sempre encontra novidades!

      Um porém das listas internacionais é que nem sempre elas incluem os spammers brasileiros… mas ouvi boatos de que em alguns meses talvez seja lançada uma lista brasileira 😀

      Fique com deus também, e com tempo de deixar seu Postfix tinindo eu recomendo uma boa lida em http://www.postfix.org/postconf.5.html que explica (em inglês) todas as configurações possíveis no main.cf 😀

      Abraços e Feliz 2011!!

Escreva seu comentário: