Postfix, Amavis e mensagens de saída: como notificar o remetente

2

Eu tive problemas com e-mails de spam enviados de contas de e-mail comprometidas, enviando e-mails de spam do meu servidor e chegando em listas negras. Então eu segui as orientações para configurar o postfix com o amavis:

Tudo parece funcionar bem, no entanto, gostaria de bloquear os e-mails de spam / vírus enviados e notificar o remetente, que seu e-mail foi rejeitado (por meio do MAILER-DAEMON, por exemplo). Existe alguma possibilidade de fazer isso? Eu só consegui descobrir como:

  • Rejeite o e-mail completamente e não notifique o remetente (o que não é realmente bom, não é?):
    Aug 25 12:05:35 ns207813 amavis[24728]: (24728-01) Blocked SPAM {NoBounceOpenRelay,Quarantined}, <[email protected]> -> <[email protected]>, quarantine: J/spam-Jfuzg0ScCmKf.gz, Message-ID: <[email protected]>, mail_id: Jfuzg0ScCmKf, Hits: 1004.054, size: 935, 2013 ms
  • Envie o e-mail de qualquer maneira (mas marcado como "SPAM"):
    Aug 25 12:19:10 ns207813 amavis[25182]: (25182-01) Passed SPAM {RelayedTaggedInbound,Quarantined}, [217.230.20.223]:65071 [217.230.20.223] <[email protected]> -> <[email protected]>, quarantine: i/spam-iy3rVCiRk8k2.gz, Queue-ID: 5B9D722AAA, Message-ID: <[email protected]>, mail_id: iy3rVCiRk8k2, Hits: 999.001, size: 2663, queued_as: DD67222ABE, 1379 ms

Minhas configurações atuais do amavis são:

$sa_spam_subject_tag = '[SPAM] ';
$sa_tag_level_deflt  = undef;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 5; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 20; # triggers spam evasive actions
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent

$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)
$final_banned_destiny     = D_BOUNCE;   # D_REJECT when front-end MTA
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)

Eu também gostaria de marcar vírus como vírus em vez de rejeitar completamente o email, se possível (assim nenhum email é perdido).

Obrigado pela sua ajuda!

    
por machete 25.08.2014 / 12:34

1 resposta

5

O que você deseja fazer requer o tratamento de e-mails de usuários que usam seu servidor como seu MSA (ou seja, seu retransmissor de saída) com uma política diferente daqueles recebidos de terceiros (ou seja, quando seu servidor de e-mail está agindo em seu papel MX). Felizmente, o amavis tem a ferramenta certa para você: Bancos de Políticas.

Vamos ver como você pode definir uma política para seus usuários:

$policy_bank{'PREQ-SUB'} = {
        originating => 1, # indicates client is ours, allows signing
        final_spam_destiny => D_DISCARD, # discard spam
        final_virus_destiny => D_DISCARD, # discard spam
        warnspamsender => 1, # send a warning 
        forward_method => 'smtp:127.0.0.1:10025', # you probably need to adjust this
        smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
        smtpd_greeting_banner => '${helo-name} ${protocol} ${product} SUBMISSION service ready',
        spam_admin_maps  => ["postmaster\@example.net"],  # warn of spam from us
        virus_admin_maps => ["postmaster\@example.net"],  # warn of viruses from us
};

A partir da nomenclatura desse banco de políticas, você já pode adivinhar que estou executando isso como um filtro de pré-fila que é acionado se o email for entregue pela porta TCP de envio 587. Para que essa configuração funcione, eu disse Postfix MTA para entregar emails que o serviço de envio recebeu para localhost na porta 10028 (enquanto, ao agir como MX público, o servidor encaminha o email para a porta 10024). Para ativar duas portas no amavis e ligar a política PREQ-SUB à porta 10028, estou usando estas configurações:

# policy bank definition
$inet_socket_port = [10024, 10028];  # listen on listed inet tcp ports
$interface_policy{'10028'} = 'PREQ-SUB'; # mail submitted using TLS on submission/smtps port

A entrada master.cf correspondente para o Postfix é:

submission inet n - - - - smtpd -o smtpd_tls_security_level=encrypt 
  -o tls_preempt_cipherlist=$submission_tls_preempt_cipherlist 
  -o smtpd_tls_protocols=$submission_smtpd_tls_protocols 
  -o smtpd_tls_ciphers=$submission_smtpd_tls_ciphers 
  -o smtpd_tls_exclude_ciphers=$submission_smtpd_tls_exclude_ciphers 
  -o smtpd_sasl_auth_enable=yes 
  -o smtpd_recipient_restrictions=$submission_smtpd_recipient_restrictions 
  -o milter_macro_daemon_name=ORIGINATING 
  -o smtpd_proxy_filter=127.0.0.1:10028 
  -o syslog_name=postfix-submission/smtpd
  -o receive_override_options=no_header_body_checks

Observe que isso realmente faz um pouco mais do que simplesmente enviar e-mails para o amavis, por exemplo, definir listas de cifras e assim por diante (você notará as referências da variável main.cf).

Então, o que você pode fazer se seus usuários NÃO enviarem seus e-mails na porta 587, ou nem todos eles o fizerem? Bem, você terá que deixar a terra de 100% de certeza então. O amavis pode analisar o conteúdo de um e-mail e atuar sobre a presença de cabeçalhos. Um desses cabeçalhos pode ser o nome do usuário autenticado que o Postfix adiciona se você definir smtpd_sasl_authenticated_header = yes . Você poderia então dizer ao amavis para agir neste cabeçalho:

package Amavis::Custom;
use strict;
BEGIN {
        import Amavis::Conf qw(:platform :confvars c cr ca $myhostname);
        import Amavis::Util qw(do_log untaint safe_encode safe_decode);
        import Amavis::rfc2821_2822_Tools;
        import Amavis::Notify qw(build_mime_entity);
}
sub new {
        my($class,$conn,$msginfo) = @_;
        my($self) = bless {}, $class;
        my $auth_sender = 0;
        foreach my $line (@{$msginfo->{'orig_header'}}) {
                $line =~ s/\n    / /g;
                # WARNING: you need to improve this to AT LEAST also match
                # for your OWN mail servers name!
                $auth_sender = 1 if $line =~ m/^Authenticated sender/i;
        }
        if ($auth_sender) {
                do_log(2, sprintf("Load pre-queue submission policy bank"));
                Amavis::load_policy_bank('PREQ-SUBMISSION')
        }
        return $self;
}
1;  # insure a defined return

Por favor, não ignore o aviso dentro deste código: os cabeçalhos são facilmente legíveis, e outros servidores de e-mail podem inserir um cabeçalho "Autenticiado remetente" também, então é melhor combinar com "your-mailserver.example.net. * Remetente autenticado ".

Em uma nota final, com relação a um de seus comentários: Executar um servidor de e-mail requer muito tempo e exige que você o monitore constantemente por abuso. Não há cartão "saia da cadeia livre" quando se trata de participar do sistema global de e-mail!

    
por 26.08.2014 / 06:21