web-dev-qa-db-ja.com

postfixがSMTPを介してリレーするときにfromアドレスを強制する

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に問題を強制させたいです。これを行う方法はありますか?

29
John Whitlock

これは実際に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サーバーを使用している場合、認証されたユーザー自体からの電子メールとは異なる送信者アドレスのメールはすべて拒否されます。上記の設定はこれを防ぎます。

44
Jasper

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

これはcanonicalマッピングの逆であり、サーバーがメールを受信したときに適用されます。

(注:FROMとTOの両方のアドレスは、汎用テーブルおよび正規テーブルのいずれかを置き換えるために一致します。)

メールがサーバーで受信されたときに正規テーブルを使用するについてはすでに説明していますが、他の回答があります。

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

postfix documentation によると:

/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

参照:

13
Jocelyn

更新: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 list(SMTPサーバーはAUTHの前にnull STARTTLSリストを送信しますが、AUTH LOGINの後に送信します)。
    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コミュニティに感謝します。

7
John Whitlock

smtpd_sender_login_maps を使用して、マップのリストを指定できます:送信者アドレス-ユーザー。

例:

smtpd_sender_login_maps = 
    hash:/etc/postfix/login-map 

/ etc/postfix/login-map:

mail1@domain    userlogin
mail2@domain    userlogin, [email protected]

送信には機能しますが、同じように中継にも機能するはずです。

4
silk

私は canonical mapping を使用して、root @ app01を[email protected]に書き換えるなど、fromアドレスを書き換えます。

0
ZHANG Cheng