web-dev-qa-db-ja.com

Postfix、Amavis、送信メール:送信者に通知する方法

侵害された電子メールアカウントからスパムメールを送信し、サーバーからスパムメールを送信してブラックリストに登録する際に問題が発生しました。だから私はamavisでpostfixを設定するためのガイドラインに従いました:

すべて正常に動作しているようですが、送信スパム/ウイルスメールをブロックし、送信者にメールが拒否されたことを通知したいと思います(たとえば、MAILER-DAEMON経由)。これを行う可能性はありますか?私は次の方法しか理解できませんでした:

  • メールを完全に拒否し、送信者に通知しないでください(これは本当に良くありませんね?):
    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
  • とにかくメールを送信します(ただし、「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

私の現在の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)

また、可能であれば、メールを完全に拒否するのではなく、着信ウイルスをウイルスとしてマークしたいと思います(メールが失われないようにするため)。

ご協力ありがとうございました!

1
machete

あなたがしたいことは、あなたのサーバーをMSA(すなわち彼らの発信リレー)として使用しているユーザーからのメールをサードパーティから受信したものとは異なるポリシーで扱う必要があります(つまりあなたのメールサーバーがそのMXで動作しているとき役割)。幸いなことに、amavisにはあなたにぴったりのツールがあります。それはポリシーバンクです。

ユーザーのポリシーを定義する方法を見てみましょう。

$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)を介して配信された場合にトリガーされるプリキューフィルターとしてこれを実行していることはすでに推測できます。これを作成するには構成作業で、送信サービスが受信したメールをポート10028でlocalhostに配信するようにPostfix MTAに指示しました(パブリックMXとして機能する場合、サーバーはメールをポート10024に転送します)。amavisで2つのポートをアクティブにし、PREQ-をバインドします。ポート10028へのSUBポリシー、私はこれらの設定を使用しています:

# 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

Postfixに対応するmaster.cfエントリは次のとおりです。

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でメールを送信しない場合、またはすべてのユーザーが送信しない場合はどうすればよいでしょうか。さて、あなたは100%確実に土地を離れなければならないでしょう。 amavisはメールの内容を分析し、ヘッダーの存在に基づいて行動することができます。そのようなヘッダーの1つは、smtpd_sasl_authenticated_header = yesを設定した場合にPostfixが追加する認証済みユーザーの名前である可能性があります。次に、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

このコード内の警告を無視しないでください。ヘッダーは簡単に偽造可能であり、他のメールサーバーも「Authenticatedsender」ヘッダーを挿入する可能性があるため、「your-mailserver.example.net。* Authenticatedsender」のようなものによく一致します。 。

最後に、あなたのコメントの1つについて:メールサーバーの実行には多くの時間がかかり、悪用がないか常に監視する必要があります。グローバルな電子メールシステムに参加することになると、「脱獄」カードはありません!

4
Stefan Förster