Bloqueando spammers no Firewall do Linux.

Uma ferramenta interessante para proteger o seu servidor SMTP é o sshblacklist aplicado para funcionar com smtp… (e também imap, pop3, webmail, etc..!)

Observando o arquivos de log de email do meu servidor pensei em modificar esse script de proteção SSH para bloquear os IPs de servidores e clientes de email que têm suas mensagens rejeitadas pelo meu servidor SMTP por algum motivo, seja email inválido, domínio de spammer conhecido ou mesmo um IP listado em alguma lista RBL, que sempre serão negados pelo servidor SMTP mas continuam voltando insistentemente, e agora, são bloqueados diretamente no Firewall: interrompendo o tráfego de dados desnecessários na rede e nos arquivos de log.

É bem simples de configurar o sshblacklist para funcionar no SMTP, basta indicar o arquivo de maillog na configuração, e como detecção de bloqueio ao invés de “Failed password” pode-se utilizar o motivo de bloqueio utilizado pelo seu servidor smtp! (Reject: invalid user, por exemplo!)

Essa vem a ser mais uma solução auxiliar no combate aos spams e nas otimizações dos recursos e de disponibilidade dos serviços! Porém pode gerar alguns falso-positivos (quando um usuário legítimo errar na hora de digitar o email de um destinatário). Para esses casos a vantagem é o sistema sempre alertar o administrador por email, a fim de que se possa conferir o real motivo do bloqueio de determinado IP e agir de acordo com cada caso.

Bem no final do script, na seção de envio de emails para o administrador (# Message to be emailed to administrator), editei as seguintes linhas:

   if ($mailme)
   {
      my ($ip) = split(' ', $message);
      system("grep -h $ip /var/log/maillog /var/log/old/maillog* | \
                                mail -s '$message' '$notify_address'");
   }
   return;

Assim o motivo de recusa segue junto do email informativo de bloqueio para que possamos identificar corretamente o que acontece! 😀

Atualização 01/10/2010: Anexando também um whois do IP bloqueado ao email de aviso.

   if ($mailme)
   {
      my ($ip) = split(' ', $message);
      system("grep -h $ip /var/log/maillog /var/log/old/maillog* | grep -v anvil > .temp.mail");
      system("whois $ip | awk 'sub(\"\$\", \"\\r\")' | uuencode whois.txt >> .temp.mail");
      system("mail -s '$message (SMTP)' < .temp.mail '$notify_address'");
      system("rm -f .temp.mail");
   }
   return;

Atualização 28/06/2012: Anexos corrigidos, menor intrusão na edição do código no sshblacklist.

sshblacklist:

if ($mailme)
   {
      my ($ip) = split(' ', $message);
      system("/root/make_smtpbl_mail.sh $ip $notify_address");
   }
   return;

/root/make_smtpbl_mail.sh:

#!/bin/bash
domain=`grep -h $1 /var/log/maillog /var/log/old/maillog* | \
        grep connect | head -n 1 | awk '{ split($8,s,"["); print s[1] }'`
domain=`awk -v domain="$domain" 'BEGIN {
        idx = split(domain, namespace, ".")
        for (i = 0; i < 3; i++) {
                root=namespace[idx - i] "." root
                if (i == 1) {
                        if (length(namespace[idx - i]) > 3) {
                                i++
                        }
                }
        }
        print root
}'`
WARN_WHO="$2"
SENDMAIL="`which sendmail` -G -i"
( MAILID="`date +%Y-%m%d-%k%M-%S.%N`"
echo "From: \"SMTP Blacklist\" <smtpblacklist@`hostname --long`>"
echo "To: $WARN_WHO"
echo "Date: `date`"
echo "Message-ID: <smtpblacklist`date +%s`@`hostname --long`>"
echo "Subject: $1 being blocked (SMTP)"
echo "Content-Type: multipart/mixed;"
echo "    boundary=Linux-Mail-$MAILID"
echo "Mime-Version: 1.0"
echo ""
echo "--Linux-Mail-$MAILID"
echo "Content-Type: text/plain;"
echo "    charset=iso-8859-1"
echo ""
echo "smtpblacklist blocked $1 on your firewall."
echo ""
echo "You can seek the attachments for more information about this ip."
echo ""
grep -h $1 /var/log/maillog /var/log/old/maillog* | grep -v anvil | grep -i (reject|warning)
echo ""
echo "--Linux-Mail-$MAILID"
echo "Content-Disposition: attachment;"
echo "    filename=whois_ip.txt"
echo "Content-Type: text/plain;"
echo "    name=whois_ip.txt"
echo "Content-Transfer-Encoding: base64"
echo ""
whois -H $1 | awk 'sub("$", "\r")' | uuencode -m ip | sed "s/begin-base64 600 ip//"
echo ""
echo "--Linux-Mail-$MAILID"
echo "Content-Disposition: attachment;"
echo "    filename=whois_domain.txt"
echo "Content-Type: text/plain;"
echo "    name=whois_domain.txt"
echo "Content-Transfer-Encoding: base64"
echo ""
whois -H $domain | awk 'sub("$", "\r")' | uuencode -m domain | sed "s/begin-base64 600 domain//"
echo ""
echo "--Linux-Mail-$MAILID"
echo "Content-Disposition: attachment;"
echo "    filename=full_offenses_log.txt"
echo "Content-Type: text/plain;"
echo "    name=full_offenses_log.txt"
echo "Content-Transfer-Encoding: base64"
echo ""
grep -h $1 /var/log/maillog /var/log/old/maillog* | grep -v anvil | awk 'sub("$", "\r")' | \
                           uuencode -m offenses | sed "s/begin-base64 600 offenses//"
echo ""
echo "--Linux-Mail-$MAILID--" ) | $SENDMAIL -f root -- $WARN_WHO

 Facilitando assim identificar o datacenter do spammer para contato de abuso e facilitando também o bloqueio do CIDR 💡

Leia mais artigos relacionados ao Postfix.

Uma ideia sobre “Bloqueando spammers no Firewall do Linux.

  1. Pingback: Protegendo ainda mais o seu Postfix contra Spam! | Blog do Eduardo Nunes

Escreva seu comentário: