Принудительное указание адреса отправителя при ретрансляции Postfix через SMTP

Принудительное указание адреса отправителя при ретрансляции Postfix через SMTP

Я пытаюсь получать отчеты по электронной почте с наших экземпляров AWS EC2. Мы используем Exchange Online (часть Microsoft Online Services). Я настроил учетную запись пользователя специально дляРетрансляция SMTP, и я настроил Postfix для соответствия всем требованиям по ретрансляции сообщений через этот сервер. Однако сервер SMTP Exchange Online будет отклонять сообщения, если адрес From не будет точно соответствовать адресу аутентификации (сообщение об ошибке 550 5.7.1 Client does not have permissions to send as this sender).

При аккуратной настройке я могу настроить свои службы на отправку от имени этого пользователя. Но я не большой поклонник осторожности — я бы предпочел, чтобы postfix принудительно решал эту проблему. Есть ли способ сделать это?

решение1

Вот как это на самом деле делается в Postfix.

Эта конфигурация изменяет адреса отправителей как локального, так и ретранслируемого почтового трафика SMTP:

/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

Переписать адрес конверта из электронного письма, отправленного с самого сервера

/etc/postfix/sender_canonical_maps:

/.+/    [email protected]

Переписать с адреса в SMTP-ретранслируемом электронном письме

/etc/postfix/header_check:

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

Это очень полезно, если вы, например, используете локальный ретранслирующий SMTP-сервер, который используется всеми вашими многофункциональными устройствами и несколькими приложениями.

Если вы используете сервер Office 365 SMTP, любая почта с адресом отправителя, отличным от адреса электронной почты самого аутентифицированного пользователя, будет просто отклонена. Приведенная выше конфигурация предотвращает это.

решение2

НеобязательныйобщийВ таблице указано сопоставление адресов, которое применяется при доставке (отправке) почты с сервера.

Это противоположноканоническийсопоставление, которое применяется при получении почты сервером.

(Примечание: адреса ОТ и ДО сопоставляются для замены в любой из общих и канонических таблиц.)

Использование канонической таблицы при отправке почтыполучено серверомуже объяснено в других ответах.

Вы можете переписать адреса FROM, когда почтаотправлено с серверас использованием smtp_generic_maps.

В соответствии спостфиксная документация:

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

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

Затем сделайте следующее:

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

Использованная литература:

решение3

Обновление: По совету друга из IT-отдела я запускаю postfix на всех своих серверах, а не делаю один облачный почтовый сервер. Вот мое решение на данный момент:

/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

Что меня радует:

  • Множество писем отправляется на адрес root, и одна строка aliasуказывает, кто их получит.
  • Вся почта от локальных пользователей преобразуется в исходящую из [email protected], поэтому она проходит через SMTP-сервер MS Online.
  • postfix имеет гораздо лучшую документацию, чем sendmail.

Что меня не устраивает:

  • Для каждого хоста требуются индивидуальные изменения и несколько шагов. Я написал bash-скрипт, чтобы помочь.
  • Трюк passwdс именем не всегда срабатывает, и может быть сложно определить, с какого сервера пришло письмо.
  • Каждое отправленное письмо оставляет в журнале три предупреждения:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(SMTP-сервер отправляет пустой AUTHсписок до STARTTLS, но AUTH LOGINпосле).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate(Есть некоторые параметры конфигурации, связанные с сертификатами, но я не уверен, прерывается ли доставка почты при продлении сертификата)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted(То же, что и №2)

Спасибо сообществу serverfault за обмен содержательными мнениями о почтовых серверах.

решение4

Еще более простой ответ по сравнению с регулярным выражением (согласно ответу @Jasper) — использовать статический поиск:

sender_canonical_maps = static:[email protected]

staticвсегда возвращает одно и то же значение (https://www.postfix.org/DATABASE_README.html#types)

Связанный контент