Exim: Pode haver vários autenticadores na seção "Iniciar Autenticadores", um para cada retransmissão SMTP?

Exim: Pode haver vários autenticadores na seção "Iniciar Autenticadores", um para cada retransmissão SMTP?

Meu exim retransmite todos os e-mails recebidos para retransmissões SMTP de terceiros. Eles usam autenticação smtp (nome de usuário/senha).

Parece que só posso definir UM nome de usuário/senha na begin authenticatorsseção de configuração do Exim. Quero rotear determinados e-mails por meio de um retransmissor (com seu próprio nome de usuário/senha de autenticação) e outro e-mail por meio de um segundo retransmissor (seu nome de usuário/senha de autenticação é diferente do primeiro).

Aqui está grande parte da minha configuração. Os begin routersdomínios de retransmissão na +local_domainslista para smtp-relay-1e os demais retransmitem para smtp-relay-2.

begin routers

my_domains_relay:
  debug_print = "R: my_domains_relay for $local_part@$domain"
  driver = manualroute
  domains = +local_domains
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-1.example.com:465"
  host_find_failed = defer
  no_more

smart_host_relay:
  debug_print = "R: smart_host_relay for $local_part@$domain"
  driver = manualroute
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-2.example.net:465"
  host_find_failed = defer
  no_more

begin transports

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  port = 465
  hosts_require_tls = *
  hosts_require_auth = *
  protocol = smtps

begin authenticators

login:
  driver = plaintext
  public_name = PLAIN
  client_send = ^my-username^top-secret-password

O que eu quero é definir autenticação de nome de usuário/senha separada na begin authenticatorsseção e atribuir cada um a um único roteador/transporte. No momento, o nome de usuário/senha de autenticação é global e usado para todos os relés.

A documentação do exim diz que corresponde ao public_name com uma autenticação anunciada pelo servidor. Portanto, se ambos os meus relés SMTP anunciam como AUTH PLAIN, ambos usam o nome de usuário/senha do autenticador na configuração. Espero que haja uma configuração que me permita vincular uma instância de autenticadores a um roteador/transporte específico, mas não vejo como.

Responder1

Você pode usar a client_conditionopção autenticador (cf.Seção Autenticação SMTPdo manual).

O Exim aceita no máximo dois autenticadores para um determinado nome público: como autenticador do lado do cliente e um autenticador do lado do servidor.

Porém a funcionalidade que você procura já está na configuração padrão do Debian: baixe oexim4-configempacote e extraia os arquivos (é um ararquivo contendo dois tararquivos).

O arquivo /etc/exim4/conf.d/auth/30_exim4-config_examplescontém autenticadores de cliente que:

  1. leia a senha do /etc/exim4/passwd.clientarquivo, então a senha não está na configuração do Exim. O formato do arquivo é uma linha por servidor no <servername>:<username>:<password>formato,
  2. escolha a senha de acordo com o host,
  3. são bem testados, então você não precisa testar as expansões de strings do Exim.

A configuração do Debian resume-se ao seguinte autenticador de cliente:

# this returns the matching line from passwd.client and doubles all ^
PASSWDLINE=${sg{\
                ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
                }\
                {\\N[\\^]\\N}\
                {^^}\
            }

plain:
  driver = plaintext
  public_name = PLAIN
.ifndef AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS
  client_send = "<; ${if !eq{$tls_out_cipher}{}\
                    {^${extract{1}{:}{PASSWDLINE}}\
                     ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}\
                   }fail}"
.else
  client_send = "<; ^${extract{1}{:}{PASSWDLINE}}\
                    ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"
.endif

Responder2

No mesmo autenticador, você pode usar if-condition para selecionar o conjunto de nome de usuário: senha para autenticar. Mas você precisa da “condição” para escolher qual relé será usado primeiro.

Por exemplo, para enviar correio para[e-mail protegido]usará smtp-relay-1.example.com autenticado por meu nome de usuário: senha secreta e[e-mail protegido]usará smtp-relay-2.example.com autenticado por my-username2:top-secret-password2

Os roteadores e transportes serão os mesmos

begin routers

my_domains_relay:
  debug_print = "R: my_domains_relay for $local_part@$domain"
  driver = manualroute
  domains = +local_domains
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-1.example.com:465"
  host_find_failed = defer
  no_more

smart_host_relay:
  debug_print = "R: smart_host_relay for $local_part@$domain"
  driver = manualroute
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-2.example.net:465"
  host_find_failed = defer
  no_more

begin transports

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  port = 465
  hosts_require_tls = *
  hosts_require_auth = *

Os autenticadores precisam mudar para algo assim

begin authenticators

login:
  driver = plaintext
  public_name = PLAIN
  client_send = ^${if   eq{$domain}{domain1.com}\
                        {my-username}\
                        {my-username2}}\
                ^${if   eq{$domain}{domain1.com}\
                        {top-secret-password}\
                        {top-secret-password2}}

informação relacionada