Por fim, encontrei uma solução para filtrar spam de saída com header_checks , embora eu não saiba o quanto ela pode ser eficiente e eficaz.
Aviso :
- esta solução técnica de atenuação não limpa a infecção.
- só é útil quando o ataque envia spam usando o nome de domínio real e nomes de usuário falsificados ou contas de email como remetentes (
From:
). - quando a infecção usa outros nomes de domínio como remetente (
From:
), essa expressão regex não pode ser eficaz.
Dado que /usr/sbin/sendmail
é usado pelo script infectado para spam, sempre que ele usa contas de email inexistentes aleatoriamente (ou seja, [email protected]), em vez de contas reais como remetentes (por exemplo, user1 @ my-domain. tld), os cabeçalhos de correio podem ser verificados usando a inspeção de conteúdo interna de postfix header_checks
como segue:
#/etc/postfix/main.cf
# add it for example before TLS paramaters
# Anti-SPAM options
header_checks = pcre:/etc/postfix/header_checks
A expressão regular no arquivo header_checks deve excluir qualquer usuário real do domínio (por exemplo, user1, user2, ...):
#/etc/postfix/header_checks
/^From:((?![^@]*?user1|[^@]*?user2|[^@]*?user3|[^@]*?webmaster)[^@]*?)@my-domain\.tld/ REJECT invalid sender
Explicação da expressão regular (para qualquer alteração, pode ser usado este testador de regex ):
-
[^@]
de qualquer caractere, exceto@
-
[^@]*?
qualquer caractere, exceto@
, zero ou mais vezes, preguiçoso não-ganancioso (*?
). -
(?!user1|user2|etc)
lookahead negativo com alternativas: descartando usuários reais do domínio. -
(?![^@]*?user1|[^@]*?user2|etc)
permitindo caracteres antes do endereço de e-mail de cada usuário.
Antes de qualquer alteração, pode ser testado por (primeiro um passa, segundo rejeitado):
$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks
$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks
REJECT invalid sender
$
Ou até mesmo pode ser testado usando um arquivo com cabeçalhos de mensagens capturados durante a infecção (aviso: o traço é importante aqui):
$ postmap -q - pcre:/etc/postfix/check_headers < captured_headers.txt
From: "[email protected] REJECT invalid sender
From: "[email protected] REJECT invalid sender
$
Uma vez testado, se atingir o resultado desejado, basta reiniciar o Postfix:
# service postfix restart
* Stopping Postfix Mail Transport Agent postfix [ OK ]
* Starting Postfix Mail Transport Agent postfix [ OK ]
Para verificar como está acontecendo, um possível comando:
# tail -n 10000 /var/log/mail.log | grep reject
or
# tail -n 10000 /var/log/mail.log | grep 'invalid sender'
Espero que isso ajude alguém.
EDITAR
Algumas correções da expressão regular:
#/etc/postfix/header_checks
/^From:(?![^@]*?user1@|[^@]*?user2@|[^@]*?user3@|[^@]*?webmaster@)([^@]*?@my-domain\.tld)/
REJECT invalid sender $1
A verificação do postmap funciona bem, mas o postfix não está filtrando usuários de email forjados para o domínio (a última infecção que ele não filtrou). Eu não sei porque.