web-dev-qa-db-ja.com

Z-pushから受信した場合、PostfixはAmavisにメールを渡しません

ActiveSyncをメールサーバーで正しく動作させる方法を盲目的に見つめているので、ここにいる誰かがアイデアを持っているかもしれません。

メールサーバーは4つのドメインをホストしており、送信されるすべてのメールにDKIM署名が必要です。

SMTP経由で送信すると機能するようになりましたが、クライアントがActiveSyncを使用して電子メールを送信すると署名に失敗します。

とにかくここにSMTPでどのように機能するかについての図があります:

Flowchart for mail handling in Postfix together with Amavis

Postfixが認証されたユーザーから送信されたメールを識別する方法の魔法のほとんどは、私のホストされたドメインの1つに属しているのに対し、インターネット上のどこかからのメールは/etc/postfix/main.cfのこの行から来ています。

smtpd_sender_restrictions = 
    check_sender_access regexp:/etc/postfix/tag_as_originating.re, 
    permit_mynetworks, 
    permit_sasl_authenticated, 
    check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, 
    check_sender_access regexp:/etc/postfix/tag_as_foreign.re

content_filter = amavis:[127.0.0.1]:10024

/etc/postfix/tag_as_foreign.reの内容:

/^/ FILTER amavis:[127.0.0.1]:10024

Amavisは、次の設定で/etc/postfix/master.cfによって処理されるポート10025を使用して結果をPostfixに送り返しました。

127.0.0.1:10025 inet n - n - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks, reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks, no_header_body_checks
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes

/etc/postfix/tag_as_originating.reの内容:

/^/ FILTER amavis:[127.0.0.1]:10026

結果はポート10027を使用してPostfixに返送され、/etc/postfix/master.cfのこのコードによって処理されます。

127.0.0.1:10027 inet n - n - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks, reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks, no_header_body_checks
    -o smtp_send_xforward_command=yes
    -o milter_default_action=accept
    -o milter_macro_daemon_name=ORIGINATING
    -o disable_dns_lookups=yes

最後に、最初にメールがPostfixに導入される方法に関するmaster.cfの関連行を次に示します。

smtp      inet  n       -       y       -       -       smtpd

pickup    unix  n       -       y       60      1       pickup

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated, reject

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated, reject

ActiveSync経由の接続を処理するためにZ-Pushを使用していますが、問題は次のとおりです。

Mail.logで、z-Push設定ファイルにSMTP経由で着信メールをpostfixに渡す必要があると記載されていても、着信メールをmaildropディレクトリに直接配置する必要があることに気付きました。maildropディレクトリはPostfixピックアップデーモンによって処理されます。

そこから、メールはAmavisによってDKIM署名されていなくても、宛先アドレスに直接転送されます。

問題は、PostfixにピックアップデーモンからAmavisにメールを渡して、宛先に転送される前にDKIM署名を取得できるようにするにはどうすればよいですか?

master.cfpickupの下に次のテキストを含む行を挿入するのと同じくらい簡単ですか。

-o content_filter = amavis:[127.0.0.1]:10026

...または既存の設定と競合しますか? :-)

もう少し調整した後、私は最終的にそれを機能させることができました。

これが何が起こっているのかについての説明です。

Z-PushはPHPで書かれており、インターネットで見つけたのは、PHPメール設定はphp.iniを介して制御されているということです。

php-ini-ファイルでは、メールを送信するときに使用できる唯一のオプションはsendmailを介するため、Z-Pushから受信したすべての受信メールは常にmaildropフォルダーに送信されます。その後、デーモンが処理します。

SMTP設定は、Windowsホストにインストールされている場合にのみ機能します。

私に言わせればそれは少しばかげていますが、ActiveSyncプロトコル(別名Z-Push)を介して受信したDKIM署名でメールに署名したい場合は、とにかく別のルートを取る必要があります。

疑わしいことに、content_filterpickup行に続く行に/etc/postfix/master.cfを追加する必要がありましたが、Amavis構成ファイルを少し調整する必要もありました。

ファイル/etc/postfix/master.cfは基本的に以前と同じですが、ピックアップラインに移動すると、次のように表示されます。

amavis unix - - y - 2 smtp 
   -o smtp_data_done_timeout=1200
   -o smtp_send_xforward_command=yes
   -o smtp_bind_address=

pickup    unix  n       -       y       60      1       pickup
   -o content_filter=amavis:[127.0.0.1]:10026

コメントアウトするとAmavisが呼び出されないことがわかったので、amavisセクションを追加しました。すべての完全性のためだけに。 :-)

/etc/amavis/conf.d/50-userで、次の設定は、Amavisがどこからでも私のメールアカウントへの受信メールと私のアカウントの1つからどこへでも送信されたメールを区別する方法です。

$inet_socket_port = [10024,10026];

$forward_method = 'smtp:[127.0.0.1]:10025';
$notify_method = 'smtp:[127.0.0.1]:10027';

$interface_policy{'10026'} = 'ORIGINATING';
$policy_bank{'ORIGINATING'} = {
    originating => 1,
    smtpd_discard_ehlo_keywords => ['8BITMIME'],
    forward_method => 'smtp:[127.0.0.1]:10027',
};

# IP-Addresses for internal networks => load policy MYNETS
# - requires -o smtp_send_xforward_command=yes in postfix master.cf
@mynetworks = qw(0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 
                 [::1] [FE80::]/10 [FEC0::]/10);

# Allow SMTP access from IPs in @inet_acl to amvisd SMTP Port
@inet_acl = qw( 127.0.0.1 [::1] 192.168.0.0/16 );

# DKIM
$enable_dkim_verification = 1; 
$enable_dkim_signing = 1; # load DKIM signing code
$signed_header_fields{'received'} = 0;  # turn off signing of Received
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );

私が言及した微調整は、/etc/amavis/conf.d/50-userに次の行がある前のことでした。

$forward_method = 'smtp:[127.0.0.1]:*';
$notify_method = 'smtp:[127.0.0.1]:*';

$policy_bank{'ORIGINATING'} = {
    originating => 1,
    smtpd_discard_ehlo_keywords => ['8BITMIME'],
};

*が機能する方法は、Amavisがポート(例:「10025」)で受信したものはすべて、1つ上のポート(例:「10026」)で返信されることです。

私が必要としていたのは、混乱を避けるためにもう少し明確に-にすることでした。

DKIMをPostfixとAmavisで動作させようとしている画面で他の誰かが罵倒している場合、これが役立つことを願っています。 :-)