April 10, 2013

Postfix und LDAP – Part 3: Postfix konfigurieren

Installation und Konfiguration von Postfix

Einleitung

Nach den Artikeln „Postfix und LDAP – Part 1: openLDAP konfigurieren“ und „Postfix und LDAP – Part 2: Struktur erstellen“ legen wir im diesem dritten Teil der Serie heute nun endlich Hand an den Postfix Mailserver und bringen ihm bei, künftig Mailversand, -annahme und -routing anhand der Informationen aus dem openLDAP Server zu beziehen.

Installation von Postfix

Zunächst installieren wir uns die notwendigen Pakete

aptitude install postfix postfix-ldap

Nun werden die initialen Einstellungen abgefragt. Bitte seien Sie sich vorab im Klaren, welche Art von Setup Sie verwenden möchten. Wahrscheinlich ist das Konfigurationstemplate „Internet Site“ genau was Sie möchten. Falls Sie jedoch beabsichtigen ausgehende Mails an einen sogenannten „Smarthost“ oder Relayhost zu senden müssen Sie „Internet mit Smarthost“ verwenden. In diesem Artikel wird von ersterem ausgegangen.

Bestätigen Sie danach den Hostnamen des Systems bzw. passen Sie ihn gemäß der Beschreibung dieses Feldes an.

Konfiguration der LDAP Anbindung

Modifikation der /etc/postfix/main.cf

Folgender Abschnitt muss in der main.cf erstellt werden. Einzelheiten zu diesen Optionen erfahren Sie im nächsten Abschnitt, der sich mit der Erstellung der angegebenen Dateien befasst, oder natürlich auf der ensprechenden MAN Page.

virtual_alias_maps = ldap:/etc/postfix/ldap/virtual_aliases.cf
virtual_mailbox_domains = ldap:/etc/postfix/ldap/virtual_domains.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap/virtual_mailboxes.cf
virtual_mailbox_base = /
virtual_uid_maps = ldap:/etc/postfix/ldap/virtual_uid.cf
virtual_gid_maps = ldap:/etc/postfix/ldap/virtual_gid.cf

# TRANSPORT
transport_maps = ldap:/etc/postfix/ldap/virtual_transport.cf
relay_domains = ldap:/etc/postfix/ldap/virtual_relay.cf

Erstellung der Konfigurationen für den LDAP Zugriff

Nun müssen die Dateien erstellt werden die letztlich die Konfiguration bzw. die Lookups beschreiben. Hierzu legen wir einen Ordner „ldap“ unter dem Standardkonfigurationsverzeichnis „/etc/postfix“ an.

/etc/postfix/ldap/virtual_aliases.cf
Beschreibung

Zuständig für Weiterleitungsadressen der Benutzer.
Zum Ablauf:

  • Sucht nach einem Eintrag, dessen Attribut mail oder mailAlternateAdress der Mailadresse entspricht, an die eine Mail gesendet wurde
  • Gibt den Wert des Attributs mailForwardingAddress zurück
    • Ist der Wert leer wird die Mail nicht weitergeleitet
    • Ist der Wert nicht leer wird die Mail entsprechend weitergeleitet
Inhalt der Datei
#virtual_aliases.cf
server_host = localhost
server_port = 389
search_base = dc=testlab,dc=local
query_filter = (|(mail=%s)(mailAlternateAddress=%s))
result_attribute = mailForwardingAddress
/etc/postfix/ldap/virtual_domains.cf
Beschreibung

Zuständig für den Lookup valider Domains, für die Postfix Mails annehmen soll.
Zum Ablauf:

  • Sucht unterhalb der ou Domains, ob es einen Eintrag gibt, dessen Attribut associatedDomain der Empfängerdomain entspricht
  • Gibt den Wert des Attributs zurück
    • Ist der Wert nicht leer akzeptiert Postfix Mails für diese Domäne
Inhalt der Datei
#virtual_domains.cf
server_host = localhost
server_port = 389
search_base = ou=Domains,dc=testlab,dc=local
query_filter = (associatedDomain=%s)
result_attribute = associatedDomain
/etc/postfix/ldap/virtual_mailboxes.cf
Beschreibung

Sucht den Maildir Pfad zu einer Mailadresse. Dies wird benötigt, falls Postfix lokale Mailboxen beliefern soll.
Zum Ablauf:

  • Sucht nach einem Eintrag, dessen Attribut mail oder mailAlternateAdress der Mailadresse entspricht, an die eine Mail gesendet wurde
  • Gibt den Wert des Attributs mailMessageStore zurück
    • Ist der Wert nicht leer
    • und wurde keine mailForwardingAddress gesetzt wird der Wert des Attributs als Pfad zum Maildir verwendet.

Inhalt der Datei

#virtual_mailboxes.cf
server_host = localhost
server_port = 389
search_base = dc=testlab,dc=local
query_filter = (|(mail=%s)(mailAlternateAddress=%s))
result_attribute = mailMessageStore
/etc/postfix/ldap/virtual_uid.cf
Beschreibung

Zuständig für den Lookup der UID zu einer Mailadresse. Da in unserem Setup stets die gleiche UID verwendet wird ist dieser Lookup eigentlich unnötig, ich möchte mir die Möglichkeit aber offen lassen ohne konfigurative Änderung am Postfix damit zu arbeiten.
Zum Ablauf:

  • Sucht nach einem Eintrag, dessen Attribute mail oder MailAlternateAddress mit der übergebenen Mailadresse übereinstimmt
  • Gibt den Wert des Attributs qmailUID zurück
Inhalt der Datei
#virtual_uid.cf
server_host = localhost
server_port = 389
search_base = dc=testlab,dc=local
query_filter = (|(mail=%s)(mailAlternateAddress=%s))
result_attribute = qmailUID
/etc/postfix/ldap/virtual_gid.cf
Beschreibung

Zuständig für den Lookup der GID zu einer Mailadresse. Da in unserem Setup stets die gleiche GID verwendet wird ist dieser Lookup eigentlich unnötig, ich möchte mir die Möglichkeit aber offen lassen ohne konfigurative Änderung am Postfix damit zu arbeiten.
Zum Ablauf:

  • Sucht nach einem Eintrag, dessen Attribute mail oder MailAlternateAddress mit der übergebenen Mailadresse übereinstimmt
  • Gibt den Wert des Attributs qmailGID zurück
Inhalt der Datei
#virtual_gid.cf
server_host = localhost
server_port = 389
search_base = dc=testlab,dc=local
query_filter = (|(mail=%s)(mailAlternateAddress=%s))
result_attribute = qmailGID
/etc/postfix/ldap/virtual_transport.cf
Beschreibung

Dieser Lookup wird verwendet um zu prüfen, ob Postfix Mails für eine bestimmte Domain an einen dedizierten Server senden soll. Dies ist z.B. in einem Multi-Domain Setup interessant, oder aber auch bei der Kommunikation von externen Adressen zu internen Adressen (als Beispiel sei ein Exchange Server genannt, der im Unternehmensnetz eine lokale Domäne bedient, aber nicht direkt ans Netz angeschlossen werden soll).
Zum Ablauf:

  • Sucht unterhalb der ou forwardDomains, ob es einen Eintrag gibt, dessen Attribut associatedDomain der Empfängerdomain entspricht
  • Gibt den Wert des Attributs destinationIndicator zurück
    • Ist der Wert nicht leer verwendet Postfix diese Information für sein Routing.
Inhalt der Datei
#virtual_transport
server_host = localhost
server_port = 389
search_base = ou=forwardDomains,dc=testlab,dc=local
query_filter = (associatedDomain=%s)
result_attribute = destinationIndicator
/etc/postfix/ldap/virtual_relay.cf
Beschreibung

Dieser Lookup unterscheidet sich geringfügig vom vorherigen Lookup und wird verwendet, um Postfix relaying für eine Domäne zu befehlen ohne eine feste Destination anzugeben. Postfix wird also entsprechend MX Lookups ausführen und die Mail dann relayen.
Zum Ablauf:

  • Sucht unterhalb der ou forwardDomains, ob es einen Eintrag gibt, dessen Attribut associatedDomain der Empfängerdomain entspricht
  • Gibt den Wert des Attributs associatedDomain zurück
Inhalt der Datei
#virtual_relay.cf
server_host = localhost
server_port = 389
search_base = ou=forwardDomains,dc=testlab,dc=local
query_filter = (associatedDomain=%s)
result_attribute = associatedDomain

Abschließende Tätigkeiten

Konfiguration prüfen und laden

Wurden alle Dateien angelegt muss Postfix neu gestartet bzw. dessen Konfiguration neu geladen werden.
Zunächst prüfen wir die Konfiguration auf syntaktische Fehler

/etc/init.d/postfix check

und falls keine Probleme gemeldet werden direkt noch ein

/etc/init.d/postfix reload

hinterher. Prüfen Sie auch den Inhalt der /var/log/syslog auf Postfix Fehlermeldungen. Wenn alles gut aussieht ist es Zeit die Zustellung zu testen.

Test der Mailfunktionalität

Zum Testen bietet es sich natürlich an eine Mail über den Server zu versenden. Zum Debugging können sie mit telnet oder netcat eine Verbindung zum Mailserver aufnehmen und die Kommandos manuell absetzen. Im Folgenden senden wir eine Mail an die Alternativadresse von Herrn Max Mustermann (vgl. Part 2) Die fett gedruckten Befehle müssen Sie eingeben, die kursiv gedruckten Meldungen sind Antworten von Postfix und können leicht von den abgedruckten Informationen abweichen.

nc localhost 25
220 mail.example.com ESMTP Postfix (Debian/GNU rulez!)
helo localhost
250 mail.example.com
mail from:<testmessage@gmail.com>
250 2.1.0 Ok
rcpt to:<postmaster@example.com>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From: testmessage@gmail.com
To: postmaster@example.com
Subject: Testmessage

Dies ist eine Testnachricht. Wenn alles funktioniert sollte diese zugestellt werden.
.
250 2.0.0 Ok: queued as 428828A0076
quit
221 2.0.0 Bye

Wenn alles geklappt hat sollte eine Mail versendet worden sein. In unserem Beispieldatensatz von Herrn Mustermann ist eine Weiterleitungsadresse angegeben, entsprechend sollte sich in dieser Mailbox eine Mail befinden. Ein Blick ins syslog kann weitere Informationen beinhalten

Apr 10 16:05:41 uvhsb30 postfix/smtp[21402]: 428828A0076: to=<eine.adresse@mailprovider.com>, orig_to=<postmaster@example.com>, relay=gmail-smtp-in.l.google.com[173.194.70.26]:25, delay=118, delays=117/0.01/0.1/0.36, dsn=2.0.0, status=sent (250 2.0.0 OK 1365602700 h2si144053eeg.57 - gsmtp)

Ausblick

Gratulation, Postfix empfängt nun Mails! In unserem nächsten Artikel beschäftigen wir uns mit Authentifizierung gegen den LDAP Server, um unseren Benutzern das Senden von Mails zu gestatten, sowie Zertifikaten und SSL, um die Kommunikation mit Postfix zu verschlüsseln. Dies können Sie im Artikel Postfix und LDAP Part 4 – saslauthd und SSL nachlesen.