SYSADMIN Sendmail contra o lixo digital Fora spam! O spam é uma praga digital e deve ser combatido como tal. O Sendmail oferece diversas abordagens, tanto sozinho quanto acompanhado, para filtrar mensagens indesejadas. Entenda os princípios da filtragem de spam com o Sendmail e outros componentes que podem ajudar muito nesta tarefa, e veja qual abordagem oferece o custo-benefício que você espera. por Mirko Dölle O versátil agente de transporte de mensagens (MTA, na sigla em inglês) Sendmail oferece diversas formas de controlar a atual epidemia de vírus e spam. Este artigo apresenta três cenários plausíveis anti-spam e antivírus antes de terminar com uma discussão sobre uma abordagem radical que virtualmente elimina todo o spam. A discussão pressupõe que o leitor esteja minimamente familiarizado com a configuração do Sendmail. O artigo se aterá a ferramentas práticas adicionais. Algumas configurações internas do Sendmail [1], como por exemplo as estratégias de prevenção por listas negras, também ajudam a combater essas pragas, porém raramente representam uma solução completa. Para mais informações sobre a configuração de servidores Sendmail, 62 o site deste programa [2] oferece um resumo de seu código. O Amavisd-new é uma interface entre um MTA e um filtro de conteúdo como um antivírus ou o Spamassassin. Você pode buscar mais informações sobre o Amavisd-new na edição de Fevereiro de 2006 da Linux Magazine [4]. Diversas configurações do Amavis estão disponíveis para vários MTAs, e oferecem ao mesmo tempo uma interface para estatísticas. O Amavis é bastante seguro do ponto de vista da programação, já que a linguagem Perl não está sujeita a estouros de buffer. O fato de os fóruns de segurança como o SecurityFocus e o FrSirt [5] não falarem muito sobre o Amavis por si só já confirma esse ponto. O Amavis normalmente não requer privilégios de superusuário; ele roda feliz num ambiente de chroot, e dá aos administradores opções de configuração para evitar ataques de negação de serviço baseados em emails-bomba. A interface é fácil de instalar. Para sistemas baseados em Debian, rode aptget install amavisd-new. Como o Amavis geralmente também procura vírus, você certamente vai querer instalar um antivírus ao mesmo tempo. A configuração fica em /etc/amavis/amavisd.conf; e as opções dependem da situação atual. Entretanto, você pode antes modificar a sua instalação do Sendmail. Há diversas formas de integrar o Amavis ao Sendmail. O recomendado é a variante dual do Sendmail. Nesse cenário, a primeira instância do Sendmail aceita emails na porta 10024, encaminhando-os à segunda instância do Sendmail após a verificação. http://www.linuxmagazine.com.br Spam no Sendmail | SYSADMIN ~/.procmailrc Sasl SM-MTA-RX SM-MTA-TX na porta 25 na porta 10025 Procmail Dovecot POP3(s), IMAP(s) Amavisd-new na porta 10024 TMDA (opcional) Clam-AV Spamassassin Razor (clamd) Squirrelmail Cliente de Email DCC Figura 1 Simples e bastante rígido: Sendmail e Amavis lutando sozinhos contra spam e vírus. Sendmail dual Hostname-tx.mc. Defina as configurações Executar o Amavis significa configurar até para recebimento de email, incluindo os dois processos do Sendmail que gerenciam limites de recursos, em hostname-rx.mc. O filas distintas de mensagens. Um processo lado do envio é definido pelo hostnamegerencia a fila de recepção (MTA-RX), tx.mc. Uma vantagem da instalação dual enquanto o outro cuida da transmissão do Sendmail é que o MTA-RX, acessível (MTA-TX): o Amavisd-new fica no meio da Internet, não precisa rodar com privido caminho, atuando como um filtro de légios de superusuário, pois não acessa vírus e spam. O processo MTA-RX escuta os diretórios home dos usuários. na porta TCP 25, e lê sua configuração dos arquivos /etc/mail/sendmail-rx.cf e / etc/mail/submit.cf, junto com o arquivo fonte /etc/mail/hostname-rx.mc. A maioria das redes inclui computaDigite mkdir /var/spool/mqueue-rx para dores com Windows®, portanto faz criar o diretório com a fila de emails. sentido permitir que o servidor de A seguinte linha aplica as permissões emails busque vírus. O ClamAV é um adequadas: antivírus aberto e gratuito com atualizações diárias. Binários do ClamAV chown root:amavis /var/spool/mqueue-rx estão disponíveis para diversas distri➥ && chmod 700 /var/spool/mqueue-rx buições de Linux. Infelizmente, esse programa recentemente esteve nas Continue agora com a definição do manchetes devido a algumas falhas seu próprio soquete de controle, ou faça críticas de segurança, o que dificulos dois processos do Sendmail pararem ta sua recomendação. No entanto, o de discutir: Amavisd-new facilita a execução de múltiplos antivírus em paralelo; uma define(`confCONTROL_SOCKET_NAME’, visão geral dos antivírus mais popula➥`/var/run/sendmail/mta/smcontrol-rx’)dnl res está disponível em [6]. gins e um programa antivírus. As opções são diversas. Se você configurar a variável $mydomain da forma errada, praticamente nada funcionará, então comece dandolhe um valor. Defina também valores adequados para $LOGFILE e $log_level para ativar a solução de problemas e a análise de logs. Em seguida, você deve pensar no que acontecerá às mensagens infectadas por vírus e ao spam, definindo as variáveis $final_virus_destiny e $final_spam_destiny de acordo. As opções disponíveis são D_PASS, D_DISCARD, D_BOUNCE e D_REJECT; administradores responsáveis devem optar por D_BOUNCE em vez de D_REJECT, pois essa última permite a adulteração de endereços (address spoofing). Esse método utiliza os parâmetros $sa_* para controlar o Spamassassin, que são praticamente auto-explicativos. Para marcar todas as mensagens com um cabeçalho X-Spam, defina $sa_tag_level_deflt = -999 . Para permitir aos usuários identificar spam pela linha de assunto do email, um $sa_spam_subject_tag vazio ajuda. Para aumentar a taxa de detecção, também é bom mandar o Amavis usar fontes externas, como listas negras, o DCC, A maneira mais simples e menos flexível Razor, Pyzor. Para isso, use a opção de combater spam e vírus é usar o Amavis $sa_local_tests_only = 0. (figura 1) sozinho. A interface automaticaJá se mostrou que valores entre 2 e mente integra o Spamassassin, seus plu- 2,5 são úteis para a $sa_tag2_level_deflt, Programas maliciosos O processo MTA-TX se liga à porta 10025 da interface local e usa o arquivo de configuração e a fila normais. Para manter as informações legíveis, usaremos o arquivo fonte compartilhado /etc/mail/ Linux Magazine #22 | Agosto de 2006 Amavis sozinho 63 SYSADMIN | Spam no Sendmail ~/.procmailrc Sasl SM-MTA-RX SM-MTA-TX na porta 25 (porta 10025) Spamassassin Procmail Dovecot POP3(s), IMAP(s) TMDA Amavisd-new (opcional) na porta 10024 Razor MySQL-DB Clam-AV Squirrelmail (clamd) Cliente de Email DCC Maia Mailguard (front-end web com PHP) Figura 2 Um cenário mais flexível com bancos de dados e Sendmail, Amavis e Maia. que marca mensagens como spam ou não-spam. No caso de aparecerem muitos falsos positivos, pode-se aumentar esse valor, mas com cuidado. A opção $sa_mail_body_size_limit nos permite controlar o tamanho de mensagem a partir do qual o Amavis não buscará mais spam – emails grandes dificilmente são spam. E a opção $sa_timeout informa o número de segundos que o Amavis esperará pelo Spamassassin antes de encaminhar as mensagens. As listas brancas e negras e os receptores que preferirem desativar a verificação de spam ($spam_lovers) podem ser configurados de forma bastante flexível. Listas brancas são problemáticas devido a endereços remetentes adulterados, como já mencionamos. Figura 3 A interface Maia oferece aos usuários a possibilidade de usar configurações individuais – listas negras, no caso. 64 Múltiplos antivírus A solução 1 permite verificar vírus, e pode até usar múltiplos antivírus paralelamente. (ClamAV e McAfee foram testados com sucesso pelo autor). Assim que o antivírus encontra um vírus, seria um desperdício de recursos entregar a mensagem para o outro. O parâmetro $first_infected_stops_scan = 1 impede esse comportamento. Também é possível avisar o remetente a respeito do email infectado especificando $warnvirussender = 1, porém esse serviço pode não fazer muito sentido, pois administradores afobados provavelmente tratarão seus avisos como spam, ou os endereços adulterados impedirão o email de aviso de alcançar o verdadeiro responsável pelo spam. Se você preferir não apagar automaticamente as mensagens com vírus, pode usar um diretório de quarentena com a variável $QUARANTINEDIR, naturalmente cuidando para que haja espaço suficiente em disco. A varredura de vírus pode rapidamente consumir boa parte dos recursos de um servidor de email, levando-o assim a uma condição de negação de serviço. Emails-bomba, em especial, explodem para um tamanho tão grande quando descompactados para a varredura de vírus que o servidor pode facilmente ficar sem memória e espaço de troca. O parâmetro $MAXLEVELS diminui esse problema restringindo os níveis de aninhamento de arquivos múltiplas vezes compactados. Ao atingir o nível pré-definido, o Amavis pára de tentar descompactar o arquivo. O parâmetro $MAXFILES restringe o número de arquivos por email. O parâmetro $MAX_EXPANSION permite que você defina um limite em bytes para uso da memória em operações de descompactação. Sempre que um email exceder um desses três limites, o Amavisdnew versão 20060616-p8 ou mais recente adiciona uma etiqueta ***UNCHECKED*** ao campo de assunto. É uma boa prática filtrar esses emails, pois provavelmente contêm vírus. Solução 2 A solução 1 é fácil de configurar, no entanto não oferece muitas opções de personalização das filtragens baseadas em usuários. Uma maneira de estender o Amavis é adicionar o Maia Mailguard http://www.linuxmagazine.com.br Spam no Sendmail | SYSADMIN [7] conforme o esquema da figura 2. Maia é uma interface web multi-linguagem e fácil de usar feita em PHP e Perl. Ele usa uma versão modificada do Amavisd-new, que armazena configurações específicas para cada usuário num banco de dados MySQL ou PostgreSQL. A instalação é longa, porém não oferece grande dificuldade. Os usuários acessam suas configurações individuais pela interface web. Para isso, pede-se que eles façam login com seus endereços completos (!) de email. Depois, eles podem gerenciar suas caixas de mensagens, definir listas negras individuais (figura 3), ou mudar o valor de limite para spam. O preço dessa conveniência é um maior risco para o administrador: mais componentes sempre significam maior risco de falha. Se o banco de dados travar, o servidor simplesmente pára de entregar os emails. Olhando pelo lado positivo, ele armazena a mensagem temporariamente, entregando-a mais tarde, assim que o banco de dados voltar. Para aumentar a disponibilidade, administradores podem utilizar múltiplos servidores SQL. O segundo ponto crítico é que as alterações usadas pelo Maia impedem-nos de instalar as atualizações de segurança em formato binário fornecidas para o Amavisd-new por nossas distribuições – isso simplesmente apagaria o caminho (path). Para servidores de email com grande volume de mensagens, a queda de desempenho devido a acessos repetidos ao banco de dados também pode ser significativa (veja abaixo). Mais uma vez, os administradores podem contornar esse problema utilizando múltiplos servidores. boa medida de segurança. A solução 3 é fácil de instalar: apt-get install spamassmilter spamassassin. Depois acrescente as seguintes linhas: INPUT_MAIL_FILTER(`spamassassin’, ➥`S=local:/var/run/sendmail/spamass.sock, ➥ F=,T=S:4m;R:4m;E:10m’)dnl ao arquivo de configuração do MTA-RX compile os arquivos de configuração executando m4, e reinicie o Sendmail. Defina as preferências globais em /etc/spamassassin/local.cf. Veja [8] para uma lista completa de opções. As mais importantes são: para permitir configurações individuais dos usuários, defina allow_user_rules 1. Para etiquetar todo spam, use required_score 2.5, rewrite_subject 1 e rewrite_header Subject ***Spam***. Os critérios padrão de detecção são bastante bons; opções de configuração mais granulares estão detalhadas em [9]. O Spamassassin dá um valor ao conteúdo dos emails e, se o valor superar um determinado limite, ou o estabelecido pela opção required_score, a mensagem é marcada como spam. Para melhorar a taxa de detecção de spam, é recomendável atribuir um valor maior a hostname-rx.mc, Solução 3 Para uma flexibilidade máxima nas configurações, sem o impacto dos gráficos, um modelo como o da figura 4 provavelmente é o melhor. Ele usa a interface de Milter do Sendmail para acessar uma instância distinta do Spamd (o daemon do Spamassassin). Cada usuário pode definir suas próprias configurações em ~/.spamassassin/user_prefs . O Spamd acessa o arquivo user_prefs e detecta spam baseado nesses valores. Se não existir esse arquivo, o Spamassassin automaticamente aplicará as preferências do administrador, localizadas em /etc/ spamassassin/local.cf. Como o Spamd precisa acessar os diretórios em /home, ele roda sob a conta do superusuário. Você pode configurar o uso de níveis de usuário ao acesso a RAZOR2_CHECK, RAZOR2_CF_RANGE_51_100 e esses diretórios, para evitar rodar o pro- DCC_CHECK. O valor de PYZOR_CHECK já é cesso como superusuário. Essa é uma alto o suficiente. ➧ ~/.procmailrc Sasl SM-MTA-RX SM-MTA-TX na porta 25 na porta 10025 Procmail Dovecot POP3(s), IMAP(s) Amavisd-new SpamassMilter Spamd na porta 10024 TMDA (opcional) Razor Clam-AV (Clamd) DCC Squirrelmail Cliente de Email ~/.spamassassin/ user_prefs Figura 4 Uma configuração mais flexível com o uso de bancos de dados com Sendmail e Milter. Linux Magazine #22 | Agosto de 2006 65 SYSADMIN | Spam no Sendmail Email chegando UDP (DCC), 2703/TCP, 7/TCP (Razor), e 24441/UDP (Pyzor). Talvez você tenha que configurar seu firewall para permitir tráfego de saída nessas portas e assim deixar que se abram as devidas conexões às redes respectivas. Pode parecer um pouco paranóico usar todos esses três programas paralelamente, mas isso realmente melhora a detecção de spam. Enviando ao Servidor de Email Pedido de confirmação Email de confirmação Solução 4 Um método menos conhecido de combate ao spam, que só funciona em situações específicas, é o Agente de entrega de mensagem etiquetada, ou Tagged Message Delivery Agent (TMDA) [10]. o TMDA utiliza uma abordagem de desafio e resposta na qual cada mensagem enviada ao servidor para ser entregue deve provar a este que é legítima. A figura 5 mostra como isso funciona a princípio: um servidor de email externo está tentando enviar uma mensagem para uma caixa de correio no nosso servidor. O nosso servidor de email pede que o remetente confirme a mensagem original, e não a entrega ao destinatário até que receba a confirmação. Spammers não enviarão Aceito Servidor de Email Entrega Caixa de Email Figura 5 Abordagem de desafio e resposta para impedir o spam por meio de TMDA. DCC + Razor + Pyzor Os parâmetros referidos acima especificam os critérios de avaliação de dados a partir das três redes globais de email, que coletam e avaliam hashes de emails. As funções hash usadas para esse propósito funcionam de forma diferente das conhecidas funções hash MD5 e SHA1. Elas utilizam os chamados soft hashes, que permitem que alguns itens do email mudem, como por exemplo o destinatário, sem, no entanto, modificar o hash. Cada servidor de email que usa essas redes externas envia para elas os hashes de todos os emails que recebe. Se 100.000 hashes chegarem à rede – e esse valor é configurável – você pode considerar que o email é spam. Afinal, é improvável que alguém envie 100.000 emails com conteúdo idêntico e legítimo. Rode o apt-get para instalar o DCC, o Razor e o Pyzor. O Spamassassin automaticamente detecta sua existência. O DCC requer um servidor DCC separado para volumes acima de 250.000 emails, e bloqueia qualquer acesso acima disto como um ataque de negação de serviço em potencial. Para verificar se esses plugins estão funcionando, você pode usar o Tcpdump para ver o cabeçalho dos emails considerados spam, ou as portas 6277/ 66 Email chegando Enviado ao Servidor de Email Valor < 1 = Lista Branca Antivírus/ Anti-spam Valor > 2.5 Entregar como Spam Caixa de entrada 1 < Valor < 2,5 Pedidos Mensagem de Confirmação Confirma o Remetente Caixa de entrada Aceito Servidor de Email Entrega Mensagem entregue Caixa de entrada Figura 6 Num cenário mais sofisticado de TMDA, o Spamassassin pré-seleciona as mensagens. http://www.linuxmagazine.com.br Spam no Sendmail | SYSADMIN uma mensagem de confirmação, já que eles geralmente enviam emails em massa, e nem receberão o pedido de confirmação, pois adulteram o endereço do remetente. Isso reduz a zero as mensagens indesejadas, mas com um custo considerável causado pelo maior fluxo de emails. A figura 6 apresenta uma abordagem mais sofisticada para o TMDA. Se optar por essa abordagem de tolerância zero, você deve entender algumas coisas: ➧ Como spammers normalmente usam endereços de outras pessoas, o seu servidor de email não deve incomodar esses inocentes pedindo-os confirmação. Em outras palavras, não peça confirmação de mensagens que já tenham sido marcadas como spam pelo filtro de spam. ➧ Emails com um nível de spam muito baixo podem ser entregues diretamente, sem passar pelo TMDA. ➧ Se dois sistemas TMDA por acaso se encontrarem, laços infinitos não podem ser excluídos. A página do TMDA [10] afirma que isso não deve acontecer, mas não há garantia. A FAQ na página aborda mais questões e sugere soluções. ➧ Você está advertido a fazer sua lista branca pessoal, independente do Spamassassin; sua melhor abordagem é adicionar seu catálogo de endereços. Listas brancas são particularmente importantes para registrar e usar em listas de emails. Um efeito colateral positivo é que qualquer pessoa que mande email para você, e que não esteja na sua lista branca, recebe uma confirmação de que a mensagem chegou. Além disso, deve-se notar que, devido a sua complexidade, o TMDA não é a solução perfeita para muitos usuários e situações. Desempenho Um servidor de emails que tente oferecer a solução perfeita em todos os cenários coloca sempre em risco o desempenho caso o volume de mensagens cresça. Por isso realizamos um teste de desempenho das soluções propostas neste artigo. Utilizamos o Postal [11] para um teste de desempenho num Pentium 4 2.8 GHz com 512 MB de RAM. O programa de benchmark envia emails com um tamanho máximo de 15KB para o servidor num período de cinco minutos. A solução 1 (Amavis sozinho) mostrou-se capaz de lidar com 600 emails por minuto. Ela levou mais cinco minutos para entregar Linux Magazine #22 | Agosto de 2006 todas as mensagens. Ativar o ClamAV não reduziu significativamente a velocidade desse processo. Se você usar o Spamassassin com testes externos conforme descrito na solução 3, o desempenho dependerá fortemente da largura de banda da conexão do servidor à Internet, além de sua latência. O TMDA (solução 4) afeta o desempenho significativamente. Tudo acaba bem Obviamente este artigo não substitui um livro de 1000 páginas, e só pode ofereceer uma introdução ao Sendmail e alguns de seus componentes. O primeiro dos três designs que examinamos deve funcionar na primeira tentativa na maioria dos ambientes. Antes de utilizar a solução 4, deve-se pesar os prós e contras atenciosamente. O que todas as soluções têm em comum é a alta escalabilidade, devido a sua característica modular, seja pelo uso de discos separados para filas de emails, ou mesmo servidores distintos para cada componente individual. ■ Mais Informações [1] Propriedades anti-spam do Sendmail: http://www.sendmail.org/ m4/anti_spam.html [2] Sendmail: http://www.sendmail.org [3] Amavis-new: http://www.ijs.si/ software/amavisd/ [4] “Proteção na fonte”, de Larkin Cunningham; Linux Magazine, Fevereiro de 2006, p. 35 [5] SecurityFocus e FrSirt: http://www.securityfocus.com e http://www.frsirt.com [6] “Quer um bom antivírus?”, de James Mohr; Linux Magazine, Fevereiro de 2006, p. 27 : [7] Maia Mailguard: http://www.renaissoft.com/maia/ [8] Configuração do Spamassassin para recebimento de emails: http://spamassassin.apache.org/ full/3.0.x/dist/doc/ Mail_SpamAssassin_Conf.html [9] Valores de spam padrão do Spamassassin: http://spamassassin.apache.org/ tests_3_0_x.html [10] TMDA: http://www.tmda.net [11] Postal: http://www.cocker.com/postal/ 67