Forçando o endereço from quando o postfix retransmitir sobre smtp

28

Estou tentando obter relatórios de email de nossas instâncias do AWS EC2. Estamos usando o Exchange Online (parte do Microsoft Online Services). Configurei uma conta de usuário especificamente para retransmissão SMTP e configurei o Postfix para atender a todos os requisitos para retransmitir mensagens através deste servidor. No entanto, o servidor SMTP do Exchange Online rejeitará as mensagens, a menos que o endereço De corresponda exatamente ao endereço de autenticação (a mensagem de erro é 550 5.7.1 Client does not have permissions to send as this sender).

Com uma configuração cuidadosa, posso configurar meus serviços para enviar como este usuário. Mas não sou muito fã de tomar cuidado - prefiro que o postfix force o problema. Existe uma maneira de fazer isso?

John Whitlock
fonte

Respostas:

38

É assim que realmente se faz no postfix.

Essa configuração altera os endereços do remetente do tráfego de email SMTP originado local e 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

Reescreva o endereço do envelope de e-mail originário do próprio servidor

/ etc / postfix / sender_canonical_maps:

/.+/    [email protected]

Reescrever do endereço no email retransmitido SMTP

/ etc / postfix / header_check:

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

Isso é muito útil se você estiver, por exemplo, usando um servidor smtp de retransmissão local, usado por todos os seus multifuncionais e vários aplicativos.

Se você usar o servidor SMTP do Office 365, qualquer email com um endereço de remetente diferente do email do próprio usuário autenticado será simplesmente negado. A configuração acima impede isso.

Jaspe
fonte
Obrigado! Parece o que eu estava procurando. Infelizmente, meu acesso ao Office 365 foi realizado há dois empregos. Alguém pode confirmar se isso funciona para eles?
John Whitlock 27/03
11
Eu posso. Estou usando isso com o office 365.
Jasper
11
Ao usar o sender_canonical_mapspostfix, não é possível salvar as mensagens rejeitadas no spool local e, em vez disso, tenta enviá-las através de retransmissão infinitamente
bacia
2
@ Jasper FYI Achei mais fácil alterar as linhas de configuração acima # 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
teve um problema semelhante, sender_canonical_classes = envelope_sender salvou meu dia!
23918 Stephan
13

A tabela genérica opcional especifica um mapeamento de endereço que se aplica quando o correio é entregue (enviado) do servidor.

É o oposto do mapeamento canônico , que se aplica quando o correio é recebido pelo servidor.

(Nota: os endereços FROM e TO são correspondidos para substituição em qualquer uma das tabelas genéricas e canônicas.)

O uso da tabela canônica quando o correio é recebido pelo servidor já está explicado. Outras respostas.

Você pode reescrever os endereços FROM quando o email é enviado do servidor usando smtp_generic_maps.

De acordo com a documentação do postfix :

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

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

Então faça:

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

Referências:

Jocelyn
fonte
11
Isso funciona, mas como também posso alterar o nome FROM?
Joanna Mikalai
Minha experiência com mapas genéricos é que ele vai identificar tanto do e endereços, a utilização de mapas canônicos para forçar apenas o endereço FROM como o OP pediu
doz87
É possível alterar o correio do remetente e combinar os endereços dos remetentes usando regex?
WM
@ doz87, FROM e TO serão correspondidos por mapas canônicos e genéricos. Atualizei minha resposta para explicar a diferença entre os dois mapas.
Jocelyn
@WM sim, você pode usar o regexp. Eu nunca tentei, mas você provavelmente teria que mudar hash:para regexp:no main.cf e usar linhas como /foo.*@localdomain.local/ [email protected]no mapa genérico. Isso é explicado na página de manual
Jocelyn
7

Atualização: por recomendação de um amigo de TI, estou executando o postfix em todos os meus servidores, em vez de criar um servidor de correio na nuvem. Aqui está a minha solução até agora:

/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

Coisas pelas quais estou feliz:

  • Muitas mensagens são enviadas para o root, e a única linha aliasindica quem as recebe.
  • Todas as mensagens de usuários locais são convertidas em provenientes [email protected], para serem enviadas pelo servidor SMTP do MS Online.
  • O postfix tem uma documentação muito melhor que o sendmail.

Coisas pelas quais não estou feliz:

  • Alterações personalizadas são necessárias para cada host e várias etapas. Eu escrevi um script bash para ajudar.
  • O passwdtruque de nomes nem sempre funciona e pode ser difícil descobrir de que servidor é proveniente um email.
  • Todo email enviado coloca três avisos no log:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(O servidor SMTP envia uma AUTHlista nula antes STARTTLS, mas AUTH LOGINdepois).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Existem algumas opções de configuração em torno de certificados, mas não tenho certeza se a entrega de correio é interrompida quando o certificado é renovado)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Igual ao nº 2)

Obrigado à comunidade serverfault por compartilhar opiniões fortes em servidores de correio.

John Whitlock
fonte
4

Você pode usar smtpd_sender_login_maps para especificar uma lista de mapas: endereço do remetente - usuário.

Exemplo:

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

/ etc / postfix / login-map:

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

Funciona para envio, deve funcionar para retransmitir da mesma maneira.

seda
fonte
O objetivo é reescrever o endereço de origem no tempo da fila? Minha impressão é que smtpd_sender_login_maps é usado para rejeitar remetentes (como parte de smtpd_sender_restrictions), não para converter logins em endereços de email. Com isso no lugar, echo "This is a test" | /usr/sbin/sendmail [email protected]ainda filas (e, eventualmente, relés) o e-mail como vindo de[email protected]
John Whitlock
Meu mal, de alguma forma, entendi que você autoriza o seu postfix. Nesse caso, smtpd_sender_login_maps limitaria qual usuário pode usar qual endereço de remetente.
seda
Isso pode acabar fazendo parte da minha solução final. Eu poderia rejeitar tudo, exceto o endereço do remetente no front-end, e notificar o postmaster sobre qualquer rejeição do front-end, para me informar quando um serviço ainda não estiver configurado corretamente. Estou vendo smtp_generic_maps, para ver se posso usá-los para modificar todas as contas locais para o Endereço Único Verdadeiro. No entanto, preciso reler os documentos do postfix para entender como ele determina as contas locais - o DNS da AWS não está de acordo com minha intuição.
precisa
0

Uso o mapeamento canônico para reescrever o endereço de origem, como reescrever root @ app01 para [email protected].

ZHANG Cheng
fonte
3
Bem-vindo à falha do servidor! Nós realmente preferimos que as respostas contenham conteúdo e não ponteiros para o conteúdo. Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
user9517 suporta GoFundMonica