[Howto] SASL mit Postfix via MySQL und saslauthd/rimap auf CentOS

| 4 Kommentare | Keine TrackBacks

tux.jpgUm Postfix als SMTP-Server für viele Nutzer anzubieten, muss er auf eine Nutzerdatenbank zurück greifen. Dieser Artikel zeigt am Beispiel der Groupware Zarafa, wie Postfix via saslauthd mit einer Nutzer-DB auf MySQL verknüpft wird.

Mit Hilfe von SASL können Nutzer sich gegen Postfix authentifizieren und E-Mails einliefern, damit dieser die weiter zustellt. Dies ist zum Beispiel interessant, wenn der Postfix als zentraler MTA für eine Firma oder größere Institution genutzt werden soll.

Die Schwierigkeit besteht darin, eine vorhandene Nutzerdatenbank einzubinden, hier die MySQL-DB der Groupware Zarafa. Häufig wird dabei auf PAM zurückgegriffen: Postfix authentifiziert gegen PAM, via PAM kann eine Vielzahl verschiedenster Plugins angebunden werden, um z.B. auch auf Datenbanken zurück zu greifen. Ein anderer Weg ist, saslauthd des Cyrus-Projekts zu nutzen, da dies ebenfalls auf verschiedene Plugins zurückgreifen kann.

Dafür muss im ersten Schritt Postfix in der main.cf für die Authentifizierung gegen SASL fit gemacht werden:

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_path = smtpd
smtpd_sender_restrictions = permit_sasl_authenticated, ...

saslauthd muss für unser Beispiel in der /etc/sysconfig/saslauthd außerdem auf rimap umgestellt werden:

SOCKETDIR=/var/run/saslauthd
MECH=rimap
FLAGS="-O localhost"

Es fehlt aber noch die eigentliche Konfiguration, in der unter Anderem auch die Syntax der MySQL-Abfrage definiert wird. Diese Konfiguration wird in der smtpd.conf definiert, die standardmäßig unter /usr/lib/sasl2/ erwartet wird. Erst wenn sie dort *nicht* vorliegt, wird sie unter /etc/sasl2/smtpd.conf erwartet. Warum dort nicht zuerst gesucht wird, entzieht sich meinem Verständnis. Es bietet sich also an, einen symbolischen Link auf die Datei unter /etc/ zu erstellen...
So oder so muss der Inhalt wie folgt aussehen:

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: zarafa
sql_passwd: $YOUR_DB_PWD
sql_database: zarafa
sql_select: SELECT DISTINCT `objectid` FROM `objectproperty` WHERE objectid = (SELECT `objectid` FROM `objectproperty` WHERE `propname` = 'loginname' AND `value` = '%u') AND `propname` = 'password' AND `value` = CONCAT(SUBSTR(`value`, 1, 8), MD5(CONCAT(SUBSTR(`value`, 1, 8), '%p')))

Dabei muss natürlich die Variable für das Passwort gegen das tatsächliche Passwort ersetzt werden. Zum Abschluss muss noch darauf geachtet werden, dass der Dienst saslauthd läuft, wenn er gebraucht wird. Sind alle Komponenten neu gestartet worden, können E-Mails von Nutzern eingeliefert werden, die sich via SASL gegen die MySQL-Datenbank von Zarafa authentifizieren.

Alle Artikel zum Thema CentOS stehen auch als eigene Kategorie mit eigenem Feed zur Verfügung. Falls Ihr tiefergehende Fragen zu Support und Services für Zarafa habt, oder euch Supportangebote für CentOS interessieren, seid ihr bei uns ebenfalls richtig.

Keine TrackBacks

TrackBack URL: http://blog.credativ.com/cgi-bin/mt-tb.cgi/166

4 Kommentare

Hi,

ich fürchte, da hat sich ein kleiner Fehler eingeschlichten. Du beschreibst hier zwar eine Authentifizierung, jedoch ist diese zunächst gegen den IMAP-Server (option rimap). Um die MySQL-Geschichte zu nutzen, müsste man bei PAM bleiben, da saslauthd sonst gegen den IMAP-Server authentifiziert. Beides ist als sicher zu betrachten, nur nützt die MySQL-Konfiguration im Falle der Einstellung rimap nicht viel. Liege ich da schief oder ist hier einfach nur ein Fehler unterlaufen?

Viele Grüße,
Uli

Hallo Uli,

danke für die Antwort. Ich verstehe aber nicht, wie du darauf kommst, dass dies im Endeffekt nicht gegen MySQL authentifiziert, obwohl doch sogar die SQL-Abfragen im Quelltext drin stehen. Klar, ich gehe den Weg über rimap, aber im Endeffekt werden die Ergebnisse aus der MySQL-DB geholt - und es funktioniert definitv, es läuft bei mir im produktiven Einsatz :-)

Hallo Roland,
natürlich laufen im Endeffekt MySQL-Querys gegen die Datenbank, aber rimap macht eine authentifizierung
gegen einen IMAP-Server, d.h. meldet sich ja dort an und entscheidet nach erfolgreicher Authentifizierung am IMAP-Server, dass der Client zugelassen wird. Dieser IMAP-Server authentifiziert natürlich gegen MySQL, jedoch nicht mit Hilfe der obigen Konfiguration, sondern mit Hilfe interner Mechanismen von Zarafa. Die obige Konfiguration der MySQL-Queries ist nur nötig, wenn man PAM nutzt. bei Nutzung von rimap benötigt man diese nicht :)

Viele Grüße,
Uli

Ok, ich werde es die Tage noch mal versuchen, auch wenn ich es gerade noch nicht so ganz glaube... ich wüsste z.B. bei der oberen Version nicht, woher sasl weiß, dass es den lokalen Server ansprechen soll, wenn es nicht den SQL-Server nimmt.

Aber wenn ich was dabei raus finde, ändere ich auch den Artikel :)

Kommentar hinterlassen