Mein perfektes Serversetup – Teil 3

Wir haben unsere Datenbank und die drei Tabellen erstellt, nun geht es darum, dass Postfix an die dort enthaltenen Informationen gelangt. Dazu erstellen wir entsprechende MySQL Mapping Konfigurationen. Da Postfix in einer chroot Umgebung arbeitet, nutzen wir dafür den erstellen mailserver_ro User.

Dafür erstellen wir unter /etc/postfix einen Ordner für die Konfigurationen:

mkdir /etc/postfix/sql.d
chown root:postfix /etc/postfix/sql.d

domains

Wir erstellen uns im Ordner sql.d eine Konfigurationsdatei domains.cf mit folgendem Inhalt:

user = mailserver_ro
password = ...
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 as FOUND FROM domains WHERE name='%s'

Wenn Postfix eine E-Mail für amara@chileo.ovh erhält, wird die Adresse zuerst zerlegt und die Domain (%s) kontrolliert. Wird ein entsprechender Eintrag gefunden, wird eine 1 zurückgegeben. Hierbei spielt es keine Rolle was zurückgegeben wird – hauptsache es gibt ein Ergebnis zurück.

accounts

Wir erstellen uns im Ordner sql.d eine Konfigurationsdatei accounts.cf mit folgendem Inhalt:

user = mailserver_ro
password = ...
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 as FOUND FROM accounts WHERE username = '%u' AND domain = '%d' AND enabled = TRUE LIMIT 1;

Wenn Postfix eine E-Mail von amara@chileo.ovh erhält, wird die E-Mailadresse in den Benutzerteil (%u) amara und den Domainteil (%d) chileo.ovh zerlegt. Wir nun in der accounts Tabelle ein entsprechender Eintrag gefunden, welcher auch aktiv (enabled = TRUE) ist, wird eine 1 zurückgegeben.

aliases

Wir erstellen uns im Ordner sql.d eine Konfigurationsdatei aliases.cf mit folgendem Inhalt:

user = mailserver_ro
password = ...
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM aliases WHERE CONCAT(source_username, '@', source_domain) = '%s';

Postfix kontrolliert ob für die Empfänger Adresse, z.B. amara@chileo.ovh zusätzliche Destinationen vorhanden sind. Würde z.B. als Ergebnis alice@chileo.ovh zurück gegeben werden, wird die E-Mail an diese Adresse weitergeleitet. In diesem Setup ist es auch möglich, dass eine externe Adresse verwendet wird, z.B. amara@icloud.com.

Optional: catch-all Adressen

Bevor wir catch-all Adresse ermöglichen hier die Warnung: catch-all Adressen sind potenziell böse. Sehr böse! Denn sobald eine catch-all Adresse existiert, wandert wirklich jeder Müll, egal wie stupide, an diese Adresse. Spambots welche wilkürlich Mails an Domains senden haben hier ein gefundenes Fressen.

Damit die catch-all Adresse funktioniert, muss diese wie folgt in der aliases Tabelle erfasst werden:

source_usernamesource_domaindestination
junkmail.ovhamara@chileo.ovh

Was aber, wenn wir dem User Bob auch eine Adresse bei junkmail.ovh machen wollen? Hier stehen wir vor dem Problem, dass Postfix immer zuerst den Parameter virtual_alias_maps vor virtual_mailbox_maps kontrolliert. Somit würde immer zuerst die catch-all Adresse greifen und Bob würde nie eine E-Mail erhalten. Dazu erstellen wir eine neue email2email.cf Konfiguration:

user = mailserver_ro
password = ...
hosts = 127.0.0.1
dbname = mailserver
query = SELECT * FROM (SELECT CONCAT(username, '@', domain) AS email FROM accounts) BASE WHERE email = '%s';

In diesem Fall erhält Postfix nebst der catch-all Adresse auch einen more-specific Eintrag für bob@junkmail.ovh.

Nun noch dafür schauen, dass die Dateien wirklich nur noch von Postfix gelesen werden können:

chown root:postfix /etc/postfix/sql.d/*.cf
chmod 740 /etc/postfix/sql.d/*.cf

Nun noch Postfix dazu anweisen, auch in diesen Dateien die entsprechenden Informationen zu suchen. Dazu fügen wir in der /etc/postfix/main.cf folgenden Block ein:

virtual_mailbox_domains = mysql:/etc/postfix/sql.d/domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql.d/accounts.cf
virtual_alias_maps = mysql:/etc/postfix/sql.d/aliases.cf,mysql:/etc/postfix/sql/email2email.cf

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.