Forzare l'indirizzo da quando postfix inoltra su smtp


28

Sto cercando di ottenere rapporti e-mail dalle nostre istanze di AWS EC2. Stiamo utilizzando Exchange Online (parte dei Microsoft Online Services). Ho configurato un account utente specifico per l'inoltro SMTP e ho installato Postfix per soddisfare tutti i requisiti per l'inoltro dei messaggi attraverso questo server. Tuttavia, il server SMTP di Exchange Online rifiuterà i messaggi a meno che l'indirizzo Da non corrisponda esattamente all'indirizzo di autenticazione (il messaggio di errore è 550 5.7.1 Client does not have permissions to send as this sender).

Con un'attenta configurazione, posso configurare i miei servizi per l'invio come questo utente. Ma non sono un grande fan di stare attento, preferirei che Postfix forzasse il problema. C'è un modo per fare questo?

Risposte:


38

Ecco come farlo davvero in postfix.

Questa configurazione modifica gli indirizzi del mittente dal traffico di posta SMTP sia originato localmente sia inoltrato:

/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

Riscrivi l'indirizzo della busta dall'e-mail proveniente dal server stesso

/ Etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

Riscrivi dall'indirizzo nell'e-mail inoltrata SMTP

/ Etc / postfix / header_check:

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

Questo è molto utile se ad esempio stai usando un server smtp di inoltro locale che viene utilizzato da tutti i tuoi multifunzione e diverse applicazioni.

Se si utilizza il server SMTP di Office 365, qualsiasi posta con un indirizzo mittente diverso dall'e-mail dell'utente autenticato verrà semplicemente negata. La configurazione sopra impedisce questo.


Grazie! Sembra quello che stavo cercando. Sfortunatamente, il mio accesso a Office 365 è stato di due lavori fa. Qualcuno può confermare se questo funziona per loro?
John Whitlock,

1
Io posso. Lo sto usando con Office 365.
Jasper,

1
Quando si utilizza sender_canonical_mapsPostfix non è possibile salvare la posta rifiutata nello spool locale e invece tenta di inviarlo tramite l'inoltro all'infinito
bacino

2
@Jasper FYI Ho trovato più facile cambiare i suddetti configlines 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,

ha avuto un problema simile, sender_canonical_classes = envelope_sender mi ha salvato la giornata!
Stephan Richter,

13

La tabella generica opzionale specifica un mapping di indirizzi che si applica quando la posta viene recapitata (inviata) dal server.

Questo è l'opposto della mappatura canonica , che si applica quando la posta viene ricevuta dal server.

(Nota: entrambi gli indirizzi FROM e TO vengono abbinati per la sostituzione di una qualsiasi delle tabelle generiche e canoniche.)

L'uso della tabella canonica quando la posta viene ricevuta dal server è già spiegato è altre risposte.

È possibile riscrivere gli indirizzi FROM quando la posta viene inviata dal server utilizzando smtp_generic_maps.

Secondo la documentazione 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

Quindi fa:

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

Riferimenti:


1
Funziona ma come posso anche cambiare il nome FROM?
Joanna Mikalai,

La mia esperienza con le mappe generiche è che identificherà gli indirizzi FROM e TO, utilizzerà le mappe canoniche per forzare solo l'indirizzo FROM come richiesto dall'OP
doz87

È possibile cambiare la posta del mittente e abbinare gli indirizzi dei mittenti usando regex?
WM,

@ doz87 sia FROM che TO saranno abbinati a mappe sia canoniche che generiche. Ho aggiornato la mia risposta per spiegare la differenza tra le due mappe.
Jocelyn,

@WM sì, puoi usare regexp. Non l'ho mai provato ma probabilmente dovresti passare hash:a regexp:in main.cf e usare le linee come /foo.*@localdomain.local/ account@example.comnella mappa generica. Questo è spiegato nella pagina man: postfix.org/generic.5.html
Jocelyn,

7

Aggiornamento: su consiglio di un amico IT, sto eseguendo Postfix su tutti i miei server, piuttosto che creare un server di posta cloud. Ecco la mia soluzione finora:

/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

Cose di cui sono felice:

  • Molta posta viene inviata a root e l'unica riga aliasindica chi la riceve.
  • Tutta la posta degli utenti locali viene tradotta in provenienza relayer@hosteddomain.com, quindi arriva attraverso il server SMTP MS Online.
  • postfix ha una documentazione molto migliore di sendmail.

Cose di cui non sono felice:

  • Sono necessarie modifiche personalizzate per ciascun host e diversi passaggi. Ho scritto uno script bash per aiutare.
  • Il passwdtrucco dei nomi non funziona sempre e può essere difficile capire da quale server provenga una mail.
  • Ogni mail inviata inserisce tre avvisi nel registro:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(Il server SMTP invia un AUTHelenco null prima STARTTLS, ma AUTH LOGINdopo).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Ci sono alcune opzioni di configurazione intorno a certs, ma non sono sicuro se la consegna della posta si interrompe quando il certificato viene rinnovato)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Come il n. 2)

Grazie alla community serverfault per aver condiviso opinioni forti sui server di posta.


4

È possibile utilizzare smtpd_sender_login_maps per specificare un elenco di mappe: indirizzo mittente - utente.

Esempio:

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

/ Etc / postfix / login-map:

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

Funziona per l'invio, dovrebbe funzionare per l'inoltro allo stesso modo.


Lo scopo è di riscrivere l'indirizzo mittente al momento della coda? La mia impressione è che smtpd_sender_login_maps sia usato per rifiutare i mittenti (come parte di smtpd_sender_rest restrizioni), non per tradurre gli accessi in indirizzi email. Con questo in atto, echo "This is a test" | /usr/sbin/sendmail test@example.comcontinua a mettere in coda (e alla fine inoltra) la posta proveniente dauser@domU-DE-AD-BE-EF-00-01.compute-1.internal
John Whitlock,

Mio male, in qualche modo ho capito che autorizzi il tuo postfix. In tal caso, smtpd_sender_login_maps limiterebbe ciò che l'utente può utilizzare quale indirizzo del mittente.
seta,

Questo potrebbe finire per far parte della mia soluzione finale. Potrei rifiutare tutti tranne un indirizzo mittente sul front-end e informare il postmaster di eventuali rifiuti del front-end, per farmi sapere quando un servizio non è ancora configurato correttamente. Sto guardando smtp_generic_maps, per vedere se posso usarli per modificare tutti gli account locali in One True From Address. Tuttavia, ho bisogno di rileggere i documenti postfix per capire come determina gli account locali: AWS DNS non corrisponde al mio intuito.
John Whitlock,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.