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.