web-dev-qa-db-fra.com

Forcer l'adresse from lorsque les relais postfix sur smtp

J'essaie d'obtenir des rapports par e-mail à partir de nos instances AWS EC2. Nous utilisons Exchange Online (qui fait partie de Microsoft Online Services). J'ai configuré un compte utilisateur spécifiquement pour 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, sauf si l'adresse de provenance correspond 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 qu'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?

29
John Whitlock

Voici comment vraiment le faire 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 de l'enveloppe à partir du courrier électronique provenant du serveur lui-même

/ etc/postfix/sender_canonical_maps:

/.+/    [email protected]

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

/ etc/postfix/header_check:

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

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.

44
Jasper

La table générique facultative 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 de 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é depuis le serveur en utilisant smtp_generic_maps.

Selon documentation postfix :

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    [email protected]      [email protected]
    @localdomain.local          [email protected]

Alors fais:

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

Références:

13
Jocelyn

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 [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

Choses dont je suis heureux:

  • Beaucoup de messages sont envoyés à root, et la seule ligne dans alias indique qui les reçoit.
  • Tout le courrier provenant d'utilisateurs locaux est traduit en provenant de [email protected], il passe donc 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'astuce de nom passwd 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 liste nulle AUTH avant STARTTLS, mais AUTH LOGIN aprè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 sais pas si la livraison du courrier est 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.

7
John Whitlock

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

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

4
silk

J'utilise mappage canonique pour réécrire l'adresse d'expéditeur, telle que la réécriture de root @ app01 vers [email protected].

0
ZHANG Cheng