Debian GNU/Linux lenny Mailserver Howto - postfix, policyd-weight, dovecot imapd/pop3d
Postfix, policyd-weight & dovecot imapd/pop3d Howto für Debian lenny 5.0
In diesem Howto wird Schritt für Schritt erklärt, wie man Postfix mit gesicherter Authentifizierung konfiguriert. Weiters wird auf die Konfiguration des dovecot imap/pop3 Daemons eingegangen. Zur Eindämmung der Spam-Flut wird policyd-weight verwendet.
Für weiterführende Informationen und detaillierte Erklärungen empfehle ich eines der Bücher.
Changelog
Inhaltsverzeichnis
1 Installieren aller benötigten Pakete
apt-get install postfix dovecot-imapd dovecot-pop3d policyd-weight
Falls entweder nur IMAP oder nur POP3 verwendet werden soll, dann die entsprechenden Pakete auswählen.
Bei der Installation werden zumindest beim dovecot-imapd bereits Zertifikate erstellt. Dazu ist es jedoch notwendig, dass der FQDN des Server bereits gesetzt ist. Falls nicht, ist das vorher zu erledigen (Datei /etc/hosts).
2 Konfiguration der einzelnen Dienste
2.1 Konfiguration von Postfix
In diesem Abschnitt widmen wir uns der Konfiguration von Postfix. Die nachfolgende Konfiguration verlangt, dass pro e-mail Adresse ein eigener Benutzeraccount am System existiert (mit adduser benutzername wird ein Systembenutzer hinzugefügt, weitere Details siehe man adduser).
Erstellt man nun mit obigem Befehl einen Benutzer 'hans', so kann man diesem Benutzer eine e-mail schicken, und zwar mit der Adresse hans@domain.com. Weiters ist es auch möglich Aliases anzugeben, also in der Art hans.maier@domain.com. E-mails an einen Alias werden an den gemappten Systembenutzer zugestellt.
Auch für die virtuellen Domains bzw. deren e-mail Adressen müssen die entsprechenden Benutzeraccounts vorhanden sein. Auf sogenannte 'virtuelle Accounts' wird in diesem Howto (noch) nicht eingegangen.
Das Mapping der e-mail Adressen auf die jeweiligen Benutzeraccounts wird in Punkt 2.1.1 (Datei /etc/aliases) erläutert.
2.1.1 Allgemeine Konfiguration
Postfix hat zwei Konfigurationsdateien:
main.cf und master.cf
In der master.cf ist definiert, ob Postfix in einem chroot läuft oder nicht.
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - y - 9 smtpd
Falls an der fünften Stelle ein y oder ein - steht, dann läuft Postfix in einem chroot. In der Regel ist das bei der Standardinstallation der Fall.
Die main.cf beinhaltet die für uns relevanten Anweiungen, die master.cf beinhaltet Details der jeweiligen Prozesse (master, qmgr, ...) und braucht nicht geändert zu werden. Das Format der main.cf immer anweisung = wert, wobei mehrere Werte angegeben werden können und diese entweder durch ein Komma oder ein Leerzeichen zu trennen sind.
Es sind bereits einige Anweisungen in der Standardkonfiguration enthalten, welche möglicherweise mit nachfolgenden Anweisungen nicht zusammenpassen. Im speziellen meine ich die Anweisung mailbox_command = procmail -a "$EXTENSION", denn damit werden eingehende e-mails nicht im Home Verzeichnis des Benutzers gespeichert sondern in /var/mail/. Falls solche oder ähnliche Probleme auftreten bitte die entsprechenden Anweisungen in der Standardkonfiguration löschen. Falls procmail doch für die Mailzustellung verwendet werden soll, dann muss das mailbox_command wiefolgt gesetzt werden: mailbox_command = procmail -a "$EXTENSION" DEFAULT=$HOME/mails/
Nun zu den Anweisungen der main.cf
Alle nachfolgenden Anweisungen bis exklusive die von Punkt 2.2 sind in die Datei main.cf einzutragen.
myhostname = host.example.com
Diese Anweisung ist die wohl wichtigste. Mit ihr wird der Name des Mailservers angegeben, ohne diese Anweisung startet Postfix nicht. Hierbei ist zu beachten, dass ein FQDN anzugeben ist.
mydomain = example.com
Dieser Parameter muss nicht unbedingt angegeben werden, da Postfix den Domainnamen aus dem Hostnamen ausliest (alles nach dem ersten Punkt des Hostnamens entspricht dem Domainnamen).
alias_maps = hash:/etc/aliases
In dieser Anweisung wird der Name der Datei angegeben, in welcher die e-mail Adressen zu Benutzeraccounts gemapped werden, also die Aliases, wie schon am Beginn erwähnt.
Für jede e-mail Adresse muss ein Systembenutzer existieren. Das Angeben der Domain entfällt, da in dieser Datei nur Aliases für die primäre Domain angegeben werden können. Der Inhalt der Datei könnte z. B. wiefolgt aussehen:
hans.maier: hans root: hugo webmaster: hugo, hans
Wichtig ist, nach dem Eintragen der Benutzer ein postalias /etc/aliases auszuführen, damit die Datenbank der Benutzer aktualisiert wird.
alias_database = hash:/etc/aliases
Gibt den Namen der Datenbank der Aliases an.
myorigin = /etc/mailname
Damit wird der Name der Datei, welche den Domainnamen beinhaltet, angegeben, welcher an die Envelope oder Header Adresse angehängt wird, falls dieser nicht engegeben ist.
mydestination = $myhostname, localhost.$mydomain, $mydomain
Dieser Parameter listet alle Domains, für welche Postfix e-mails empfangen soll. Falls mehrere Domains gehostet werden, werden diese dem Parameter virtual_alias_domains mitgegeben, dazu jedoch später.
smtpd_banner = $myhostname ESMTP Mailserver
Das Setzen des Identifizierungsstrings erfolgt mit dem Parameter smtpd_banner. Dieser sollte aus Sicherheitsgründen weder den Namen des verwendeten SMTP Servers (in unserem Fall Postfix) noch die Version enthalten.
mailbox_size_limit = 11240000
Mit diesem Parameter wird die Größe der Mailbox in Bytes angegeben. (10.72 MB)
message_size_limit = 10240000
Damit wird die max. Größe einer e-mail festgelegt. E-mails mit Anhang werden in der Regel ca. um ein Drittel größer, da der Anhang noch konvertiert werden muss.
smtpd_helo_required = yes
Hiermit muss ein Client bei der Kommunikation mit unserem Mailserver zuerst ein HELO oder EHLO Kommando absetzen und sich damit identifizieren.
smtpd_helo_restrictions = reject_invalid_hostname
Diese Anweisung verbietet einen ungültigen Hostnamen (falsche Syntax) beim HELO bzw. EHLO Kommando mitzugeben
smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, permit_sasl_authenticated, reject_unauth_destination
Hiermit werden Restriktionen festgelegt, welche der Client im RCPT TO Kommando einhalten muss.
permit_mynetworks: erlaubt Mail relaying (das Versenden von e-mails an Adressen welche nicht auf unserem Mailserver verwaltet werden) von allen Netzwerken welche in $mynetworks eingetragen sind (in unserem Fall nur das lokale Loopback Netzwerk 127.0.0.0/8)
reject_unknown_recipient_domain: Erlaubt nur Domains mit gültigem A Record oder MX Record der Empfängerdomain.
permit_sasl_authenticated: erlaubt Mail relaying von allen Clients welche sich über den dovecot SASL authentifiziert haben.
reject_unauth_destination: Verwirft den Request außer wenn eine der folgenden Bedingungen erfüllt ist:
- Die Domain ist unter $relay_domains gelistet oder eine Subdomain davon
- Unser Mailserver verwaltet die Domain(s) welche im RCPT TO Kommando angegeben sind, sprich unser Mailserver ist das endgültige Ziel der ankommenden e-mail
smtpd_sender_restrictions = reject_unknown_address
Hiermit werden Restriktionen festgelegt, welche der Client im MAIL FROM Kommando einhalten muss.
reject_unknown_adress: Erlaubt nur Domains mit gültigem A oder MX Record.
smtpd_client_restrictions = reject_invalid_hostname
Hiermit werden Restriktionen festgelegt, von welchen Clients SMTP Verbindungen akzeptiert werden.
reject_invalid_hostname: Erlaubt nur gültige Hostnamen (siehe smtpd_helo_restrictions)
strict_rfc821_envelopes = yes
Mit dieser Anweisung müssen e-mail Adressen im RFC 821 konformen Format (mit < und >, z. B. <mail@example.com>) angegeben werden.
home_mailbox = mails/
Hiermit wird im Homeverzeichnis des Benutzers ein Verzeichnis mails erstellt, welche die e-mails im Maildir Format speichert. Dieses Format ist gegenüber dem älteren mbox Format vorzuziehen, da einige IMAP Daemons nur das Maildir Format lesen können.
local_recipient_maps = luser_relay = hugo
Optional! Mit dieser Anweisung wird ein catch-all Account aktiviert, welche alle Mails empfängt, welche einen nicht-existenten Alias (der Teil vor dem Klammenaffen und der Domain) enthalten. Hiermit werden alle Mails an die Domain example.com, für die kein Alias vorhanden ist, an den Benutzer hugo zugestellt. Achtung: Die Verwendung des catch-all Accounts erhöht in der Regel die Anzahl der empfangenen Spam-Mails.
2.1.2 TLS
Details zu TLS (Transport Layer Security)
smtpd_tls_cert_file = /etc/postfix/mail.cert
Gibt den Pfad des TLS Zertifikates an.
smtpd_tls_key_file = /etc/postfix/mail.key
Gibt den Pfad des private keys an.
Erstellt werden obige zwei Dateien wiefolgt:
openssl genrsa -out mail.key 2048
Hiermit wird ein privater RSA Schlüssel mit 2048 Bit Länge erstellt.
openssl req -new -key mail.key -out mail.csr
Hiermit wird ein CSR (Certificate Signing Request) erstellt. Das CSR ist im Prinzip der public key versehen mit zusätzlichen Informationen. Wichtig ist, dass bei der Frage nach dem Common Name (CN) der vollständige Hostname eingetragen wird (z. B. mail.example.com oder example.com). Denn wenn sich ein Client zum Host example.com verbindet und beim Common Name aber nur example eingegeben wurde, bekommt der Client eine Warnung, dass der Name des Hosts nicht mit dem des Common Name übereinstimmt.
openssl x509 -req -days 4312 -in mail.csr -out mail.cert -signkey mail.key
Erstellen eines selbst-signierten Zertifikates mit einer Gültigkeit von 4312 Tagen.
smtpd_use_tls = yes
Aktivieren von TLS.
smtpd_enforce_tls = no
Damit wird die zwangsweise Verwendung von TLS unterbunden. Viele Mailserver kommunizieren nicht via TLS mit anderen Mailservern, in diesem Fall mit unserem Mailserver.
smtpd_tls_auth_only = yes
Mit dieser Anweisung werden nur Clients authentifiziert, welche eine TLS gesicherte Verbindung zu unserem Mailserver aufbauen. Andere Clients, die keine TLS-gesicherte Verbindung aufbauen, können somit keine e-mails über unseren Server versenden, sprich unseren Mailserver als Relay verwenden.
2.1.3 SASL (Simple Authentication and Security Layer)
SASL dient zur Authentifizierung eines Clients, damit dieser e-mails versenden kann. In unserem Fall werden die Daten verschlüsselt übertragen. Erwähnenswert ist, dass die Authentifizierung erst nach Aufbau einer verschlüsselten Verbindung stattfindet.
smtpd_sasl_auth_enable = yes
Damit wird SASL für den SMTP Daemon aktiviert.
smtpd_sasl_type = dovecot
Postfix verwendet dovecot SASL zur Authentifizierung.
smtpd_sasl_path = private/auth
Dieser Pfad relativ zum $queue_directory gibt den Socket an, bei dem der dovecot SASL Verbindungen akzeptiert.
smtpd_sasl_security_options = noanonymous
Mit dieser Anweisung wird der anonymous login deaktiviert.
smtpd_sasl_local_domain =
Hier keine Domain angeben, ansonsten muss der Benutzer beim Login den Domainnamen an den Benutzernamen anhängen.
smtp_sasl_auth_enable = no
Damit aktiviert man SASL nur für den SMTP Daemon, nicht für den SMTP Client.
broken_sasl_auth_clients = yes
Diese Zeile dient dazu, um Clients, welche sich nicht an den RFC 2554 halten, trotzdem zu authentifizieren (z. B. Outlook Express 4, Exchange 5.0).
2.1.4 Virtual Domains
In diesem Abschnitt beschäftigen wir uns mit virtuellen Domains, sprich das Hosten mehrerer Domains auf einem Server. Ich habe mich entschieden, für jeden virtuellen Benutzer einen eigenen Systemaccount anzulegen, da dies zumindest bei wenigen Benutzern die einfachste und übersichtlichste Methode ist.
virtual_alias_domains = newdomain.com
In dieser Anweisung wird die Liste der virtuellen Domains angegeben. Zusätzliche Domains werden durch ein Komma getrennt angegeben.
virtual_alias_maps = hash:/etc/postfix/virtual_domains
Die Datei virtual_domains beinhaltet das Mapping der e-mail Adressen auf existierende Benutzeraccounts. Der Inhalt schaut z. B. wiefolgt aus:
hugo@newdomain.com hugo hansi@newdomain.com hansi
Wichtig ist, nach dem Eintragen der Benutzer ein postmap /etc/postfix/virtual_domains auszuführen, damit die Datenbank der virtuellen Benutzer aktualisiert wird.
virtual_mailbox_limit = 10240000
Damit können wir die Größe (in Byte) der Mailbox für virtuelle Domains beschränken.
2.2 Konfiguration von dovecot
2.2.1 Allgemeines
Die Konfiguration des dovecot imapd/pop3d gestaltet sich recht einfach, da es nur wenige wichtige Anweisungen gibt und die Konfigurationsdatei sehr gut dokumentiert ist. Deswegen werde ich in diesem Abschnitt nur auf die wichtigsten Anweisungen eingehen. Weitere Details zu der Konfiguration sind auf der dovecot Website zu finden.
2.2.2 Konfigurationsdetails
Die Konfigurationsdatei für den dovecot Daemon ist /etc/dovecot/dovecot.conf
protocols = imap pop3
Falls der IMAP Daemon verwenden werden soll, sind die entsprechenden Anweisung aufzuführen. Selbiges bei POP3. IMAP verwendet Port 143, POP3 110.
Aufgrund der Verschlüsselung würde ich ausschließlich die secure Varianten der jeweiligen Protokolle verwenden, also imaps und pop3s.
ssl_cert_file = /etc/ssl/certs/dovecot.pem ssl_key_file = /etc/ssl/private/dovecot.pem
In diesen beiden Anweisungen wird das Zertifikat bzw. das Keyfile angegeben. Wie schon in Punkt 1 erwähnt, erstellt dovecot automatisch ein Zertifikat bei der Erstinstallation. In der Regel müssen diese Anweisungen nicht geändert werden. Es ist jedoch möglich, ein neues Zertifikat zu erstellen (z. B. mit längerer Gültigkeitsdauer). Dies geschieht mit den selben openssl Anweisungen wie in Punkt 2.1.2. Man beachte wieder beim Common Name den vollständigen Hostnamen anzugeben, damit der MailClient (Thunderbird, Outlook) keine Warnung ausgibt.
Alternativ kann auch das selbe Zertifikat wie bei postfix angegeben werden. Somit ist nur ein Zertifikat erforderlich.
disable_plaintext_auth = yes
Hiermit wird ein Login Versuch, der über eine unsichere, nicht verschlüsselte Verbindung stattfindet, nicht akzeptiert. Der Client darf sich nur dann einloggen, wenn dieser eine verschlüsselte Verbindung zum Server aufgebaut hat.
Die Sektionen im Konfigurationsfile den Login Vorgang betreffend müssen nicht geändert werden.
mail_location = maildir:%h/mails
Hiermit wird dem dovecot Daemon mitgeteilt, in welchem Verzeichnis sich die e-mails befinden. Da wir in Punkt 2.1.1 festgelegt haben, dass sich das Mailverzeichnis im Homeverzeichnis des jeweiligen Users befindet, tragen wir hier auch den selben Pfad ein. %h ist der Pfad des Homeverzeichnisses des jeweiligen Users. maildir gibt an, dass das Maildir Format verwendet wird.
auth default { mechanisms = plain userdb passwd { } passdb shadow { } user = root socket listen { client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } }
Mit mechanisms = plain wird der Authentifizierunsmechanismus festgelegt. Wir verwenden plain text login, da ja eine verschlüsselte Verbindung aufgebaut wird und somit das Passwort auch verschlüsselt wird.
userdb passwd {} legt die Datenbank fest, in der die vorhandenen Benutzer sind. passdb shadow {} gibt /etc/shadow als Datei an, in der die Benutzerpasswörter gespeichert sind. Da wir wie bei Postfix Systembenutzer voraussetzen, wird auch hier wieder gegen die Datei /etc/passwd bzw. /etc/shadow verifiziert.
Bei user = root muss der User root angegeben werden, da nur dieser Zugriff auf die vorher erwähnten Dateien hat.
Mit der socket listen Anweisung wird der dovecot SASL Socket konfiguriert. Postfix verwendet dovecot SASL, um Benutzer zu authentifizieren, damit diese e-mails verschicken können. Es ist darauf zu achten, dass der Teil nach /var/spool/postfix, in diesem Fall private/auth mit dem Wert der Anweisung smtpd_sasl_path von Punkt 2.1.3 übereinstimmt.
2.3 Konfiguration von policyd-weight
policyd-weight dient zur Überprüfung von Clients, ob diese in sogenannten Blacklists vorhanden sind. policyd-weight ist ein Daemon, der von postfix aufgerufen wird. Postfix führt je nach Score der überprüften e-mail Aktionen durch, z. B. wird die e-mail abgewiesen (reject) oder durchgelassen. Dadurch werden viele Spam e-mails abgewiesen, bevor diese durch einen Filter laufen (z. B. amavis oder spamassassin)
2.3.1 Konfigurationsdetails
policyd-weight bietet eine Standardkonfiguration an, die mit policyd-weight defaults > /etc/policyd-weight.conf erstellt werden kann. Die meisten Anweisungen in /etc/policyd-weight.conf müssen nicht verändert werden, ich möchte jedoch auf zwei davon näher eingehen.
$MAXDNSBLHITS = 2;
Wird eine Client IP öfters als zweimal in einer Blacklist gefunden, wird diese e-mail abgewiesen. Da es jedoch vorkommen kann, dass auf den Backlisten auch falsche Einträge existieren, sollte dieser Wert erhöht werden, z. B. auf 3 oder 4.
$MAXDNSBLSCORE = 8;
Jede e-mail wird mit einem Score versehen, der sich unter anderem aus der Anzahl der Blacklisten zusammensetzt, in denen eine Client IP gefunden worden ist. Falls e-mails einen Score > 8 haben, werden diese abgewiesen. Auch hier sollte der Wert erhöht werden, z. B. auf 16.
check_policy_service inet:127.0.0.1:12525
Diese Anweisung muss in die Konfigurationsdatei von postfix (/etc/postfix/main.cf) eingetragen werden, damit postfix den policyd-weight zur Überprüfung von e-mails verwendet. Die Anweisung muss als letzte in smtpd_recipient_restrictions eingetragen werden.
3 Starten der Dienste
policyd-weight wird via /etc/init.d/policyd-weight restart (neu)gestartet. Falls Postfix noch nicht läuft, wird dieser mit /etc/init.d/postfix start gestartet, ansonsten ist ein /etc/init.d/postfix reload notwendig. Der dovecot-imapd wird ebenfalls mit /etc/init.d/dovecot start gestartet. Da debconf normalerweise die Dienste sofort nach dem Installieren startet, kann es nötig sein, alle drei Dienste mit dem restart Parameter neu zu starten.
4 Testen der Konfiguration
4.1 Postfix
Mittels telnet zum Mailserver auf Port 25 verbinden:
telnet example.com 25
Erscheint als Antwort 220 example.com ESMTP Mailserver so läuft Postfix. Um zu überprüfen, ob auch verschlüsselte Verbindungen akzeptiert werden, muss ein EHLO server.com abgesetzt werden. Der Output sollte ähnlich dem folgenden sein, wichtig ist das STARTTLS.
250-example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-STARTTLS 250-8BITMIME
Um dovecot SASL ohne Mailclient zu testen (was dagegen spricht siehe nachfolgender Absatz), kann wiefolgt vorgegangen werden:
perl -MMIME::Base64 -e 'print encode_base64("user\0user\0password");' auf der Shell eingeben und dann wie oben mit telnet auf Port 25 verbinden. Wobei user und password durch den jeweiligen Benutzer und sein Passwort zu ersetzen sind. Für meinen Fall wäre das: perl -MMIME::Base64 -e 'print encode_base64("gerald\0gerald\0mypassword");'
Achtung: Um sich am SMTP Server erfoglreich anzumelden, muss die Option smtpd_tls_auth_only testweise auf no gesetzt werden.
$ telnet localhost 25 ehlo localhost 250-example.com 250-PIPELINING 250-SIZE 10240000 250-STARTTLS 250-VRFY 250-8BITMIME auth plain dXNlcgB1c2VyAHBhc3N3b3Jk 250 Authentication successful quit 221 Bye
Meiner persönlichen Erfahrung nach ist es einfacher postfix nicht via telnet auf der Kommandozeile zu testen, sondern einen Mailaccount im jeweiligen Mailclient (Thunderbird, Notes, Outlook, ...) zu erstellen und dann eine e-mail zu versenden. Wichtig ist es jedoch, dass TLS bei den Optionen aktiviert ist. Weiters muss man sich beim SMTP Server anmelden, und zwar mit dem am System existierenden Benutzer und dem entsprechenden Passwort. Details dazu sind in der Hilfe des jeweiligen Mailclients zu finden. Siehe Übersicht SMTP Optionen diverser Mailclients.
Nun kann Postfix als SMTP Server verwendet werden, wobei nur Benutzer, welche am Server existieren, diesen als Relay verwenden dürfen. Der Server ist somit kein open relay (postfix ist mit der Standardkonfiguration, also von Haus aus, kein open relay).
4.2 dovecot
Die einfachste Methode ist, einen IMAP4/POP3 Account im jeweiligen Mailclient anzulegen und sich beim Server anzumelden. Es ist jedoch zu beachten, dass TLS zu verwenden ist, da es ansonsten Probleme bei der Authentifizierung geben kann.
5 Debuggen bei Problemen
Falls postfix nicht funktioniert, ist es ratsam, zu allererst ins log file zu schauen. Dies befindet sich in /var/log/mail.log. Am einfachsten ist es, das log file mittels tail -f zu betrachten. Weitere Infos zum Debuggen sind im Postfix Debugging Howto zu finden.
Falls das Problem auftritt, dass man keine e-mails mit aktiviertem TLS des Mailclients unter Windows senden kann, kann gut und gern der Virenscanner daran schuld sein.
© 2015 Gerald Holl