postfix が SMTP 経由で中継するときに送信元アドレスを強制する

postfix が SMTP 経由で中継するときに送信元アドレスを強制する

AWS EC2インスタンスからメールレポートを取得しようとしています。Exchange Online(Microsoft Online Servicesの一部)を使用しています。専用のユーザーアカウントを設定しました。SMTPリレー、このサーバーを介してメッセージを中継するためのすべての要件を満たすように Postfix を設定しました。ただし、Exchange Online の SMTP サーバーは、送信元アドレスが認証アドレスと完全に一致しない限り、メッセージを拒否します (エラー メッセージは です550 5.7.1 Client does not have permissions to send as this sender)。

注意深く設定すれば、このユーザーとして送信するようにサービスを設定できます。しかし、私は慎重になるのがあまり好きではありません。むしろ、postfix で強制的に処理させたいです。これを行う方法はありますか?

答え1

これは実際に postfix で行う方法です。

この設定は、ローカルで発信された SMTP メール トラフィックとリレーされた SMTP メール トラフィックの両方の送信者アドレスを変更します。

/etc/postfix/main.cf:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

サーバー自体から発信された電子メールのエンベロープアドレスを書き換える

/etc/postfix/sender_canonical_maps:

/.+/    [email protected]

SMTP 中継された電子メールの送信元アドレスを書き換える

/etc/postfix/header_check:

/From:.*/ REPLACE From: [email protected]

たとえば、すべての多機能および複数のアプリケーションで使用されるローカル リレー SMTP サーバーを使用している場合、これは非常に便利です。

Office 365 SMTP サーバーを使用する場合、認証されたユーザー自身からのメールとは異なる送信者アドレスを持つメールはすべて拒否されます。上記の構成により、これが防止されます。

答え2

オプションのジェネリックテーブルは、サーバーからメールが配信(送信)されるときに適用されるアドレス マッピングを指定します。

これは正統なサーバーがメールを受信するときに適用されるマッピング。

(注: 汎用テーブルと標準テーブルのいずれの場合も、FROM アドレスと TO アドレスの両方が置換対象として一致します。)

メール送信時に正規表を使用するサーバーが受信他の回答はすでに説明されています。

メールが送信されると、送信元アドレスを書き換えることができます。サーバーから送信を使用しますsmtp_generic_maps

によるとpostfix ドキュメント:

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    [email protected]      [email protected]
    @localdomain.local          [email protected]

次に、次の操作を実行します。

sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload

参考文献:

答え3

更新: IT 関係の友人のアドバイスに従って、クラウド メール サーバーを 1 つ作成するのではなく、すべてのサーバーで postfix を実行することにしました。これまでの解決策は次のとおりです。

/etc/postfix/main.cf

# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain

# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =   # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic

# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com

# Only listen on the local interfaces (not the public)
inet_interfaces = localhost

# I left out a bunch of CentOS defaults.  postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

/etc/postfix/sasl_passwd

# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com [email protected]:YourP@ssw0rd

/etc/postfix/generic

# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal [email protected]
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal [email protected]

/etc/aliases

# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon:  postmaster
postmaster:     root

# And the important part - your email or distribution group
root:           [email protected]

/etc/passwd

# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
#  rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash

嬉しいこと:

  • 大量のメールが root に送信され、そのメールaliasを誰が受け取るかは 1 行で指定します。
  • ローカル ユーザーからのすべてのメールは からの送信に変換され[email protected]、MS Online SMTP サーバーを通過します。
  • postfix には sendmail よりもはるかに優れたドキュメントがあります。

満足していない点:

  • ホストごとにカスタム変更が必要であり、いくつかの手順が必要です。そのための bash スクリプトを作成しました。
  • 名前passwdトリックは常に機能するわけではなく、メールがどのサーバーから送信されているかを把握するのが難しい場合があります。
  • 送信されるすべてのメールには、ログに 3 つの警告が記録されます。
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism listAUTH(SMTP サーバーはの前にnull リストを送信しますSTARTTLSが、AUTH LOGINの後には null リストを送信します)。
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate(証明書に関する設定オプションはいくつかありますが、証明書が更新されるとメールの配信が中断されるかどうかはわかりません)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted(2と同じ)

メール サーバーに関する力強い意見を共有してくれた serverfault コミュニティに感謝します。

答え4

正規表現よりもさらに簡単な答えは(@Jasper の回答によると)、静的ルックアップを使用することです。

sender_canonical_maps = static:[email protected]

static常に同じ値を返します(https://www.postfix.org/DATABASE_README.html#types

関連情報