PostfixがSMTPを介してリレーするときに送信元アドレスを強制する


28

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

慎重に構成すれば、このユーザーとして送信するようにサービスをセットアップできます。しかし、私は注意を払うことの大ファンではありません-私はむしろ後置に問題を強制したいと思います。これを行う方法はありますか?

回答:


38

これは、実際に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:

/.+/    newsender@address.com

SMTPリレー電子メールのアドレスから書き換える

/ etc / postfix / header_check:

/From:.*/ REPLACE From: newsender@address.com

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

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


ありがとう!これは私が探していたもののように見えます。残念ながら、Office 365へのアクセスは2つ前の仕事でした。誰かがこれが彼らのために働くかどうか確認できますか?
ジョンホイットロック

1
できます。私はオフィス365でこれを使用しています
ジャスパー

1
使用するときはsender_canonical_maps代わりにローカルスプールに拒否されたメールを保存することはできません接尾辞を無限リレーを通してそれを送信しようとする
流域

2
@Jasper FYI上記の設定を変更する方が簡単だとわかりました postconf -e sender_canonical_classes=envelope_sender,header_sender postconf -e sender_canonical_maps=regexp:/etc/postfix/sender_canonical_maps postconf -e smtp_header_checks=regexp:/etc/postfix/header_check
ジェイコブエヴァンス

同様の問題がありました。sender_canonical_classes= envelope_senderは私の一日を救いました!
ステファンリヒター

13

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

これは、サーバーがメールを受信したときに適用される正規マッピングの反対です。

(注:FROMおよびTOアドレスの両方が、汎用テーブルおよび正規テーブルのいずれかの置換のために照合されます。)

サーバーがメールを受信したときに正規表を使用する方法については既に説明されています

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

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

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

/etc/postfix/generic:
    user@localdomain.local      account@isp.example.com
    @localdomain.local          wholedomain@isp.example.com

それから:

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

参照:


1
これは機能しますが、どうすればFROM名も変更できますか?
ジョアンナミカライ

一般的なマップの私の経験は、FROMアドレスとTOアドレスの両方を識別し、OPが要求したように正規のマップを使用してFROMアドレスのみを強制することです
-doz87

正規表現を使用して送信者のメールを変更し、送信者のアドレスと一致させることは可能ですか?
WM

@ doz87 FROMとTOの両方は、標準マップと汎用マップの両方に一致します。2つのマップの違いを説明するために回答を更新しました。
ジョセリン

@WMはい、正規表現を使用できます。試したことはありませんが、おそらくmain.cf に変更hash:し、一般的なマップのregexp:ような行を使用する必要があり/foo.*@localdomain.local/ account@example.comます。これはmanページで説明されています:postfix.org/generic.5.html
ジョセリン

7

更新: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 relayer@hosteddomain.com: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 relayer@hosteddomain.com
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/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:           awsadmins@hosteddomain.com

/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

私が満足していること:

  • 多くのメールがルートに送信され、1行でalias誰が取得するかが指示されます。
  • ローカルユーザーからのすべてのメールはからに変換されるrelayer@hosteddomain.comため、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前に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コミュニティに感謝します。


4

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

例:

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

/ etc / postfix / login-map:

mail1@domain    userlogin
mail2@domain    userlogin, otheruser@example.com

それは送信のために動作し、同じ方法で中継するために動作するはずです。


キュー時間にfromアドレスを書き換えるのは目的ですか?私の印象では、smtpd_sender_login_mapsはログインをメールアドレスに変換するのではなく、送信者を拒否するために使用されます(smtpd_sender_restrictionsの一部として)。代わりにこれにより、echo "This is a test" | /usr/sbin/sendmail test@example.comまだキュー(および最終的にリレー)から来るとしてメールuser@domU-DE-AD-BE-EF-00-01.compute-1.internal
ジョン・ホイットロック

私の悪いことに、私はあなたがあなたの接尾辞を承認することをどういうわけか理解しました。そのような場合、smtpd_sender_login_mapsは、どのユーザーがどの送信者アドレスを使用できるかを制限します。
シルク

これが最終的な解決策の一部になる可能性があります。フロントエンドの1つの送信者アドレス以外をすべて拒否し、フロントエンドの拒否をポストマスターに通知して、サービスがまだ正しく構成されていないことを知らせます。smtp_generic_mapsを見て、それらを使用してすべてのローカルアカウントをOne True Fromアドレスに変更できるかどうかを確認しています。しかし、ローカルアカウントを決定する方法を理解するには、postfixのドキュメントを読み直す必要があります-AWS DNSは私の直感と一致しません。
ジョンホイットロック

0

root @ app01をno-reply@example.comに書き換えるなど、正規マッピングを使用してfromアドレスを書き換えます。


3
サーバー障害へようこそ!回答には、コンテンツへのポインタではなく、コンテンツが含まれることを本当に好みます。これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
user9517はGoFundMonicaを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.