Memaksa alamat dari ketika postfix relay atas smtp


28

Saya mencoba mendapatkan laporan email dari AWS EC2 kami. Kami menggunakan Exchange Online (bagian dari Microsoft Online Services). Saya telah menyiapkan akun pengguna khusus untuk relai SMTP , dan saya telah menyiapkan Postfix untuk memenuhi semua persyaratan untuk menyampaikan pesan melalui server ini. Namun, server SMTP Exchange Online akan menolak pesan kecuali alamat Dari sama persis dengan alamat otentikasi (pesan kesalahannya adalah 550 5.7.1 Client does not have permissions to send as this sender).

Dengan konfigurasi yang cermat, saya dapat mengatur layanan saya untuk dikirim sebagai pengguna ini. Tapi saya bukan penggemar hati-hati - saya lebih suka memiliki postfix yang memaksa masalah ini. Apakah ada cara untuk melakukan ini?

Jawaban:


38

Ini adalah cara melakukannya di postfix.

Konfigurasi ini mengubah alamat pengirim dari lokal yang berasal, dan menyampaikan lalu lintas email 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

Tulis ulang alamat amplop dari email yang berasal dari server itu sendiri

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

Menulis ulang dari alamat di SMTP menyampaikan email

/ etc / postfix / header_check:

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

Itu sangat berguna jika Anda misalnya menggunakan server smtp relay lokal yang digunakan oleh semua multifungsi Anda dan beberapa aplikasi.

Jika Anda menggunakan server SMTP Office 365, surat apa pun dengan alamat pengirim yang berbeda dari email dari pengguna yang diautentikasi itu sendiri hanya akan ditolak. Konfigurasi di atas mencegah ini.


Terima kasih! Ini seperti apa yang saya cari. Sayangnya, akses saya ke Office 365 adalah dua pekerjaan yang lalu. Adakah yang bisa mengkonfirmasi apakah ini cocok untuk mereka?
John Whitlock

1
Saya bisa. Saya menggunakan ini dengan kantor 365.
Jasper

1
Ketika menggunakan sender_canonical_mapspostfix tidak dapat menyimpan email yang ditolak ke spool lokal dan sebagai gantinya mencoba mengirimnya melalui relay tanpa batas
baskom

2
@Jasper FYI Saya menemukan ini lebih mudah untuk mengubah konfigurasi di atas 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
Jacob Evans

memiliki masalah yang serupa, sender_canonical_classes = envelope_sender menyelamatkan hari saya!
Stephan Richter

13

Tabel generik opsional menentukan pemetaan alamat yang berlaku ketika surat dikirimkan (dikirim) dari server.

Ini adalah kebalikan dari pemetaan kanonik , yang berlaku ketika surat diterima oleh server.

(Catatan: alamat FROM dan TO cocok untuk penggantian tabel generik dan kanonik.)

Menggunakan tabel kanonik ketika surat diterima oleh server sudah dijelaskan adalah jawaban lain.

Anda dapat menulis ulang dari alamat FROM ketika surat dikirim dari server menggunakan smtp_generic_maps.

Menurut dokumentasi 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

Kemudian lakukan:

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

Referensi:


1
Ini berfungsi tetapi bagaimana saya bisa juga mengubah nama DARI?
Joanna Mikalai

Pengalaman saya dengan peta generik adalah bahwa ia akan mengidentifikasi alamat FROM dan TO, menggunakan peta kanonik untuk memaksa hanya alamat FROM seperti yang diminta OP
doz87

Apakah mungkin mengubah alamat pengirim dan mencocokkan alamat pengirim menggunakan regex?
WM

@ doz87 baik FROM dan TO akan dicocokkan dengan peta kanonik dan generik. Saya telah memperbarui jawaban saya untuk menjelaskan perbedaan antara kedua peta.
Jocelyn

@WM ya, Anda bisa menggunakan regexp. Saya tidak pernah mencobanya tetapi Anda mungkin harus mengubah hash:ke regexp:dalam main.cf dan menggunakan baris seperti /foo.*@localdomain.local/ account@example.comdi peta umum. Ini dijelaskan di halaman manual: postfix.org/generic.5.html
Jocelyn

7

Pembaruan: Atas saran seorang teman IT, saya menjalankan postfix pada semua server saya, daripada membuat satu server cloud mail. Inilah solusi saya sejauh ini:

/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

Hal-hal yang saya sukai:

  • Banyak email dikirim ke root, dan satu baris di aliasmengarahkan siapa yang mendapatkannya.
  • Semua email dari pengguna lokal diterjemahkan dari relayer@hosteddomain.com, sehingga dapat melalui server SMTP MS Online.
  • postfix memiliki dokumentasi yang jauh lebih baik daripada sendmail.

Hal-hal yang tidak saya sukai:

  • Diperlukan perubahan khusus untuk setiap host, dan beberapa langkah. Saya menulis skrip bash untuk membantu.
  • The passwdNama trik tidak selalu bekerja, dan bisa sulit untuk mencari tahu apa mail server akan datang dari.
  • Setiap email yang dikirim menempatkan tiga peringatan di log:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(Server SMTP mengirim AUTHdaftar nol sebelum STARTTLS, tetapi AUTH LOGINsetelah).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Ada beberapa opsi konfigurasi di sekitar sertifikat, tetapi saya tidak yakin apakah pengiriman surat terputus saat sertifikat diperbarui)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Sama seperti # 2)

Terima kasih kepada komunitas serverfault karena berbagi pendapat yang kuat tentang server email.


4

Anda dapat menggunakan smtpd_sender_login_maps untuk menentukan daftar peta: alamat pengirim - pengguna.

Contoh:

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

/ etc / postfix / login-map:

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

Itu berfungsi untuk mengirim, itu harus bekerja untuk menyampaikan dengan cara yang sama.


Apakah tujuan untuk menulis ulang alamat dari pada waktu antrian? Kesan saya adalah smtpd_sender_login_maps digunakan untuk menolak pengirim (sebagai bagian dari smtpd_sender_restrictions), bukan untuk menerjemahkan login ke alamat email. Dengan ini di tempat, echo "This is a test" | /usr/sbin/sendmail test@example.commasih antrian (dan akhirnya relay) surat datang dariuser@domU-DE-AD-BE-EF-00-01.compute-1.internal
John Whitlock

Buruk saya, saya entah bagaimana mengerti Anda mengotorisasi postfix Anda. Dalam kasus seperti itu, smtpd_sender_login_maps akan membatasi pengguna apa yang dapat menggunakan adddress pengirim.
sutera

Ini mungkin akhirnya menjadi bagian dari solusi akhir saya. Saya bisa menolak semua kecuali satu alamat pengirim di ujung depan, dan memberi tahu kepala kantor pos tentang penolakan ujung depan, untuk memberi tahu saya ketika layanan belum dikonfigurasi dengan benar. Saya sedang melihat smtp_generic_maps, untuk melihat apakah saya dapat menggunakannya untuk mengubah semua akun lokal menjadi One True From Address. Tapi, saya perlu membaca ulang dokumen postfix untuk memahami bagaimana menentukan akun lokal - AWS DNS tidak cocok dengan intuisi saya.
John Whitlock

0

Saya menggunakan pemetaan kanonik untuk menulis ulang alamat dari, seperti menulis ulang root @ app01 ke no-reply@example.com.


3
Selamat Datang di Kesalahan Server! Kami benar-benar lebih suka jawaban berisi konten bukan petunjuk ke konten. Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
user9517 mendukung GoFundMonica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.