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?

John Whitlock
sumber

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:

/.+/    [email protected]

Menulis ulang dari alamat di SMTP menyampaikan email

/ etc / postfix / header_check:

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

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.

Jasper
sumber
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:
    [email protected]      [email protected]
    @localdomain.local          [email protected]

Kemudian lakukan:

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

Referensi:

Jocelyn
sumber
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/ [email protected]di 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 [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

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 [email protected], 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.

John Whitlock
sumber
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, [email protected]

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

sutra
sumber
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 [email protected]masih antrian (dan akhirnya relay) surat datang dari[email protected]
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 [email protected].

ZHANG Cheng
sumber
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