Was ist das richtige Format einer Postfix-Sasl-Kennwort-Datenbankzuordnungsdatei?

470
aphid

Es ist möglich, ein Postfix anzufordern, um Sasl-Anmeldeinformationen für seinen Relay-Server aus einer Datenbank abzurufen. Ich muss dann von diesem Relay-Server die gleichen Login-Informationen abrufen.

Wie formatieren wir diese Konfigurationsdatei, um sie ordnungsgemäß abzurufen?

Wir kennen diese Informationen:

  1. Der Domänenname des Relays.
  2. Der Benutzername der Mailbox.
  3. Der Domänenname auf dem Postfix-Server (möglicherweise gibt es mehrere).

Nun würde eine Klartextdatei, die nur die Passwörter enthält, wie folgt formatiert (pro Zeile), vorausgesetzt, mailboxdas Senden erfolgt domain2über das Passwort mailpass:

smtp.relay.tld mailbox@domain2.tld:mailpass 

Ich habe bestätigt, dass die Klartext-Dateimethode für einen bestimmten Benutzer und ein bestimmtes Kennwort in der Datenbank funktioniert. Jetzt möchte ich eine .cf-Datei für die Verbindung zur Datenbank verwenden.

Bei einer Domains-Tabelle wie folgt 1 :

+----+----------+-------------+----------+ | id | username | domain | password | +----+----------+-------------+----------+ | 1 | mailbox | domain2.tld | mailpass | +----+----------+-------------+----------+ 

Im Allgemeinen wäre eine solche Datei so formatiert.

user = sqluser password = dbpass hosts = localhost dbname = maildb query = SELECT password FROM accounts WHERE username = '%u' AND domain = '%d' 

Ich bin nicht sicher, was genau in den Parameter "Abfrage" eingefügt werden soll. Die offizielle Dokumentation dazu ist ziemlich schlecht: Sie besagt, dass Sie eine SQL-Datenbank konfigurieren können. Sie gibt nicht an, wie überhaupt, es werden keine konkreten Beispiele angegeben.

Jetzt versuchte ich es mit dem naiven Ansatz. Erstellen Sie eine Abfrage, die genau wie die Zeile in der Klartextdatei einen Wert zurückgibt. Ich habe auch versucht, verschiedene Teilmengen der Leitung zurückzugeben, ohne Erfolg. Jeder Versuch erzeugt nur einen Fehler "Zugriff verweigert".

1 : Mir ist bekannt, dass das Speichern der Kennwörter der tatsächlichen Benutzer in einer Datenbank auf diese Weise eine schlechte Idee ist . Die hier verwendeten Passwörter dienen lediglich der Kommunikation zwischen zwei bestimmten Servern.

Der Grund für die Verwendung einer Datenbank ist eine Kombination aus Portabilität und Skalierbarkeit. ZB wenn eine Domäne mehrere Mail-Server verwenden möchte oder zu einem anderen E-Mail-Anbieter wechseln möchte. Der Grund, nicht nur ein einzelnes Kennwort zu verwenden, ist die Möglichkeit, die Bedenken voneinander zu trennen (jeder Benutzer hat ein separates Relay-Kennwort konfiguriert, das er selbst nicht kennt. Der Postfix-Benutzer auf jedem Mail-Server weiß dies jedoch, indem er in einer bestimmten Datenbanktabelle nachschaut. Es ist ein Mechanismus, der mit dem Openstack-Keystone vergleichbar ist, allerdings weitaus weniger kompliziert.

Noch ein wenig mehr graben: Durch Aktivieren der Protokollierung auf L4-Ebene und Durchsuchen des Verbindungsprotokolls des Servers wird anscheinend nie eine AUTH-Nachricht gesendet (so dass nicht einmal herausgefunden wird, wie der Benutzer gefunden wird). Die folgenden Nachrichten befinden sich im Mail-Protokoll (mit Domänennamen usw.).

postfix/smtp[6494]: maps_find: smtp_sasl_password_maps: smtp.relay.tld: not found postfix/smtp[6494]: maps_find: smtp_sasl_password_maps: smtp.relay.tld:587: not found postfix/smtp[6494]: smtp_sasl_passwd_lookup: no auth info found  (sender=`user@domain.tld', host=`smtp.relay.tld') 

noch diesen Befehl ausführen:

postmap -q user@domain.tld mysql:/etc/postfix/mysql-map.cf 

produziert

smtp.relay.tld user@domain.tld:mailpass 

Mit anderen Worten, die Konfiguration funktioniert, aber das Postfix- Programm führt eine seltsame Abfrage aus, um das Kennwort aus der Datenbank zu entfernen. Es wird nirgends angegeben, was das eigentlich ist, und es wird auch nicht protokolliert.

0

2 Antworten auf die Frage

1
aphid

Zwei Dinge sind notwendig:

Zuerst muss die Option smtp_sender_dependent_authentication = yesin der Postfix-Hauptkonfigurationsdatei aktiviert werden (der übliche Speicherort ist /etc/postfix/main.cf). Ohne diese Option sucht der Server nur basierend auf dem Domänennamen des Relay-Hosts, der für jeden Benutzer gleich ist.

Zweitens sollte die korrekte Abfrage so aussehen:

query = SELECT CONCAT(username, "@", domain, ":", password) FROM accounts \ WHERE username = '%u' AND domain = '%d' 

Hinweis: Konfigurationsdateien unterstützen auf diese Weise keine Mehrfachzeilen. so entfernen Sie die \ und Newline

0
grawity

Ich habe hier nur eine wilde Vermutung (ich habe Postfix & SQL nicht gemischt), aber ich würde damit anfangen:

  1. Der "lokale Teil" der E-Mail-Adresse wird nicht automatisch zum "Benutzernamen" für die Relay-Authentifizierung. Auch wenn in Ihrer Datenbank beide identisch sind, kann Postfix diese Annahme nicht automatisch treffen. Daher muss das Feld "Benutzername" trotzdem zurückgegeben werden.

  2. Alle Postfix-Tabellen führen die Suche auf dieselbe Weise aus: Eine Eingabe führt zu einer Ausgabe, und der Postfix-Kern kümmert sich nicht wirklich darum, ob das jeweilige Tabellen-Backend mehrere Spalten unterstützt oder nicht. Ich denke, es erwartet eine einzige Zeichenfolge und parst sie in allen Fällen auf die gleiche Weise.

Wenn die Klartext-Tabelle gespeichert wird mailbox@domain2.tld:mailpass, sollte die SQL-Abfrage gemäß Punkt 2 wahrscheinlich auch eine einzelne Spalte zurückgeben, die auf dieselbe Weise formatiert ist. Also würde ich es versuchen:

query = SELECT CONCAT(username, ":", password) FROM accounts WHERE username = '%u' AND domain = '%d' 

Wenn das nicht stimmt, sollten zwei separate Spalten funktionieren:

query = SELECT username, password FROM accounts WHERE username = '%u' AND domain = '%d' 
Ich habe beide Varianten getestet. Beide führen zu "Erlaubnis verweigert". Die 2-Spalten-Version würde `mailbox @ domain2.tld` und` mailpass` auswählen. Eine einspaltige Version würde `mailbox@domain.tld: mailpass` auswählen. Keines der String-Formate ist anscheinend korrekt. (Obwohl es vielleicht das Nicht-Alphanumerische im eigentlichen Passwort ist, das das Problem ist?) aphid vor 5 Jahren 0
Haben Sie versucht, nachzusehen, welchen Benutzernamen / Passwort Postfix tatsächlich verwendet? (Hoffentlich ist das auf der höchsten Debug-Ebene verfügbar.) grawity vor 5 Jahren 0
Ich habe meinen Beitrag mit diesen Informationen aktualisiert. Leider ... Dies scheint selbst bei Stufe 4 nicht der Fall zu sein. Ich müsste den Quellcode durchsehen. aphid vor 5 Jahren 0