Exim: Können im Abschnitt „Begin Authenticators“ mehrere Authentifikatoren vorhanden sein, einer für jedes SMTP-Relay?

Exim: Können im Abschnitt „Begin Authenticators“ mehrere Authentifikatoren vorhanden sein, einer für jedes SMTP-Relay?

Mein Exim leitet alle eingehenden E-Mails an SMTP-Relays von Drittanbietern weiter. Diese verwenden SMTP-Authentifizierung (Benutzername/Passwort).

Es scheint, dass ich in diesem begin authenticatorsAbschnitt der Exim-Konfiguration nur EINEN Benutzernamen/ein Passwort definieren kann. Ich möchte bestimmte E-Mails über ein Relay (mit eigener Benutzername/Passwort-Authentifizierung) und andere E-Mails über ein zweites Relay (dessen Benutzername/Passwort-Authentifizierung sich von der des ersten unterscheidet) weiterleiten.

Hier ist ein Großteil meiner Konfiguration. Die begin routersDomänen in der +local_domainsListe werden an weitergeleitet smtp-relay-1und der Rest an 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

Ich möchte in diesem Abschnitt eine separate Authentifizierung mit Benutzername und Passwort definieren begin authenticatorsund jede einem einzelnen Router/Transport zuweisen. Derzeit ist die Authentifizierung mit Benutzername und Passwort global und wird für alle Relays verwendet.

In der Exim-Dokumentation heißt es, dass der öffentliche Name mit einer vom Server angekündigten Authentifizierung abgeglichen wird. Wenn also beide meiner SMTP-Relays dies ankündigen, AUTH PLAINverwenden sie beide in der Konfiguration diesen einen Benutzernamen/dieses Passwort des Authentifikators. Ich hoffe, es gibt eine Einstellung, mit der ich eine Instanz des Authentifikators mit einem bestimmten Router/Transport verknüpfen kann, aber ich weiß nicht, wie das geht.

Antwort1

Sie können dazu die client_conditionOption „Authenticator“ nutzen (vgl.Abschnitt SMTP-Authentifizierungdes Handbuchs).

Exim akzeptiert höchstens zwei Authentifikatoren für einen bestimmten öffentlichen Namen: einen clientseitigen und einen serverseitigen Authentifikator.

Die von Ihnen gesuchte Funktionalität ist jedoch bereits in der Standardkonfiguration von Debian enthalten: Laden Sie dieexim4-configVerpacken und extrahieren Sie die Dateien (es ist ein arArchiv, das zwei tarArchive enthält).

Die Datei /etc/exim4/conf.d/auth/30_exim4-config_examplesenthält Client-Authentifikatoren, die:

  1. das Passwort aus der Datei lesen /etc/exim4/passwd.client, so dass das Passwort nicht in der Konfiguration von Exim enthalten ist. Das Format der Datei ist eine Zeile pro Server im <servername>:<username>:<password>Format,
  2. Wählen Sie das Passwort entsprechend dem Host,
  3. sind gut getestet, sodass Sie die String-Erweiterungen von Exim nicht testen müssen.

Die Debian-Konfiguration läuft auf den folgenden Client-Authentifikator hinaus:

# 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

Antwort2

Im selben Authentifikator können Sie die if-Bedingung verwenden, um den Satz Benutzername:Passwort für die Authentifizierung auszuwählen. Sie benötigen jedoch die „Bedingung“, um auszuwählen, welches Relay zuerst verwendet werden soll.

Zum Beispiel für E-Mails an[email geschützt]verwendet smtp-relay-1.example.com, authentifiziert durch my-username:top-secret-password, und[email geschützt]verwendet smtp-relay-2.example.com, authentifiziert durch my-username2:top-secret-password2

Die Router und Transportmittel sind die gleichen

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

Die Authentifikatoren müssen in etwa wie folgt geändert werden

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

verwandte Informationen