Forcer l'adresse from lorsque les relais postfix sur smtp


28

J'essaie d'obtenir des rapports par e-mail à partir de nos instances AWS EC2. Nous utilisons Exchange Online (partie de Microsoft Online Services). J'ai configuré un compte utilisateur spécifiquement pour le relais SMTP , et j'ai configuré Postfix pour répondre à toutes les exigences pour relayer les messages via ce serveur. Cependant, le serveur SMTP d'Exchange Online rejettera les messages à moins que l'adresse de l'expéditeur ne corresponde exactement à l'adresse d'authentification (le message d'erreur est 550 5.7.1 Client does not have permissions to send as this sender).

Avec une configuration soignée, je peux configurer mes services pour envoyer en tant que cet utilisateur. Mais je ne suis pas un grand fan de la prudence - je préfère que postfix force le problème. Y a-t-il un moyen de faire cela?

Réponses:


38

Voici comment le faire vraiment en postfix.

Cette configuration modifie les adresses des expéditeurs à partir du trafic de messagerie SMTP d'origine et relayé local:

/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

Réécrire l'adresse d'enveloppe à partir du courrier électronique provenant du serveur lui-même

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

Réécrire à partir de l'adresse dans le courrier électronique relayé SMTP

/ etc / postfix / header_check:

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

C'est très utile si vous utilisez par exemple un serveur smtp relais local qui est utilisé par tous vos multifonctionnels et plusieurs applications.

Si vous utilisez le serveur SMTP Office 365, tout courrier avec une adresse d'expéditeur différente de celle de l'utilisateur authentifié lui-même sera simplement refusé. La configuration ci-dessus empêche cela.


Merci! Cela ressemble à ce que je cherchais. Malheureusement, mon accès à Office 365 était il y a deux emplois. Quelqu'un peut-il confirmer si cela fonctionne pour eux?
John Whitlock

1
Je peux. J'utilise ceci avec Office 365.
Jasper

1
Lorsque vous utilisez sender_canonical_mapspostfix, vous ne pouvez pas enregistrer le courrier rejeté dans le spool local et essayez à la place de l'envoyer via le relais à l'infini
bassin

2
@Jasper FYI J'ai trouvé cela plus facile de changer les configlines ci-dessus 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

eu un problème similaire, sender_canonical_classes = enveloppe_sender m'a sauvé la journée!
Stephan Richter

13

Le tableau générique facultatif spécifie un mappage d'adresses qui s'applique lorsque le courrier est remis (envoyé) à partir du serveur.

C'est l'opposé du mappage canonique , qui s'applique lorsque le courrier est reçu par le serveur.

(Remarque: les adresses FROM et TO sont appariées pour le remplacement de n'importe quelle table générique et canonique.)

L'utilisation d'une table canonique lorsque le courrier est reçu par le serveur est déjà expliquée est d'autres réponses.

Vous pouvez réécrire les adresses FROM lorsque le courrier est envoyé à partir du serveur à l' aide de smtp_generic_maps.

Selon la documentation de 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

Alors fais:

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

Les références:


1
Cela fonctionne, mais comment puis-je également changer le nom FROM?
Joanna Mikalai

D'après mon expérience avec les cartes génériques, il identifiera les adresses FROM et TO, utilisera des cartes canoniques pour forcer uniquement l'adresse FROM comme l'OP l'a demandé
doz87

Est-il possible de changer le courrier de l'expéditeur et de faire correspondre les adresses des expéditeurs à l'aide de l'expression régulière?
WM

@ doz87 à la fois FROM et TO sera associé à la fois aux cartes canoniques et génériques. J'ai mis à jour ma réponse pour expliquer la différence entre les deux cartes.
Jocelyn

@WM oui, vous pouvez utiliser regexp. Je ne ai jamais essayé mais vous devrez probablement changer hash:à regexp:des lignes de main.cf et d' utilisation comme /foo.*@localdomain.local/ account@example.comla carte générique. Ceci est expliqué dans la page de manuel
Jocelyn

7

Mise à jour: sur les conseils d'un ami informatique, j'utilise postfix sur tous mes serveurs, plutôt que de créer un serveur de messagerie cloud. Voici ma solution jusqu'à présent:

/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

Choses dont je suis heureux:

  • Un grand nombre de messages sont envoyés à la racine et la seule ligne aliasindique qui les reçoit.
  • Tout le courrier provenant d'utilisateurs locaux est traduit en provenance de relayer@hosteddomain.com, de sorte qu'il passe par le serveur SMTP MS Online.
  • postfix a une bien meilleure documentation que sendmail.

Choses dont je ne suis pas content:

  • Des modifications personnalisées sont requises pour chaque hôte et plusieurs étapes. J'ai écrit un script bash pour vous aider.
  • L' passwdastuce de nom ne fonctionne pas toujours, et il peut être difficile de déterminer de quel serveur provient un courrier.
  • Chaque courrier envoyé met trois avertissements dans le journal:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(Le serveur SMTP envoie une AUTHliste nulle avant STARTTLS, mais AUTH LOGINaprès).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Il y a quelques options de configuration autour des certificats, mais je ne suis pas sûr que la livraison du courrier soit interrompue lorsque le certificat est renouvelé)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Identique à # 2)

Merci à la communauté serverfault d'avoir partagé des opinions bien arrêtées sur les serveurs de messagerie.


4

Vous pouvez utiliser smtpd_sender_login_maps pour spécifier une liste de cartes: adresse de l'expéditeur - utilisateur.

Exemple:

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

/ etc / postfix / login-map:

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

Cela fonctionne pour l'envoi, il devrait fonctionner pour le relais de la même manière.


Le but est-il de réécrire l'adresse d'expéditeur au moment de la file d'attente? Mon impression est que smtpd_sender_login_maps est utilisé pour rejeter les expéditeurs (dans le cadre de smtpd_sender_restrictions), pas pour traduire les connexions en adresses e-mail. Avec cela en place, echo "This is a test" | /usr/sbin/sendmail test@example.comtoujours en file d'attente (et éventuellement relaie) le courrier comme venant deuser@domU-DE-AD-BE-EF-00-01.compute-1.internal
John Whitlock

Mon mauvais, j'ai compris que vous autorisez votre postfix. Dans ce cas, smtpd_sender_login_maps limiterait quel utilisateur peut utiliser quelle adresse d'expéditeur.
soie

Cela pourrait finir par faire partie de ma solution finale. Je pourrais rejeter tout sauf l'adresse de l'expéditeur sur le frontal, et informer le postmaster de tout rejet frontal, pour me faire savoir quand un service n'est pas encore configuré correctement. Je regarde smtp_generic_maps, pour voir si je peux les utiliser pour modifier tous les comptes locaux à l'adresse One True From. Mais, je dois relire les documents postfix pour comprendre comment il détermine les comptes locaux - AWS DNS ne correspond pas à mon intuition.
John Whitlock

0

J'utilise le mappage canonique pour réécrire l'adresse de l'expéditeur, comme la réécriture de root @ app01 vers no-reply@example.com.


3
Bienvenue dans Server Fault! Nous préférons vraiment que les réponses contiennent du contenu et non des pointeurs vers le contenu. Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
user9517 prend en charge GoFundMonica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.