Назад | Перейти на главную страницу

Postfix, Amavis и исходящие письма: как уведомить отправителя

У меня были проблемы с исходящим спамом от скомпрометированных учетных записей электронной почты, отправляющих спам-письма с моего сервера и попадания в черные списки. Итак, я следовал инструкциям по настройке postfix с помощью amavis:

Кажется, все работает нормально, однако я бы хотел заблокировать исходящие спам-сообщения / сообщения о вирусах и уведомить отправителя, что его электронное письмо было отклонено (например, через MAILER-DAEMON). Есть ли возможность это сделать? Я только смог понять, как:

Мои текущие настройки amavis:

$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)

Я также хотел бы отмечать входящие вирусы как вирус, а не полностью отклонять почту, если это возможно (чтобы почта не терялась).

Спасибо за помощь!

То, что вы хотите сделать, требует обрабатывать письма от пользователей, использующих ваш сервер, как их MSA (то есть их исходящий ретранслятор) с другим политика чем те, которые получены от третьих сторон (т.е. когда ваш почтовый сервер действует в роли MX). К счастью, у amavis есть подходящий инструмент: Policy Banks.

Давайте посмотрим, как вы можете определить политику для своих пользователей:

$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
};

Судя по названию этого банка политик, вы уже можете догадаться, что я запускаю его как фильтр предварительной очереди, который срабатывает, если почта доставляется через TCP-порт 587. Чтобы эта конфигурация работала, я сказал своему Postfix MTA: доставлять почту, полученную службой отправки, на localhost на порт 10028 (тогда как, действуя как общедоступный MX, сервер пересылает почту на порт 10024). Чтобы активировать два порта в amavis и привязать политику PREQ-SUB к порту 10028, я использую следующие настройки:

# 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

Соответствующая запись в master.cf для 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

Обратите внимание, что на самом деле это немного больше, чем просто отправка писем на amavis, например установить списки шифров и так далее (вы заметите ссылки на переменные main.cf).

Итак, что вы можете сделать, если ваши пользователи НЕ отправляют свою почту через порт 587 или не все делают? Что ж, тогда тебе придется покинуть страну со стопроцентной уверенностью. amavis может анализировать содержимое письма и действовать в зависимости от наличия заголовков. Одним из таких заголовков может быть имя аутентифицированного пользователя, которое Postfix добавляет, если вы установите smtpd_sasl_authenticated_header = да. Затем вы можете указать amavis действовать с этим заголовком:

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

Пожалуйста, не игнорируйте предупреждение в этом коде: заголовки легко подделать, и другие почтовые серверы также могут вставить заголовок «Авторизованный отправитель», поэтому лучше сопоставить что-то вроде «your-mailserver.example.net. * Аутентифицированный отправитель» .

И последнее замечание по поводу одного из ваших комментариев: запуск почтового сервера ДЕЙСТВИТЕЛЬНО занимает много времени и требует от вас постоянного контроля на предмет злоупотреблений. Когда дело доходит до участия в глобальной почтовой системе, не существует карты «выйти из тюрьмы бесплатно»!