April 10, 2013

Postfix und LDAP Part 4 - saslauthd und SSL

saslauthd Installation und Konfiguration

Einleitung

Nach unserem letzten Artikel „Postfix konfigurieren“ widmen wir uns heute der Authentifizierung per saslauthd sowie der Absicherung des Transports per SSL. Der saslauthd Daemon wird eingesetzt, um unseren Benutzern die Anmeldung an unserem Postfix Server zu erlauben. Dies ist notwendig, da ein Mailversand zu externen Adressen ansonsten nicht möglich ist (vgl. offenes Mail-Relay). Wir werden saslauthd so einrichten, dass er unsere Benutzer gegen den openLDAP Server authentifiziert.

Installation

aptitude install sasl2-bin

Konfiguration

Konfiguration saslauthd

Erstellen Sie die Datei /etc/saslauthd.conf mit folgendem Inhalt

ldap_servers: ldap://127.0.0.1
ldap_version: 3
ldap_search_base: dc=testlab,dc=labs
ldap_scope: sub
ldap_filter: uid=%u
ldap_auth_method: bind

Falls Sie sich nicht mit der uid, sondern z.B. mit der Mailadresse authentifizieren wollen können sie im ldap_filter statt uid auch mail einsetzen.

Danach editieren Sie die Datei /etc/default/saslauthd. Folgende Attribute müssen dabei gesetz werden, beachten Sie dabei, dass Postfix in einem sogenannten chroot läuft und daher saslauthd entsprechend umgebogen werden muss um von Postfix angesprochen werden zu können.

MECHANISMS="ldap"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

Abschließend muss der Postfix User noch der sasl Gruppe zugeordnet werden:

usermod -a -G sasl postfix

Konfiguration Postfix

Erstellen Sie das Verzeichnis /etc/postfix/sasl und erstellen dort die Datei smtpd.conf mit folgendem Inhalt

pwcheck_method: saslauthd
mech_list: plain login

Beachten Sie, dass wir nur die Methoden PLAIN und LOGIN bereitstellen. Grund dafür ist, dass wir das Klartextpasswort brauchen um gegen den LDAP Server zu authentifizieren.

Keine Sorge, da wir später das STARTTLS Kommando einführen wird es nicht möglich sein das Passwort auf dem Weg vom Client zum Server abzufangen.

Erweitern Sie die main.cf um folgende Konfigurationseinstellungen

# TLS
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

# Restrictions
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_delay_reject = yes
smtpd_helo_restrictions         = permit_mynetworks,
                                  permit_sasl_authenticated,
                                  reject_invalid_hostname,
                                  reject_invalid_helo_hostname,
                                  reject_non_fqdn_helo_hostname

smtpd_sender_restrictions       = reject_non_fqdn_sender,
                                  reject_unknown_sender_domain,
                                  permit_mynetworks,
                                  permit_sasl_authenticated

smtpd_recipient_restrictions    = permit_mynetworks,
                                  permit_sasl_authenticated,
                                  reject_unlisted_sender,
                                  reject_unlisted_recipient,
                                  reject_unknown_sender_domain,
                                  reject_unknown_recipient_domain,
                                  reject_invalid_hostname,
                                  reject_unauth_destination,
                                  reject_non_fqdn_hostname,
                                  reject_non_fqdn_sender,
                                  reject_non_fqdn_recipient,
                                  permit

smtpd_client_restrictions       = permit_mynetworks,
                                  permit_sasl_authenticated,
                                  permit

Starten Sie beide Dienste neu

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

Testen der Authentifizierung

Um die Authentifizierung zu testen muss zunächst der Login String nach base64 enkodiert werden. Dies kann über folgendes Kommando erledigt werden (wir verwenden die Login Daten unseres Beispielbenutzers Max Mustermann aus dem Artikel zur Einrichtung des LDAP Servers)

perl -MMIME::Base64 -e 'print encode_base64("user1\0user1\0Test1234!");'

Der Befehl gibt uns im Beispiel als Ergebnis den String „dXNlcjEAdXNlcjEAVGVzdDEyMzQh“ zurück. Diesen verwenden wir zur Authentifizierung. Verbinden Sie sich per netcat mit dem Server und verwenden Sie statt dem helo Befehl am Anfang den erweiterten ehlo Befehl an, achten Sie auf die Ausgabe, welche die Zeile „250-AUTH PLAIN LOGIN“ enthalten sollte, und testen Sie danach die Authentifizierung mit dem Befehl
AUTH PLAIN dXNlcjEAdXNlcjEAVGVzdDEyMzQh„.

Die Ausgabe sollte der folgenden ähneln, fett geschriebene Zeilen sind dabei von Ihnen einzugeben, kursive Zeilen sind Antworten von Postfix:

nc localhost 25
220 mail.example.com ESMTP Postfix (Debian/GNU rulez!)
ehlo localhost
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth plain dXNlcjEAdXNlcjEAVGVzdDEyMzQh
235 2.7.0 Authentication successful
rset
250 2.0.0 Ok
quit
221 2.0.0 Bye

Die Authentifizierung funktioniert, allerdings bleibt der fade Beigeschmack, dass jeder, der auf dem Weg zwischen Client und Server Zugriff auf die Transportschicht hat, das Login mitschneiden und selbst verwenden kann. Sorgen wir also dafür, dass Postfix das STARTTLS Kommando versteht.

Postfix und SSL

Zur Verwendung des STARTTLS Kommandos benötigen Sie SSL Zertifikate. Diese erhalten Sie gegen Gebühr von einer der zahlreichen Zertifizierungsstellen. Alternativ können Sie auch selbst signierte Zertifikate in Postfix einsetzen.Wie sie diese Zertifikate erstellen können Sie im Artikel Am Anfang war das Zertifikat nachlesen.

Beachten Sie, dass bei selbst signierten Zertifikaten jeder Benutzer entweder das Zertifikat der CA oder aber das Zertifikat des Servers importieren müssen, da ansonsten bei jeder Verbindung eine entsprechende Warnung ausgegeben wird.

Erstellen Sie den Ordner ssl im Verzeichnis /etc/postfix und kopieren Sie das Zertifikat und den dazugehörenden Schlüssel dortin. Danach erweitern Sie die /etc/postfix/main.cf um folgenden Inhalt:

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/ssl/publicKEY.crt
smtpd_tls_key_file = /etc/postfix/ssl/privateKEY.key

Starten Sie Postfix neu

/etc/init.d/postfix reload

Testen Sie, ob die Konfiguration erfolgreich war. Verbinden Sie sich abermals per netcat mit dem Mailserver, setzen Sie das ehlo Kommando ab und achten Sie darauf, ob in der Ausgabe des Mailservers die Zeile

250-STARTTLS

erscheint. Gratulation, Postfix bietet nun Verschlüsselung bei der Verbindung an!

Ausblick

Dieser Artikel beschließt das Ende unserer Serie zum Thema Postfix und openLDAP. Weiterführende Tätigkeiten, zum Beispiel die Konfiguration eines IMAP Dienstes oder Webmailing, werden Thema künftiger Artikel sein.