Forzar la dirección de origen cuando el postfix se retransmite a través de smtp

28

Estoy tratando de obtener informes por correo electrónico de nuestras instancias de AWS EC2. Estamos utilizando Exchange Online (parte de los Servicios en línea de Microsoft). He configurado una cuenta de usuario específicamente para la retransmisión SMTP , y he configurado Postfix para cumplir con todos los requisitos para retransmitir mensajes a través de este servidor. Sin embargo, el servidor SMTP de Exchange Online rechazará los mensajes a menos que la dirección De coincida exactamente con la dirección de autenticación (el mensaje de error es 550 5.7.1 Client does not have permissions to send as this sender).

Con una configuración cuidadosa, puedo configurar mis servicios para enviar como este usuario. Pero no soy un gran admirador de tener cuidado: prefiero que Postfix fuerce el problema. ¿Hay alguna forma de hacer esto?

John Whitlock
fuente

Respuestas:

38

Así es como realmente hacerlo en postfix.

Esta configuración cambia las direcciones del remitente del tráfico de correo SMTP de origen local y retransmitido:

/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

Reescribe la dirección del sobre del correo electrónico que se origina en el servidor

/ etc / postfix / sender_canonical_maps:

/.+/    [email protected]

Reescribir desde la dirección en el correo electrónico retransmitido SMTP

/ etc / postfix / header_check:

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

Eso es muy útil si, por ejemplo, utiliza un servidor smtp de retransmisión local que utilizan todas sus aplicaciones multifuncionales y varias.

Si usa el servidor SMTP de Office 365, cualquier correo con una dirección de remitente diferente al correo electrónico del usuario autenticado simplemente será denegado. La configuración anterior evita esto.

Jaspe
fuente
¡Gracias! Esto se parece a lo que estaba buscando. Desafortunadamente, mi acceso a Office 365 fue hace dos trabajos. ¿Alguien puede confirmar si esto funciona para ellos?
John Whitlock
1
Yo puedo. Estoy usando esto con Office 365.
Jasper
1
Al utilizar sender_canonical_mapspostfix no puede salvar el correo rechazado a cola de impresión local y en su lugar trata de enviarlo a través del relé infinitamente
cuenca
2
@Jasper FYI Me resultó más fácil cambiar las configuraciones anteriores 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,
tuve un problema similar, sender_canonical_classes = envolver_sender me salvó el día!
Stephan Richter
13

La tabla genérica opcional especifica una asignación de dirección que se aplica cuando el correo se entrega (envía) desde el servidor.

Esto es lo opuesto al mapeo canónico , que se aplica cuando el servidor recibe el correo.

(Nota: las direcciones FROM y TO coinciden para el reemplazo de cualquiera de las tablas genéricas y canónicas).

El uso de la tabla canónica cuando el servidor recibe el correo ya se explican otras respuestas.

Puede reescribir direcciones FROM cuando el correo se envía desde el servidor utilizando smtp_generic_maps.

De acuerdo con la documentación de postfix :

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

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

Entonces hazlo:

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

Referencias

Jocelyn
fuente
1
Esto funciona, pero ¿cómo puedo cambiar el nombre FROM?
Joanna Mikalai
Mi experiencia con los mapas genéricos es que identificará las direcciones FROM y TO, usará mapas canónicos para forzar solo la dirección FROM como solicitó el OP
doz87
¿Es posible cambiar el correo del remitente y hacer coincidir las direcciones de los remitentes utilizando regex?
WM
@ doz87, tanto FROM como TO se combinarán con mapas canónicos y genéricos. He actualizado mi respuesta para explicar la diferencia entre los dos mapas.
Jocelyn
@WM sí, puedes usar regexp. Nunca lo intenté, pero probablemente tendría que cambiar hash:a regexp:main.cf y usar líneas como /foo.*@localdomain.local/ [email protected]en el mapa genérico. Esto se explica en la página de manual
Jocelyn
7

Actualización: Siguiendo el consejo de un amigo de TI, estoy ejecutando postfix en todos mis servidores, en lugar de crear un servidor de correo en la nube. Aquí está mi solución hasta ahora:

/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

Cosas por las que estoy feliz:

  • Se envía una gran cantidad de correo a la raíz, y la única línea aliasindica quién lo recibe.
  • Todo el correo de los usuarios locales se traduce como proveniente de [email protected], por lo que pasa a través del servidor SMTP en línea de MS.
  • postfix tiene una documentación mucho mejor que sendmail.

Cosas por las que no estoy contento:

  • Se requieren cambios personalizados para cada host y varios pasos. Escribí un script bash para ayudar.
  • El passwdtruco del nombre no siempre funciona, y puede ser difícil determinar de qué servidor proviene un correo.
  • Cada correo enviado pone tres advertencias en el registro:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(El servidor SMTP envía una AUTHlista nula antes STARTTLS, pero AUTH LOGINdespués).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Hay algunas opciones de configuración en torno a los certificados, pero no estoy seguro si la entrega del correo se rompe cuando se renueva el certificado)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Igual que # 2)

Gracias a la comunidad serverfault por compartir opiniones sólidas sobre los servidores de correo.

John Whitlock
fuente
4

Puede usar smtpd_sender_login_maps para especificar una lista de mapas: dirección del remitente - usuario.

Ejemplo:

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

/ etc / postfix / login-map:

mail1@domain    userlogin
mail2@domain    userlogin, [email protected]

Funciona para enviar, debería funcionar para retransmitir de la misma manera.

seda
fuente
¿El propósito es reescribir la dirección de origen en el tiempo de espera? Mi impresión es que smtpd_sender_login_maps se usa para rechazar remitentes (como parte de smtpd_sender_restrictions), no para traducir inicios de sesión a direcciones de correo electrónico. Con esto en su lugar, echo "This is a test" | /usr/sbin/sendmail [email protected]todavía colas (y eventualmente relés) el correo como procedentes de[email protected]
John Whitlock
Mi mal, de alguna manera entendí que autorizaste a tu postfix. En tal caso, smtpd_sender_login_maps limitaría qué usuario puede usar qué dirección de remitente.
seda
Esto puede terminar siendo parte de mi solución final. Podría rechazar todas las direcciones de remitente menos una en el front-end, y notificar al administrador de correo sobre cualquier rechazo de front-end, para avisarme cuando un servicio aún no esté configurado correctamente. Estoy mirando smtp_generic_maps, para ver si puedo usarlos para modificar todas las cuentas locales a One True From Address. Pero, necesito volver a leer los documentos de postfix para comprender cómo determina las cuentas locales: AWS DNS no coincide con mi intuición.
John Whitlock
0

Utilizo el mapeo canónico para reescribir la dirección de origen, como reescribir root @ app01 a [email protected].

ZHANG Cheng
fuente
3
¡Bienvenido a Server Fault! Realmente preferimos que las respuestas contengan contenido, no punteros al contenido. Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
user9517 es compatible con GoFundMonica el