72 votes

Forcer l'adresse d'expéditeur lorsque postfix relaie via smtp

Je suis en train d'essayer de recevoir des rapports par email de nos instances AWS EC2. Nous utilisons Exchange Online (une partie des services en ligne de Microsoft). J'ai configuré un compte utilisateur spécifiquement pour relayer les emails via SMTP, et j'ai configuré Postfix pour répondre à toutes les exigences afin de relayer les messages via ce serveur. Cependant, le serveur SMTP d'Exchange Online rejette les messages à moins que l'adresse d'expédition corresponde exactement à l'adresse d'authentification (le message d'erreur est 550 5.7.1 Le client n'a pas les autorisations pour envoyer en tant qu'expéditeur).

Avec une configuration soigneuse, je peux configurer mes services pour envoyer en tant qu'utilisateur. Mais je ne suis pas fan de la prudence - je préférerais que Postfix résolve le problème de force. Y a-t-il un moyen de le faire?

104voto

Jasper Points 944

C'est ainsi qu'il faut vraiment le faire dans postfix.

Ce paramètre modifie les adresses d'expéditeur à la fois pour le trafic de messagerie SMTP d'origine locale et relais :

/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 des e-mails provenant du serveur lui-même

/etc/postfix/sender_canonical_maps :

/.+/ newsender@address.com

Réécrire l'adresse d'expéditeur dans les e-mails relayés via SMTP

/etc/postfix/header_check :

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

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

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

0 votes

Merci! Cela semble être ce que je cherchais. Malheureusement, mon accès à Office 365 remonte à deux emplois. Est-ce que quelqu'un peut confirmer si cela fonctionne pour lui ?

1 votes

Je peux. Je l'utilise avec Office 365.

3 votes

Lors de l'utilisation de sender_canonical_maps, postfix ne peut pas enregistrer les courriers rejetés dans le réceptacle local et essaie plutôt de les envoyer à travers le relais indéfiniment.

23voto

trevorjay Points 51

Le tableau générique optionnel spécifie une correspondance d'adresse qui s'applique lorsque le courrier est envoyé depuis le serveur.

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

(Remarque : les adresses DE et VERS sont toutes deux vérifiées pour être remplacées dans les tables génériques et canoniques.)

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

Vous pouvez réécrire les adresses DE lorsque le courrier est envoyé depuis le serveur en utilisant smtp_generic_maps.

Conformément à la documentation 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

Ensuite, faites ceci :

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

Références:

2 votes

Cela fonctionne mais comment puis-je également changer le nom DE l'expéditeur ?

1 votes

Mon expérience avec des cartes génériques est qu'elles identifieront à la fois les adresses DE et À, utilisent des cartes canoniques pour forcer uniquement l'adresse DE comme l'a demandé l'OP

1 votes

Est-il possible de changer le courrier de l'expéditeur et de faire correspondre les adresses des expéditeurs en utilisant des expressions régulières ?

9voto

Mark Hatton Points 685

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

/etc/postfix/main.cf

# résultat de hostname -f - le courrier des utilisateurs locaux semble provenir d'ici
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Livraison locale - inclure tous les alias 127.0.0.1 de /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Nécessaire pour que la traduction d'adresse fonctionne
myorigin = $mydomain

# Communication avec 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 =   # Oui, laisser vide
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic

# Activer si vous avez besoin de débogage, mais cela expose les identifiants dans les journaux
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com

# Écouter uniquement sur les interfaces locales (pas sur le réseau public)
inet_interfaces = localhost

# J'ai omis un tas de paramètres par défaut de CentOS. postconf -n est votre ami.
# Ceux-ci sont inclus
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

/etc/postfix/sasl_passwd

# Exécutez postmap /etc/postfix/sasl_passwd après avoir modifié
# Aussi, chown root:root; chmod 600
smtp.mail.microsoftonline.com relayer@hosteddomain.com:VotreMdp@ssw0rd

/etc/postfix/generic

# Exécutez postmap /etc/postfix/generic
# J'ai vu du courrier local provenant de l'une ou l'autre source
# résultat de dnsdomainname
@compute-1.internal relayer@hosteddomain.com
# résultat de hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/etc/aliases

# Exécutez newaliases après modification
# Beaucoup de choses ici. En grande partie, assurez-vous simplement que le graphique pointe vers root, comme par exemple
mailer-daemon:  postmaster
postmaster:     root

# Et la partie importante - votre email ou groupe de distribution
root:           awsadmins@hosteddomain.com

/etc/passwd

# Parfois, il est utile d'étendre le nom, de sorte que le courrier émane de 'root at aws host 5'
#  plutôt que simplement 'root'
# Était
#root:x:0:0:root:/root:/bin/bash
# Est
root:x:0:0:root on aws host 5:/root:/bin/bash

Choses qui me réjouissent :

  • Beaucoup de courriers sont envoyés à root, et la seule ligne dans alias indique qui les reçoit.
  • Tout le courrier des utilisateurs locaux est traduit comme provenant de relayer@hosteddomain.com, donc il passe par le serveur SMTP MS Online.
  • postfix a une documentation bien meilleure que sendmail.

Choses qui ne me réjouissent pas :

  • Des modifications personnalisées sont nécessaires pour chaque hôte, et plusieurs étapes. J'ai écrit un script bash pour aider.
  • Le truc du nom passwd ne fonctionne pas toujours, et il peut être difficile de déterminer de quel serveur provient un courrier.
  • Chaque courrier envoyé génère trois avertissements dans le journal :
    1. Avertissement : smtp.mail.microsoftonline.com[65.55.171.153] a proposé une liste de mécanismes d'authentification nulle (Le serveur SMTP envoie une liste AUTH nulle avant STARTTLS, mais AUTH LOGIN après).
    2. Échec de la vérification du certificat pour smtp.mail.microsoftonline.com : num=20:impossible de récupérer le certificat de l'émetteur local (Il y a quelques options de configuration concernant les certificats, mais je ne suis pas sûr si la livraison de courrier échoue lorsque le certificat est renouvelé)
    3. Échec de la vérification du certificat pour smtp.mail.microsoftonline.com : num=27:certificat non approuvé (Identique à #2)

Merci à la communauté de serverfault pour avoir partagé des opinions fortes sur les serveurs de messagerie.

5voto

silk Points 898

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, cela devrait fonctionner de la même manière pour le relais.

0 votes

Est-ce que le but est de réécrire l'adresse de l'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), et non pour traduire les identifiants en adresses e-mail. Avec cela en place, echo "This is a test" | /usr/sbin/sendmail test@example.com met toujours en file d'attente (et finit par relayer) le courrier en provenance de user@domU-DE-AD-BE-EF-00-01.compute-1.internal

0 votes

Je me suis trompé, j'ai d'une certaine manière compris que vous autorisez à votre postfix. Dans ce cas, smtpd_sender_login_maps limiterait quel utilisateur peut utiliser quelle adresse d'expéditeur.

0 votes

Cela pourrait finir par faire partie de ma solution finale. Je pourrais rejeter tout sauf l'adresse de l'expéditeur sur le front end et informer le maître de poste de tout rejet de l'interface frontale, pour me faire savoir quand un service n'est pas encore configuré correctement. Je regarde les smtp_generic_maps pour voir si je peux les utiliser pour modifier tous les comptes locaux vers l'Adresse Vraie. Mais, j'ai besoin de relire la documentation de postfix pour comprendre comment il détermine les comptes locaux - la DNS AWS ne correspond pas à mon intuition.

1voto

ZHANG Cheng Points 11

J'utilise la cartographie canonique pour réécrire l'adresse d'expédition, par exemple en réécrivant root@app01 en no-reply@example.com.

5 votes

Bienvenue sur Server Fault! Nous préférons vraiment que les réponses contiennent du contenu et non des pointeurs vers du contenu. Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure les parties essentielles de la réponse ici, et de fournir le lien pour référence.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X