blog · git · desktop · images · contact & privacy · gopher


Courier SMTP/POP3/AUTHMYSQL/TLS unter Debian 3.1

– Nachtrag 01.11.2011: Diese Anleitung ist sehr alt und dient nur noch Archäologen als Forschungsobjekt. Bitte halte Ausschau nach aktuelleren Informationen und verlasse dich nicht auf das, was hier steht.

Dieses kleine How-To soll beschreiben, wie man das Mail-Paket Courier unter Debian 3.1 installiert. Genutzt werden sollen SMTP und POP3 (je mit TLS), User sollen per MySQL verwaltet werden können, außerdem sind virtuelle Domains und User mit von der Partie. Diese User werden unabhängig von den Systemusern sein, was ich als sehr praktisch empfinde.

Eine rudimentäre Spamabwehr werde ich die Tage noch hinzufügen. Hmm, nope: Als Spamabwehr soll erstmal genügen, den HELO/EHLO-Befehl auf einen gültigen Hostnamen/IP zu prüfen. Dadurch wird schonmal einiges zurückgewiesen.

Unbedingt beachten zum Thema Spamfilter: Wenn man für sich selbst einen Mailserver aufsetzt, kann man natürlich machen, was man will. Ist es aber auch für "Fremde" gedacht, dann sollte man wissen, dass man Mails nicht hart filtern darf, so dass diese gleich am Server gelöscht werden und gar nicht erst zum "Kunden" durchkommen, sofern dieser einer derartigen Filterung nicht zugestimmt hat! Es ist daher besser, dem Kunden irgendwie (werde ich mir noch genauer anschauen) die Kontrolle über den Spamfilter zu überlassen.

Siehe dazu auch:

Vorbereitungen

Wichtig ist zuerst einmal, dass MySQL 4.X genutzt wird, da die Sarge-Pakete vom Courier scheinbar Probleme mit neueren Versionen haben. Nutzt man aber die Debian-MySQL-Pakete, ist das kein Problem, da dort standardmäßig 4.X drin ist. Beim Upgraden kann das aber Probleme geben.

Desweiteren muss der Zugriff auf MySQL vom loopback-Interface aus klappen. Das kann man mit telnet -b 127.0.0.1 127.0.0.1 3306 ganz einfach testen. Wird man rausgeschmissen, so muss man die /etc/hosts wie folgt bearbeiten: In der Zeile mit 127.0.0.1 muss hinter der 127.0.0.1 als erster Hostname "localhost" stehen, danach können weitere folgen. Die Datei könnte also so aussehen, die Einträge sind mit TAB getrennt:

127.0.0.1   localhost   localhost.localdomain   debianserver    meinesonne

Nach Änderungen an dieser Datei evtl. MySQL neustarten (/etc/init.d/mysql restart) und mit Telnet erneut die Verbindung testen.

phpMyAdmin kann nützlich sein, mit dem einfachen "mysql" an der Console geht aber auch alles (so habe ich's auf dem Testsystem eingerichtet).

Pakete besorgen

apt-get update
apt-get install courier-mta courier-mta-ssl courier-pop \
    courier-pop-ssl courier-authmysql

Optional kann dieser Vorgang erstmal mit "--dry-run" hinter'm "install"-Teil simuliert werden. Ein paar weitere Pakete holt er sich noch automatisch dazu.

Grundsettings

Alle Config-Files liegen in /etc/courier.

Dem Server seine eigene Identität sagen, falls er sich falsch meldet (mit Telnet testen):

echo "mail.server.de" > /etc/courier/me

Relaying für alles außer 127.0.0.1 deaktivieren: /etc/courier/smtpaccess/default, Einstellungen obvious.

Man ist aber automatisch für Relaying zugelassen, wenn man sich mit einem gültigen Account authentifiziert und in der /etc/courier/esmtpd folgende Einstellung setzt:

ESMTPAUTH="LOGIN"

Postmaster-Alias: In der /etc/courier/aliases/system unten einfach den User dahinterschreiben, also bspw:

postmaster: omfg@blabla.de

Hiernach muss man folgendes ausführen, ebenso bei allen weiteren Änderungen an den zugehörigen Dateien:

makealiases 
makesmtpaccess 
makesmtpaccess-msa

MySQL-Anbindung

Zuerst einmal muss/sollte man eine neue Datenbank anlegen, die man beliebig nennen kann. Dazu dann ein Benutzer, der SELECT, INSERT, UPDATE und DELETE in dieser DB darf.

"Der" Mailserver wird unter dem Benutzer "mail" der Gruppe "mail" laufen bzw. mit diesen Rechten auf die Mailboxes zugreifen. Die ID's dieser beiden braucht man gleich, was man ganz einfach mit "id mail" ermitteln kann. In der neuen SQL-DB erstellt man dann eine Tabelle mit folgender Struktur:

CREATE TABLE passwd (
        id                    char(128) DEFAULT '' NOT NULL,
        crypt                 char(128) DEFAULT '' NOT NULL,
        clear                 char(128) DEFAULT '' NOT NULL,
        name                  char(128) DEFAULT '' NOT NULL,
        uid                   int(10) unsigned DEFAULT '65534' NOT NULL,
        gid                   int(10) unsigned DEFAULT '65534' NOT NULL,
        home                  char(255) DEFAULT '' NOT NULL,
        maildir               char(255) DEFAULT '' NOT NULL,
        defaultdelivery       char(255) DEFAULT '' NOT NULL,
        quota                 char(255) DEFAULT '' NOT NULL,
        options               char(255) DEFAULT '' NOT NULL,
        KEY id (id(128))
);

Statt dieser abstrusen Default-Werte für uid und gid können einfach die oben ermittelten ID's für User/Gruppe "mail" eingesetzt werden, was etwas Arbeit erspart später. Immerhin sollen virtuelle User genutzt werden, also braucht man sowieso keine "echten" User im System anlegen und daher auch keine echten ID's.

In der /etc/courier/authdaemonrc müssen dann erst einmal folgende Felder gesetzt werden, denn wir wollen ja Auth per MySQL und nicht per PAM:

authmodulelist="authmysql"
[...]
version="authdaemond.mysql"

Die /etc/courier/authmysqlrc muss dann noch die richtigen Zugangsdaten zum MySQL-Server enthalten, DB-Name anpassen nicht vergessen.

Virtuelle Domains einrichten

Etwas redundante Settings nun, aber egal. Falls Dateien/Verzeichnisse noch nicht existieren, einfach erstellen.

Will man später weitere Domains hinzufügen, sind neben reloads der Server also nur Änderungen an den letzten beiden Dateien nötig.

Hiernach folgendes ausführen:

makehosteddomains 
makeacceptmailfor

Virtuelle User einrichten

Es muss nur der User in der MySQL-Tabelle hinzugefügt und das Maildir angelegt werden. Für den ersten Schritt sind in der Tabelle nur folgende Felder relevant: id, crypt, uid, gid, home. uid und gid können bei richtigen Default-Settings auch weggelassen werden (s. MySQL-Anbindung).

Diese Verzeichnisse müssen nun nach folgendem Schema als Root erstellt werden:

mkdir /var/mail/bloek.de
mkdir /var/mail/bloek.de/gnabla
cd /var/mail/bloek.de/gnabla
maildirmake Maildir
chown -R mail:mail /var/mail/bloek.de

Optional: Aliases via MySQL

"Aliases" via MySQL sind denkbar einfach und domainübergreifend möglich: Einfach als Homedir des Users das entsprechende Verzeichnis angeben! Hat man also bspw. den User bla@blubb.de mit Homedir /var/mail/blubb.de/bla und will in diese Inbox auch Mails von jemand@anders.com haben, so legt man in der SQL-Tabelle erstmal wie gewohnt den User an, trägt aber unter "home" eben auch /var/mail/blubb.de/bla ein - das war's.

Beachten muss man natürlich, dass Courier auch wissen muss, dass es Mails von "anders.com" annehmen soll. Ergo muss diese virtuelle Domain dem MTA bekannt sein, sprich: obige Schritte zum Anlegen einer virtuellen Domain durchführen.

Nach Migration von Sendmail ständig Mails von Cron

Nutzte man vorher Sendmail und bekommt seitdem ständig Mails von Cron mit folgendem Inhalt:

Subject: Cron <smmsp@debian31lamp> test -x /usr/share/sendmail/sendmail && /usr/share/sendmail/sendmail cron-msp

mkdir: cannot create directory `/var/run/sendmail/msp': Permission denied

So lösche oder verschiebe man die Datei /etc/cron.d/sendmail. Damit dürfte das Problem gegessen sein.

SSL-Zertifikat

Das bei der Installation angelegte Zertifikat verweist auf "localhost", was natürlich falsch ist und den Mailclients auch übel aufstößt. Das kann man nachträglich ändern:

server:/etc/courier# openssl req -x509 -newkey rsa:1024 -keyout customcert.pem -out customcert.pem -nodes -days 365
Generating a 1024 bit RSA private key
.......++++++
.............++++++
writing new private key to 'customcert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: DE
State or Province Name (full name) [Some-State]:Germany
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:mail.mein-server.de
Common Name (eg, YOUR name) []:mail.mein-server.de
Email Address []:

Wichtig ist vorallem, dass "mail.mein-server.de" genau mit dem Hostnamen übereinstimmt, zu dem die Clients connecten - sonst gibt es einen Konflikt. Außerdem ist das Zertifikat Domain-unabhängig, gilt also für den gesamten Server. Das hat zur Folge, dass Clients, die sich zur eigentlich korrekten zweiten Domain "mail.anderer-server.de" verbinden, auch dieses Zertifikat bekommen und dann von ihrem Mailclient einen Konflikt gemeldet kriegen. Einzige mir bekannte Lösung ist, die Clients alle auf einen Server, also z.B. "mail.mein-server.de", connecten und dort ihre Mails erledigen zu lassen. Auf die Funktionalität hat das auch keinen Einfluss, man kann auch über "mail.mein-server.de" problemlos Mails verschicken, die von "user@anderer-server.de" stammen.

In Betrieb nehmen kann man dieses Zertifikat dann, indem man in folgenden drei Dateien jeweils den Eintrag TLS_CERTFILE auf /etc/courier/customcert.pem umstellt: esmtpd, esmtpd-ssl und pop3d-ssl. Ich habe das Zertifikat überall eingestellt, obwohl direkte SSL-Verbindungen nicht genutzt werden, sondern nur TLS. Wie genau Courier das trennt (vorallem bei POP), ist mir noch etwas unklar.

Klar ist natürlich, dass die Clients auch weiterhin die Meldung erhalten, das Zertifikat konnte nicht verifiziert werden. Ansonsten ist der Betrieb aber anstandslos möglich. Wer "vertrauenswürdig" (haha) sein will, muss sich eben ein richtiges SSL-Zertifikat für viel Geld kaufen.

Bisschen Tuning / Antispam

Wenn der Mailversand sehr langsam ist, kann/wird das an Ident- und/oder DNS-Lookup beim Connecten zum ESMPTD liegen. Abschalten kann man das in der /etc/courier/esmtpd, indem man dort folgende Parameter setzt:

TCPDOPTS="-stderrlogger=/usr/sbin/courierlogger -nodnslookup -noidentlookup"

Wichtig sind hierbei nur die beiden letzten, auf den Logger kommt es nicht an.

Will man nicht ständig Mails erhalten, in denen sich Courier darüber beschwert, dass nicht alle Standards 100% eingehalten wurden, so legt man die Datei /etc/courier/bofh neu an und gibt ihr diesen Inhalt:

opt BOFHBADMIME=accept

Ebenfalls in dieser Datei wird die folgende Zeile stehen:

opt BOFHCHECKHELO=1

Diese Einstellung bewirkt, dass der Hostnamen beim EHLO/HELO auf "Richtigkeit" geprüft wird. "Richtig" ist dabei eine IP oder ein Hostname, der mit der verbundenen IP übereinstimmt. Aus mir nur halb verständlichen Gründen verwenden sehr viele Spambots falsche HELO-Angaben (vermutlich weil sie hoffen, dass dann ihre IP nicht geloggt wird?!) - diese werden dann noch vor Abliefern der Mail zurückgewiesen, denn die Prüfung findet beim "mail from"-Befehl statt.

Abschließend

Einmal das ganze Paket neustarten:

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-mta restart
/etc/init.d/courier-pop restart

Da wir SSL nicht wollen, sondern nur das neuere TLS, stoppen wir diese Daemonen (rc-Symlinks entsprechend entfernen):

/etc/init.d/courier-mta-ssl stop
/etc/init.d/courier-pop-ssl stop

Ob das ganze Setup auch ohne die Pakete courier-*-ssl funktioniert, weiß ich nicht, habe ich nicht explizit getestet. Wenn jemand damit Erfahrungen hat, immer her damit. :)

Unbedingt kontrollieren, dass public-relaying deaktiviert ist. Dazu mit Telnet auf den SMTP-Server connecten und versuchen, unauthentifiziert eine Mail an einen fremden Host zu schicken. Falls sich diese Mail verschicken lässt, den MTA sofort ausschalten:

/etc/init.d/courier-mta stop
/etc/init.d/courier-mta-ssl stop

Danach Fehler suchen. Ansonsten hat man ein spamfreudiges Relay geschaffen!

So, der Mailserver ist fertig. :geek: Login mit einem Client geht nun mittels user@domain.xyz und dem PW. Es ist eine parallele Nutzung von normalem SMTP/POP und selbigem mit TLS möglich - letzteres ist natürlich zu bevorzugen und im Mailclient entsprechend zu aktivieren.

Weitere hilfreiche Quellen