35.2Postfix (MTA)

Dieser Abschnitt beschreibt die Installation und Konfiguration des MTAs Postfix unter Ubuntu. Postfix zählt momentan zu den populärsten MTAs und ist sehr gut dokumentiert – sowohl auf http://postfix.org als auch in unzähligen Artikeln und einigen Büchern.

Dennoch ist die Wahl von Postfix keineswegs selbstverständlich: Während es für manche Aufgaben nur ein weit verbreitetes Programm gibt, stellt die Open-Source-Welt gleich mehrere ausgezeichnete MTAs zur Auswahl. Ob Postfix oder Exim, Qmail oder Sendmail – alle genannten Programme sind weitverbreitet und erfüllen ihren Zweck. Wenn Sie mit Administratoren sprechen, wird vermutlich jeder den MTA empfehlen, den er selbst einsetzt und gut kennt. Einen fast zehn Jahre alten, aber dafür neutralen und gut fundierten Vergleich verschiedener MTAs finden Sie hier:

http://shearer.org/MTA_Comparison

Bevor Sie mir auf den nächsten Seiten durch diverse Konfigurationsdetails folgen, sollten einige Voraussetzungen erfüllt sein:

Firewall

Damit der Mail-Server aus dem Internet erreichbar ist, dürfen die Ports 25 und 587 nicht durch eine Firewall blockiert werden. Genau das ist unter CentOS, Fedora, RHEL und SUSE aber der Fall. Unter SUSE öffnen Sie die Ports am schnellsten mit YaST. Bei Red-Hat-ähnlichen Distributionen stellen Sie zuerst fest, welche Firewall-Zone für die Netzwerkschnittstelle zum Internet gilt, und öffnen die Ports dann mit firewall-cmd. Das Kommando für den Ports 465 ist optional. Port 465 ist für das mittlerweile als veraltet geltende Protokoll SMTPS vorgesehen.

root# firewall-cmd --get-zone-of-interface=eth0 (aktive Zone herausfinden) public root# firewall-cmd --permanent --zone=public --add-service=smtp root# firewall-cmd --permanent --zone=public --add-port=465/tcp (optional) root# firewall-cmd --permanent --zone=public --add-port=587/tcp root# firewall-cmd --reload

Hintergrundwissen und andere Strategien zur Firewall-Konfiguration sind in Kapitel 38, »Firewalls«, zusammengefasst.

Installation

Bei Debian und Ubuntu erscheint nach der Installation des postfix-Pakets ein Konfigurationsprogramm. Dort müssen Sie angeben, welche Art von Grundinstallation Sie wünschen. Auf einem Root-Server ist Internet Site die richtige Wahl: Sie wollen Postfix einsetzen, um auf dem Server E-Mails per SMTP zu versenden und zu empfangen.

Im nächsten Punkt müssen Sie den Namen des E-Mail-Servers angeben (standardmäßig einfach den Hostnamen des Rechners, also beispielsweise firma-abc.de). Dieser Name wird dazu verwendet, um E-Mail-Adressen ohne Domainnamen zu vervollständigen. Aus einer E-Mail an name wird also eine an name@firma-abc.de.

Bei den anderen Distributionen gibt es keine vordefinierten Konfigurationsvarianten. Die Standardkonfiguration sieht in der Regel so aus, dass Postfix nur E-Mails von lokalen Benutzern versenden kann. Alle weiteren Funktionen müssen Sie durch entsprechende Konfigurationseinstellungen explizit freischalten. Achten Sie insbesondere auf den Parameter inet_protocols! Er enthält oft localhost. Damit kommuniziert Postfix nur mit der lo-Schnittstelle. Die korrekte Einstellung lautet all; alternativ können Sie die gewünschten IP-Adressen oder -Adressbereiche aufzählen.

Nach dieser Minimalkonfiguration wird Postfix sofort gestartet. Das Programm erfüllt in der Grundkonfiguration die folgenden Funktionen:

Als ersten Test senden Sie von einem externen Account eine E-Mail an name@firma-abc.de, wobei name ein aktiver Linux-Account auf dem Root-Server ist. Die E-Mail sollte nach kurzer Zeit in /var/mail/name auftauchen. Wenn Sie sich als name anmelden, können Sie die E-Mail mit mutt lesen. Ebenfalls mit mutt testen Sie als Nächstes das Versenden einer E-Mail an Ihre externe E-Mail-Adresse. Sollten bei den beiden Tests Probleme auftreten, ist die wahrscheinlichste Fehlerursache eine falsche bzw. fehlende DNS-Konfiguration.

Konfiguration

Die grundlegenden Postfix-Konfigurationsdateien befinden sich in /etc/postfix. Innerhalb der Konfigurationsdateien können Sie bereits eingestellte Optionen wie Variablen verwenden – also option1 = wert1 und dann option2 = $option1. Anweisungen in der Konfigurationsdatei dürfen über mehrere Zeilen reichen, wobei der Text ab der zweiten Zeile eingerückt sein muss.

In den Konfigurationsdateien wird oft auf Tabellen oder Listen verwiesen, die in der englischen Dokumentation Lookup Tables oder Mappings heißen. Dabei gilt die Syntax option=type:name. Der gebräuchlichste Dateityp ist hash. In diesem Fall wertet Postfix die Datei name.db aus, d.h., es fügt dem angegebenen Dateinamen die Endung .db hinzu. *.db-Dateien sind Tabellen in einem binären Format (Berkeley Database, kurz BDB). Zur Manipulation solcher Dateien verwenden Sie das Kommando postmap.

Tabellen im Textformat sind aus Effizienzgründen nicht vorgesehen. Eine Ausnahme ist lediglich die Textdatei /etc/aliases, deren Format kompatibel zu Sendmail ist. Aber auch in diesem Fall greift Postfix auf die dazugehörende BDB-Datei aliases.db zurück. Deswegen muss aliases.db nach jeder Änderung an aliases durch das Kommando newaliases synchronisiert werden. Was Mail-Aliase sind und wie sie konfiguriert werden, wird einige Seiten weiter in Abschnitt 35.3, »Verwaltung der Postfix-Mail-Konten«, beschrieben.

Postfix kann aber auch mit externen Datenbanken (MySQL, PostgreSQL, LDAP) kommunizieren, sofern die entsprechenden Postfix-Erweiterungspakete installiert sind. Die in der Konfigurationsdatei genannte Datei enthält nun nicht die eigentlichen Daten, sondern die Verbindungsinformationen und eine (SQL-)Abfrage. Der Einsatz externer Datenbanken bietet sich vor allem dann an, wenn Sie sehr viele, also Hunderte oder Tausende von E-Mail-Accounts verwalten müssen.

virtual_mailbox_domains=mysql:/etc/postfix/mysql-virt-domains.cf

main.cf

Die wichtigste Konfigurationsdatei für Postfix ist /etc/postfix/main.cf. Das folgende Listing gibt die wichtigsten Zeilen dieser Datei in der Grundeinstellung (Typ Internet Site) wieder:

# Datei /etc/postfix/main.cf (auszugsweise) # so meldet sich Postfix bei anderen MTAs smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) # keine automatische Adressvervollständigung durch .firma-abc.de append_dot_mydomain = no # Hostname myhostname = firma-abc.de # Domain für lokale E-Mails ohne explizite Domain-Angabe # /etc/mailname enthält in der Beispielkonfiguration firma-abc.de myorigin = /etc/mailname # Ort der Alias-Datei alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # Versand neuer E-Mails nur vom lokalen Rechner zulassen mydestination = firma-abc.de, localhost mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # keine E-Mail-Weitergabe an andere Hosts (kein Relaying) relayhost = # E-Mail-Empfang über alle Netzwerkschnittstellen inet_interfaces = all # keine Beschränkung der E-Mail- und Postfach-Größe mailbox_size_limit = 0

Neben den im obigen Listing enthaltenen Schlüsselwörtern gibt es unzählige weitere, die in man 5 postconf dokumentiert sind. Für alle nicht explizit eingestellten Optionen gelten Defaulteinstellungen. Wie diese aussehen, verrät das Kommando postconf -d. Im Folgenden stelle ich Ihnen einige besonders wichtige Einstellungen kurz vor. Eine Beschreibung diverser weiterer Optionen folgt im weiteren Verlauf dieses Kapitels.

Postfix besteht aus einer Menge Einzelprogramme, von denen viele bei Bedarf jedes Mal neu gestartet und wenig später gleich wieder beendet werden. Diese Programme lesen die für sie relevanten Konfigurationsdateien jedes Mal neu ein.

Allerdings gibt es auch Postfix-Komponenten, die Konfigurationsänderungen nicht selbstständig bemerken. Postfix-Einsteiger, denen oft unklar ist, welche Änderungen Postfix selbstständig bemerkt, sollten nach Konfigurationsänderungen grundsätzlich service postfix reload ausführen. Das gilt insbesondere für Änderungen an master.cf und main.cf. Postfix-Profis werden reload dagegen wegen des damit verbundenen Geschwindigkeitsverlusts möglichst vermeiden, besonders bei großen aktiven Systemen.

Anstatt main.cf mit einem Editor zu ändern und anschließend ein reload-Kommando auszuführen, können Sie die Änderung auch mit postconf -e option=wert durchführen. Das Kommando postconf benachrichtigt dann auch gleich Postfix über die Änderung.

Postfix unterstützt zwar IPv6, standardmäßig ist aber nur IPv4 aktiv. Wenn Sie IPv6 nutzen möchten, sind in der Regel zwei Änderungen in main.cf erforderlich:

# in /etc/postfix/main.cf ... inet_protocols = all smtp_address_preference = any

Diese Änderungen werden erst nach einem Neustart von Postfix wirksam. Weitere Informationen zu den IPv6-Funktionen von Postfix können Sie hier nachlesen:

http://www.postfix.org/IPV6_README.html

Verschlüsselung (TLS/STARTTLS)

Postfix unterstützt das Protokoll Transport Layer Security (TLS) und das Verfahren STARTTLS zum Aufbau einer verschlüsselten Verbindung zwischen sich und dem Mail-Client, der eine E-Mail versenden möchte. Das setzt aber voraus, dass main.cf richtig konfiguriert ist und dass Sie für Ihren Rechner ein geeignetes Zertifikat haben. Grundlagenwissen zu »richtigen« und zu selbst erzeugten Zertifikaten können Sie in Abschnitt 33.4, »Verschlüsselte Verbindungen (HTTPS)« nachlesen. Weitere Informationen zur TLS-Unterstützung von Postfix finden Sie hier:

http://www.postfix.org/TLS_README.html

# in/etc/postfix/main.cf ... # nach Möglichkeit verschlüsseln smtpd_tls_security_level = may # Zertifikat smtpd_tls_cert_file = /etc/ssl/certs/my-cert.pem # Schlüssel smtpd_tls_key_file = /etc/ssl/private/my-key.key # Zertifikatskette zur Certification Authority # (entfällt bei selbst signierten Zertifikaten) smtpd_tls_CAfile = /etc/ssl/certs/ca-cert.pem

smtpd_tls_security_level = may bewirkt, dass Postfix STARTTLS anbietet und die Kommunikation nach Möglichkeit TLS-verschlüsselt durchführt. Bei einer falschen Konfiguration des Mail-Clients bzw. für alte Mail-Clients ist allerdings weiterhin eine Authentifizierung im Klartext möglich. Wenn Sie die Verschlüsselung erzwingen möchten, geben Sie anstelle von may die Zeichenkette encrypt an.

Zertifikatsfragen

Sofern es sich bei Ihrem Zertifikat nicht um ein Wildcard-Zertifikat handelt, das für alle Subdomains *.firma-abc.de gilt, stellt sich die Frage: Für welchen Domainnamen soll das von Postfix genutzte Zertifikat eigentlich gelten? Für firma-abc.de oder für mail.firma123.de (laut MX-Eintrag)? Laut

http://serverfault.com/questions/389413

ist ausschließlich der Client (z.B. Thunderbird) für die Verifizierung verantwortlich. Der Client wiederum vergleicht den Domainnamen des Zertifikats mit dem Hostnamen, den Sie bei der Client-Konfiguration des Mailkontos angeben. Der MX-Eintrag ist hierfür nicht relevant.

Standardmäßig stellt Thunderbird für die SMTP-Konfiguration dem Hostnamen smtp voran. Daraus ergibt sich beispielsweise smtp.firma-abc.de. Dann müsste auch das Zertifikat auf diesen Namen lauten. Wenn Sie das konsequent weiterführen, brauchen Sie für jedes Mail-Protokoll ein eigenes Zertifikat (pop.firma-abc.de, imap.firma-abc.de etc.). Derart viele Zertifikate können sich aber nur große Firmen bzw. E-Mail-Provider wie Google oder GMX leisten.

Für kleine Firmen oder private Server-Betreiber, bei denen Mail- und Webserver auf einem Rechner laufen, sieht die beste Lösung so aus: Sie verwenden sowohl für den Web- als auch für den Mail-Server ein Zertifikat für firma-abc.de (oder wie auch immer Ihr Hostname lautet). Bei der Konfiguration des E-Mail-Programms achten Sie darauf, dass Sie für SMTP, IMAP, POP etc. immer einfach firma-abc.de verwenden, nie xxx.firma-abc.de. Das erfordert ein wenig Mühe bzw. Schulungsarbeit bei der Mail-Client-Konfiguration, ist davon abgesehen aber eine sichere und saubere Lösung.

Unter Debian und Ubuntu wird bei der Postfix-Installation standardmäßig ein sogenanntes Snakeoil-Zertifikat samt Schlüssel eingerichtet, also ein selbst signiertes, für zehn Jahre gültiges Zertifikat. Die Parameter smtpd_tls_cert_file und -key_file in main.cf geben die Orte der Zertifikats- und Schlüsseldateien an:

# Datei /etc/postfix/main.cf ... smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key

Der Mail-Client wird bei der Konfiguration natürlich melden, dass das Zertifikat nicht vertrauenswürdig sei. Wenn Sie das Zertifikat dann dennoch akzeptieren, werden die Mails sicher verschlüsselt vom Mail-Programm zu Postfix übertragen, und Sie haben Ihr Ziel erreicht.

Alternativ können Sie mit den folgenden Kommandos selbst ein eigenes, für zehn Jahre gültiges Zertifikat erzeugen. Entscheidend ist, dass Sie bei der Ausführung von openssl als Common Name den Hostnamen Ihres Servers angeben, also z.B. firma-abc.de. Vergessen Sie chmod 600 für die Key-Datei nicht!

root# openssl req -new -x509 -days 3650 -nodes \ -out /etc/ssl/certs/postfix.pem \ -keyout /etc/ssl/private/postfix.key ... Common Name (eg server FQDN or YOUR name) []: firma-abc.de ... root# chmod 600 /etc/ssl/private/postfix.key

Anschließend verändern Sie main.cf wie folgt:

# Datei /etc/postfix/main.cf, selbst erzeugtes Zertifikat verwenden ... smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem smtpd_tls_key_file = /etc/ssl/private/postfix.key

Änderungen an der TLS-Konfiguration werden erst mit einem Neustart von Postfix wirksam:

root# service postfix restart

Beim Einrichten eines neuen Mail-Kontos in Ihrem Mail-Client wählen Sie die SMTP-Verschlüsselungsmethode STARTTLS aus (siehe auch Abbildung 35.3). Falls Sie ein selbst signiertes Zertifikat verwenden, müssen Sie dieses beim ersten Verbindungsaufbau durch den Mail-Client akzeptieren.

Postfix als lokaler E-Mail-Server

Einige Programme versenden Statusberichte oder Fehlermeldungen per E-Mail an root. Dazu zählen z.B. Logwatch, das RAID-System und SMART. Wenn auf dem Rechner – wie auf den vorangegangenen Seiten beschrieben – ein vollwertiger E-Mail-Server läuft, kümmert sich dieser um den Versand derartiger Benachrichtigungs-Mails. Sie sollten allerdings in /etc/aliases eine Zeile einfügen, die die an root gerichteten E-Mails an Ihren lokalen E-Mail-Account umleitet:

# in /etc/aliases root: username

Vergessen Sie nicht, dass Sie nach Änderungen an der aliases-Datei das Kommando newaliases ausführen müssen!

Der Empfang von lokalen E-Mails ist freilich auch dann wünschenswert, wenn auf dem Rechner kein vollwertiger E-Mail-Server installiert ist. Für solche Fälle sehen die Installations-Scripts von Postfix für Debian und Ubuntu die Konfigurationsvariante Nur lokal vor, die Sie unmittelbar nach der Installation auswählen. Wenn Sie die Postfix-Grundkonfiguration zu einem späteren Zeitpunkt nochmals wiederholen möchten, führen Sie unter Debian/Ubuntu dpkg-reconfigure postfix aus.

Die Konfigurationsvariante Nur lokal bewirkt, dass nur innerhalb des Servers E-Mails verarbeitet werden. Programme können also E-Mails an root oder an andere Benutzer versenden. Diese werden in den Postfächern /var/spool/mail/benutzername gespeichert und können z.B. mit Mutt gelesen werden (siehe Abschnitt 6.9, »Mutt«).

Postfix akzeptiert in dieser Konfiguration weder E-Mails von anderen Rechnern noch versendet es E-Mails an andere Rechner. Die resultierende Datei /etc/postfix/main.cf sieht wie folgt aus. Entscheidend ist die Zeile inet_interfaces = loopback-only, die den E-Mail-Empfang über reale Netzwerkschnittstellen von vornherein ausschließt.

# /etc/postfix/main.cf für eine lokale Konfiguration ... myhostname = michaels-computer alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = michaels-computer, localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = loopback-only default_transport = error relay_transport = error

Die Installation eines lokalen Postfix-Servers ist also trivial, ein Problem bleibt aber ungelöst: Wie kommen die lokalen E-Mails aus /var/spool/mail/username zum Administrator? Dieser muss sich ja in der Regel um mehrere Rechner kümmern und wird sich nicht ständig auf allen Rechnern einloggen, nur um nachzusehen, ob auf dem Rechner interessante lokale E-Mails zu finden sind.

An dieser Stelle wird es kompliziert: Der erste Schritt besteht darin, in /etc/aliases statt eines lokalen Benutzers die gewünschte Empfängeradresse für root-E-Mails anzugeben. Nach der Änderung führen Sie das Kommando newaliases aus.

# in /etc/aliases root: mein.name@anderer-host.de

Als Nächstes müssen Sie main.cf ändern, damit Postfix E-Mails auch weiterleitet. relayhost gibt an, an welchen Server nichtlokale E-Mails weitergeleitet werden. Achten Sie darauf, den Hostnamen in eckige Klammern zu setzen!

Die smtp-Optionen geben an, dass sich Postfix beim externen Server authentifizieren soll. Die Passwortinformationen befinden sich in der Datei sasl-passwd, wobei die dazugehörende Datenbank wie üblich nach jeder Änderung durch postmap aktualisiert werden muss.

Zu guter Letzt müssen die beiden Einstellungen für default_transport und relay_transport auskommentiert werden. Dabei handelt es sich um eine Vorsichtsmaßnahme der lokalen Konfigurationsvariante, die verhindert, dass Postfix zum Relaying verwendet werden kann:

# Änderungen in /etc/postfix/main.cf ... relayhost = [anderer-host.de] smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl-passwd smtp_always_send_ehlo = yes smtp_sasl_security_options = noanonymous # default_transport = error # relay_transport = error

Die Datei sasl-passwd hat den folgenden Aufbau:

# /etc/postfix/sasl-passwd anderer-host.de loginname:passwort

Viele E-Mail-Server werden den Empfang von E-Mails von Ihrem Server verweigern, weil die Absenderadresse der E-Mail nicht mit der Adresse des in sasl-passwd spezifizierten E-Mail-Accounts übereinstimmt. Um auch diese Hürde zu überwinden, die dem Schutz vor Spam dient, wird Postfix so konfiguriert, dass es die Absenderadresse root@... durch die E-Mail-Adresse Ihres Accounts ersetzt:

# noch eine Änderung in /etc/postfix/main.cf ... canonical_maps = hash:/etc/postfix/canonical

canonical muss nun den folgenden Eintrag enthalten. Vergessen Sie anschließend postmap /etc/postfix/canonical nicht!

# /etc/postfix/canonical root mein.name@andere-firma.de

Logging, Administration

Postfix protokolliert seine Tätigkeiten via Syslog. Wo die zahlreichen Meldungen landen, ist wie so oft distributionsabhängig:

Wenn Sie wissen möchten, welche E-Mails auf den Versand warten, führen Sie postqueue -p oder mailq aus. Die beiden Kommandos liefern eine Liste aller E-Mails, die – aus welchen Gründen auch immer – bisher nicht versandt werden konnten.