Wymuszanie adresu od, gdy postfix jest przekazywany przez smtp


28

Próbuję uzyskać raporty e-mail z naszych instancji AWS EC2. Korzystamy z Exchange Online (część Microsoft Online Services). Skonfigurowałem konto użytkownika specjalnie dla przekazywania SMTP i skonfigurowałem Postfix, aby spełniał wszystkie wymagania dotyczące przekazywania wiadomości przez ten serwer. Jednak serwer SMTP usługi Exchange Online odrzuci wiadomości, chyba że adres Od dokładnie odpowiada adresowi uwierzytelnienia (komunikat o błędzie to 550 5.7.1 Client does not have permissions to send as this sender).

Dzięki starannej konfiguracji mogę skonfigurować moje usługi do wysyłania jako ten użytkownik. Ale nie jestem wielkim fanem uważności - wolałbym, żeby postfiks wymusił rozwiązanie tego problemu. Czy jest na to sposób?

Odpowiedzi:


38

Oto jak to naprawdę zrobić w postfiksie.

Ta konfiguracja zmienia adresy nadawców zarówno z lokalnego źródła, jak i przekazywanego ruchu pocztowego 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

Przepisz adres koperty z wiadomości e-mail pochodzącej z samego serwera

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

Przepisz z adresu w przekazanej wiadomości e-mail SMTP

/ etc / postfix / header_check:

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

Jest to bardzo przydatne, jeśli na przykład używasz lokalnego przekaźnikowego serwera smtp, który jest używany przez wszystkie urządzenia wielofunkcyjne i kilka aplikacji.

Jeśli używasz serwera Office 365 SMTP, każda poczta z innym adresem nadawcy niż wiadomość e-mail od samego uwierzytelnionego użytkownika zostanie po prostu odrzucona. Powyższa konfiguracja temu zapobiega.


Dzięki! Wygląda na to, czego szukałem. Niestety mój dostęp do Office 365 był dwa zadania temu. Czy ktoś może potwierdzić, czy to działa dla nich?
John Whitlock

1
Mogę. Używam tego z Office 365.
Jasper

1
Podczas korzystania z sender_canonical_mapsPostfixa nie można zapisać odrzuconej poczty w lokalnej buforze i zamiast tego próbuje wysłać ją przez przekaźnik w nieskończoność
dorzecze

2
@Jasper FYI Łatwiej było mi zmienić powyższe konfiguracje 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,

miał podobny problem, sender_canonical_classes = koperta_dostawca uratowała mi dzień!
Stephan Richter

13

Opcjonalna tabela ogólna określa mapowanie adresu, które ma zastosowanie, gdy poczta jest dostarczana (wysyłana) z serwera.

Jest to przeciwieństwo odwzorowania kanonicznego , które ma zastosowanie, gdy poczta jest odbierana przez serwer.

(Uwaga: zarówno adresy FROM, jak i TO są dopasowywane w celu zastąpienia dowolnych tabel ogólnych i kanonicznych.)

Używanie tabeli kanonicznej po otrzymaniu poczty przez serwer jest już wyjaśnione, to inne odpowiedzi.

Możesz przepisać z adresów, gdy poczta jest wysyłana z serwera za pomocą smtp_generic_maps.

Zgodnie z dokumentacją postfiksową :

/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

Następnie wykonaj:

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

Referencje:


1
To działa, ale jak mogę zmienić nazwę FROM?
Joanna Mikalai

Moje doświadczenie z mapami rodzajowymi polega na tym, że będą one identyfikować zarówno adresy FROM, jak i TO, używają map kanonicznych, aby wymusić tylko adres FROM, o który poprosił OP
doz87

Czy można zmienić pocztę nadawcy i dopasować adresy nadawców za pomocą wyrażenia regularnego?
WM

@ doz87 zarówno FROM, jak i TO będą pasować zarówno do map kanonicznych, jak i ogólnych. Zaktualizowałem swoją odpowiedź, aby wyjaśnić różnicę między dwiema mapami.
Jocelyn

@WM tak, możesz użyć wyrażenia regularnego. Nigdy tego nie próbowałem, ale prawdopodobnie musiałbyś zmienić hash:na regexp:main.cf i użyć linii jak /foo.*@localdomain.local/ account@example.comna mapie ogólnej. Wyjaśnia to strona man: postfix.org/generic.5.html
Jocelyn

7

Aktualizacja: zgodnie z radą znajomego IT działam na wszystkich moich serwerach postfiks, zamiast tworzyć jeden serwer poczty w chmurze. Oto moje dotychczasowe rozwiązanie:

/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

Rzeczy, z których jestem zadowolony:

  • Wiele wiadomości e-mail jest wysyłanych do roota, a jedna linia w jednym aliaswskazuje, kto je otrzymuje.
  • Cała poczta od lokalnych użytkowników jest tłumaczona na przychodzącą relayer@hosteddomain.com, więc dostaje się przez serwer SMTP MS Online.
  • postfix ma znacznie lepszą dokumentację niż sendmail.

Rzeczy, z których nie jestem zadowolony:

  • Niestandardowe zmiany są wymagane dla każdego hosta i kilku kroków. Napisałem skrypt bash, aby pomóc.
  • passwdNazwa trik nie zawsze działa, a to może być trudne, aby dowiedzieć się, co serwer z poczty pochodzi.
  • Każda wysłana poczta umieszcza w dzienniku trzy ostrzeżenia:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(Serwer SMTP wysyła AUTHlistę zerową przed STARTTLS, ale AUTH LOGINpo).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Istnieją pewne opcje konfiguracji wokół certyfikatów, ale nie jestem pewien, czy dostarczanie poczty przerywa się przy odnawianiu certyfikatu)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Taki sam jak nr 2)

Dziękujemy społeczności serverfault za dzielenie się silnymi opiniami na temat serwerów pocztowych.


4

Możesz użyć smtpd_sender_login_maps, aby określić listę map: adres nadawcy - użytkownik.

Przykład:

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

/ etc / postfix / login-map:

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

Działa w przypadku wysyłania, powinien działać w taki sam sposób.


Czy celem jest przepisanie adresu z w kolejce? Mam wrażenie, że smtpd_sender_login_maps służy do odrzucania nadawców (jako część smtpd_sender_restrictions), a nie do tłumaczenia loginów na adresy e-mail. Mając to na miejscu, echo "This is a test" | /usr/sbin/sendmail test@example.comnadal ustawia w kolejce (i ostatecznie przekazuje) pocztę oduser@domU-DE-AD-BE-EF-00-01.compute-1.internal
John Whitlock

Mój zło, jakoś zrozumiałem, że autoryzujesz swój postfiks. W takim przypadku smtpd_sender_login_maps ograniczyłby to, co użytkownik może użyć, jaki adres nadawcy.
jedwab

To może być częścią mojego końcowego rozwiązania. Mogę odrzucić wszystkie adresy z wyjątkiem jednego nadawcy na interfejsie i powiadomić postmastera o wszelkich odrzuceniach interfejsu, aby poinformować mnie, gdy usługa nie jest jeszcze poprawnie skonfigurowana. Patrzę na smtp_generic_maps, aby zobaczyć, czy mogę ich użyć do zmodyfikowania wszystkich kont lokalnych na adres One True From. Ale muszę ponownie przeczytać dokumentację po poprawce, aby zrozumieć, w jaki sposób określa ona konta lokalne - AWS DNS nie odpowiada mojej intuicji.
John Whitlock,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.