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:
- Der Domänenname des Relays.
- Der Benutzername der Mailbox.
- 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, mailbox
das 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.