Exim: ¿Puede haber varios autenticadores en la sección "Iniciar autenticadores", uno para cada retransmisión SMTP?

Exim: ¿Puede haber varios autenticadores en la sección "Iniciar autenticadores", uno para cada retransmisión SMTP?

Mi exim transmite todo el correo electrónico entrante a retransmisiones SMTP de terceros. Utilizan autenticación SMTP (nombre de usuario/contraseña).

Parece que solo puedo definir UN nombre de usuario/contraseña en la begin authenticatorssección de configuración de Exim. Quiero enrutar cierto correo electrónico a través de un relé (con su propia autenticación de nombre de usuario/contraseña) y otro correo electrónico a través de un segundo relé (su autenticación de nombre de usuario/contraseña es diferente al primero).

Aquí está gran parte de mi configuración. Los begin routersdominios de retransmisión en la +local_domainslista smtp-relay-1y el resto se retransmiten a 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

Lo que quiero es definir una autenticación de nombre de usuario/contraseña separada en la begin authenticatorssección y asignar cada una a un único enrutador/transporte. En este momento, la autenticación de nombre de usuario/contraseña es global y se utiliza para todos los relés.

La documentación de exim dice que coincide con public_name con una autenticación anunciada por el servidor. Entonces, si mis dos relés SMTP se anuncian como AUTH PLAINtal, ambos usan ese nombre de usuario/contraseña de autenticador en la configuración. Espero que haya una configuración que me permita vincular una instancia de autenticadores con un enrutador/transporte específico, pero no veo cómo.

Respuesta1

Puede utilizar la client_conditionopción de autenticador (cf.Sección Autenticación SMTPdel manual).

Exim acepta como máximo dos autenticadores para un nombre público determinado: como autenticador del lado del cliente y como autenticador del lado del servidor.

Sin embargo, la funcionalidad que busca ya se encuentra en la configuración predeterminada de Debian: descargue elconfiguración exim4empaquete y extraiga los archivos (es un ararchivo que contiene dos tararchivos).

El archivo /etc/exim4/conf.d/auth/30_exim4-config_examplescontiene autenticadores de cliente que:

  1. lea la contraseña del /etc/exim4/passwd.clientarchivo, por lo que la contraseña no está en la configuración de Exim. El formato del archivo es una línea por servidor en el <servername>:<username>:<password>formato,
  2. elija la contraseña según el host,
  3. están bien probados, por lo que no es necesario probar las expansiones de cadenas de Exim.

La configuración de Debian se reduce al siguiente 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

Respuesta2

En el mismo autenticador, puede utilizar la condición if para seleccionar el conjunto de nombre de usuario:contraseña para autenticar. Pero necesita la "condición" para elegir qué relé usar primero.

Por ejemplo, para enviar correo a[correo electrónico protegido]utilizará smtp-relay-1.example.com autenticado por mi nombre de usuario: contraseña ultrasecreta, y[correo electrónico protegido]utilizará smtp-relay-2.example.com autenticado por my-username2:top-secret-password2

Los enrutadores y transportes serán los mismos.

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 = *

Los autenticadores deben cambiar a algo como esto

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}}

información relacionada