IMAP Mail Server

Aus MySlug
Zur Navigation springen Zur Suche springen

IMAP Server auf der NSLU2 mit Dovecot und getmail

Erste Gedanken über einen optimalen Aufbau

Voraussetzungen: Auf der NSLU2 befindet sich unslung 6.8. Das System ist entsprechend vorbereitet und ich empfehle zur einfacheren und sicheren Administration die Installation des Midnight Commanders und openssh.

Im Grunde möchten wir einen Mailserver einrichten, der für uns die E-Mails immer vorrätig hält. Wir möchten vom internen Netz und aber auch einmal von außerhalb auf unsere Mailbox zugreifen. Hierzu muss der IMAP Server entsprechend von außen her erreichbar sein. Unsere NSLU2 soll in regelmäßigen Abständen unsere unterschiedlichen Postfächer diverser Provider abrufen und an unsere Postfächer auf der NSLU2 ausliefern. Via Webmail oder daheim vom Client aus wollen wir darauf zugreifen können. Natürlich können wir dann auch einen Client auf unserem Laptop installieren, der auch auf die Mailboxen der NSLU2 direkt zugreifen kann. Hierfür benötigen wir auf unserer NSLU2 einen IMAP Server (Dovecot [1]) und ein Programm, das unsere Mailboxen nach neuen Mails prüft und zu uns auf den Mailserver holt (Getmail).

Einen besseren Überblick über unser Projekt bekommt man über folgendes Schema, das den Weg der Mails und die Aufgaben der einzelnen Komponenten in diesen Kreislauf veranschaulichen soll:

Slug29.jpg

Man kann im Grunde eine IMAP Umgebung auf zwei Arten einrichten. Die eine wäre die Verwendung von Mailboxen, wobei alle Mails in eine Datei gespeichert werden. Die Gefahr hierbei ist allerdings, dass wenn diese einzelne Datei beschädigt wird, man eventuell alle E-Mails auf einen Rutsch verlieren kann. Zudem kann das System langsam werden, je größer die Datei wird. Ich empfehle daher die zweite Variante zu verwenden, das Mailverzeichnis (maildir). Innerhalb eines Mailverzeichnisses werden die E-Mails jeweils als eine einzelne Datei pro Email abgelegt. Zudem besteht auch hier die Möglichkeit, dass der Client erstmal nur die Mailheader synchronisiert und nicht die kompletten E-Mails mit Inhalt als Spiegelbild des IMAP Servers. Zudem macht ein inkrementales Backup bei vielen kleinen Dateien mehr Sinn, da nur die Veränderungen in den Teilbereichen neu gespeichert werden müssen und nicht jedes mal eine einzige große Datei.

Danach entscheiden wir uns die /etc/passwd Datei zur Authentifizierung zu verwenden. Also das verschlüsselte Passwort für den einzelnen Nutzer, den wir auf der SLUG generieren. Das hat zudem den Vorteil, dass wir auch so auf jede einzelne Mailbox intern via SMP zugreifen können, um mal ein manuelles Backup der Mailverzeichnisse zu machen oder auch einmal um etwas zu reparieren.




Vorbereitung und Einrichten der ersten Mailbox

Für jede Mailbox legen wir uns einen neuen User über die Webadministratur der NSLU2 an. Dabei richten wir dem Mailbox User einen eigenen Share ein, den man auch ein Quota-Limit verpassen kann, wenn zu wenig Platz auf der NSLU2 vorhanden sein sollten. Das Heimatverzeichnis eines NSLU2 Users ist bekanntlich nicht unter /home zu suchen, sondern das liegt direkt Wurzelverzeichnis der NSLU2. Ganz wichtig hierbei ist zu beachten, dass die Verzeichnisse und Dateien innerhalb des Userverzeichnisses dem Nutzer (also Name der Mailbox) und der Gruppe everyone gehören. Alle Files darunter müssen diese User/Gruppenrechte haben. Ändert diese also entsprechend ab, solltet Ihr einmal Dateien als root hier hineinkopieren.

Danach editiert die /etc/passwd Datei und ändert hinten in der Zeile Eures Nutzers wie folg ab:


mailboxname:1234verschlüsseltps:2008:501:::/dev/null


in


mailboxname:1234verschlüsseltps:2008:501::/mailboxname:/bin/sh


Ihr gebt damit dem System noch einmal das korrekte Homeverzeichnis und die Shell vor. Das ist wichtig, weil später der getmail-Prozess ein Script ausführen wird und Ihr eventuell über su von root zum User wechseln müsst, um Arbeiten an diversen Scripten vornehmen zu können oder bestehende umzukopieren.

Jetzt loggt Euch von Eurem Rechner auf die NSLU2 via smb ein und legt das Verzeichnis mailbox und .getmail an. Das Getmail Verzeichnis muss ein verstecktes Verzeichnis sein, deswegen der "." vor getmail . Unterhalb vom Verzeichnis mailbox legt noch die Verzeichnisse cur, new und tmp an.

Damit haben wir den ersten Nutzer angelegt. Später müssen wir noch zwei Dateien anlegen, nachdem die dazugehörigen Serverprogramme laufen.




Den Server installieren

Loggt Euch nun via ssh auf Eure NSLU2 als root ein und installiert dovecot, getmail cron und python:


ipkg install dovecot py25-getmail cron python


Das erstellt dann alle notwendigen Skripte auf Eurer Maschine. Als nächstes müssen wir den Dovecot konfigurieren. Editiert /opt/etc/dovecot/dovecot.conf und sucht nach der default_mail_env Variable und ändert diese auf


default_mail_env = maildir:/%u/mailbox


ab. Damit stellen wir sicher, dass das Zielverzeichnis das Verzeichnis "mailbox" im jeweiligen Userverzeichnis ist. Die Variable %u sorgt dafür, dass dann jeder User seine Mails in das Verzeichnis mailbox bekommt, der dafür vorgesehen ist und wir das nicht einzeln hier festlegen müssen.

Nun arbeiten wir auf der NSLU2 als normaler Nutzer weiter. Gebt dazu


su


Euer Mailboxnameein. Sollte das nicht funktionieren und Ihr bekommt nur die Anzeige seitens des Programmes tinylogin, so müsst Ihr noch die Entwicklerdateien der SLUG installieren. Holt das mit


ipkg install optware-devel


nach. Dann könnt Ihr mit su wechseln. Wechselt dann in das Mailverzeichnis


cd /maiboxname


und legt eine neue Datei getmail.sh an.


touch getmail.sh


Füllt diese mit folgenden Inhalt über vi oder mcedit

#!/bin/sh

# get the mails for the user directory
/opt/bin/getmail -q --rcfile /username/.getmail/mailrc


Der "username" ist natürlich der Platzhalter für den Namen Eurer Mailbox, den Ihr bitte entsprechend ändert.

Das Skript MUSS nun ausführbar gemacht werden:


chmod +x getmail.sh


Prüft, ob die Nutzer der Datei richtig gesetzt sind (wir erinnern uns: username:everyone)


ls -la


Falls hier etwas nicht passen sollte, dann bitte sofort abändern:


chown username:everyone getmail.sh


Jetzt können wir den Getmail vorbereiten. Die Aufgabe von Getmail wird es sein, die E-Mails von außerhalb aus unseren Mailboxen abzuholen um diese dann an unser mailbox-Verzeichnis weiter zu geben. Damit getmail die dafür benötigten Informationen wie Zugangsdaten und Zielverzeichnis geliefert bekommt legt eine Datei unter /mailboxname/.getmail mit dem Namen mailrc an. Füllt diese wie folgt:


[options]
delete = true

[retriever]
type = SimplePOP3Retriever
server = pop.deinmailserver.de
username = username_mailserver
password = passwort

[destination]
type = Maildir
path = /mailboxname/mailbox/


Auch hier wieder die korrekten Besitzrechte ändern, falls nicht ordentlich gesetzt:


chown username:everyone mailrc

Solltet Ihr nicht wollen, dass die Mails vom Mailserver gelöscht werden (weil Ihr diese z.B. mit einem weiteren Mailer nochmals herunterladen und sichern wollt) dann sollte die mailrc wie folgt geändert werden:

[options]
delete = false
read_all = false

[retriever]
type = SimplePOP3Retriever
server = pop.deinmailserver.de
username = username_mailserver
password = passwort

[destination]
type = Maildir
path = /mailboxname/mailbox/

Testet nun mit einem sh getmail.sh ob der Maildownload funktioniert. Schickt Euch zum Test vorher selbst eine E-Mail zu. Schaut im Verzeichnis /mailbox/new nach, ob dort sich eine E-Mail befindet.

Damit getmail in Zukunft zu regelmäßigen Zeiten Eure Mailboxen nach E-Mails absucht müssen neue Cronjobs eingerichtet werden. Der normale Corn, der in der unslung bereits vorhanden ist hat hier leider ein Manko: Er kann nur Crons seitens des root-Nutzers ausführen. Getmail arbeitet allerdings aus Sicherheitsgründen nur als normaler User. Deswegen haben wir uns bereits eine weitere cron- Alternative eingangs installiert. Die Cronjobs werden hierfür nun unter /opt/var/cron/crontabs abgelegt. Den ersten müssen wir der Einfachkeit halber als root anlegen. Solltet Ihr nicht bereits wieder "root" sein und noch als User angemeldet, dann verlasst diese Ebene mit einem


exit


Nun starten wir den cron Editor mit


crontab -e


Folgende Zeile wie mit dem vi Editor eingeben:


*/5 * * * * /username/getmail.sh &>/dev/null


Das wird den getmail für den speziellen User alle 5 Minuten auslösen. Ändert den Wert nach Euren Vorstellungen ab und speichert die Änderung. Da wir den Job allerdings als User ausführen müssen kopiert


cp /opt/var/cron/crontabs/root /opt/var/cron/crontabs/username


Ganz wichtig hier ist, dass Ihr nicht vergesst, die richtigen Benutzer auf Euren nene cron zu schlüsseln. Auch hier wie gewohnt:


chown username:everyone /opt/var/cron/crontabs/username


Jetzt editiert nocheinmal die root crontab


vi /opt/var/cron/crontabs/root


und werft wieder die getmail- Zeile dort raus. Denn schließlich liegt die jetzt in der User Cron und hat da nichts mehr unter root verloren. Ihr müsst später dann für JEDEN neuen User eine zusätzliche cron einrichten. In der Cron Datei müsst Ihr dann jeweils den Pfad ändern und immer den korrekten Benutzer und die Gruppe setzen wenn Ihr die Datei von einer alten Cron auf Eure neue Cron kopiert.

Nach jeder Änderung startet den Cron Dämon neu:


/opt/etc/init.d/S10cron
/opt/etc/init.d/S90dovecot restart


Ein Neustarten der NSLU2 ist damit nicht notwendig.

Nun ist es an der Zeit, unseren neuen Server zu testen. Mittels eines Mail Client legt Euch ein neues Postfach für IMAP an. Schickt Euch selbst eine Email und wartet einwenig ab. Wenn alles gut gelaufen ist bekommt Ihr Eure erste E-Mail via IMAP zugestellt.

Für alle weiteren Mailboxen müsst Ihr obige Schritte wiederholen. Diese in einer Kurzübersicht:

1) Lege einen neuen Nutzer mit einem Share via Webadmin an
2) Lege das mailbox und .getmail Verzeichnis an
3) Erstelle die rc Datei für getmail im .getmail Verzeichnis und gebe dort den Zugang zur externen Mailbox an
4) Erstelle das getmail.sh Skript im Heimatverzeichnis der Mailbox
5) Lege einen neuen Cronjob für die neue Mailbox an

Zudem: immer auf die richtigen Nutzerrechte und Dateizugehörigkeiten achten!

Um den korrekten Ablauf zu überwachen könnt Ihr Euch die Logdatei ansehen:


tail -f /var/log messages




SSL/TSL Setup

Nachdem wir nun einen IMAP Server am Laufen haben sollten wir uns Gedanken über den Datenaustausch beim Login machen. Hier werden ja Nutzer und Passwort über das Netz geschickt. In einem lokalen Netzwerk vielleicht jetzt nicht ganz so gefährlich, als wenn wir später das gleiche über einen Webmailer machen. Da sollte der Datenausstausch gesichert über ssl erfolgen.

Nun erstellt zwei neue Verzeichnisse, in denen später das Zertifikat abgelegt wird:


mkdir /etc/ssl
mkdir /etc/ssl/certs 
mkdir /etc/ssl/private


Führt dann das mkcert.sh Skript im /opt/etc/dovecot Verzeichnis aus um Euer Zertifikat zu erstellen und anzulegen:


sh mkcert.sh


Editiert /opt/etc/dovecot/dovecot.conf und Ändert folgende Variablen ab:


ssl_disable = yes


in


ssl_disable = no


und hier der richtige Pfad zu den Zertifikaten:


ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecote.pem


Achtet zudem, dass bei den zu startenden Protokollen neben dem imap auch imaps in der dovecot.conf steht. Ergänzt das beim Parameter


protocols


gegebenfalls. Dann startet Dovecot neu:


/opt/etc/init.d/S90dovecot restart


Nun müsst Ihr noch Euren Mail Client für SSL/TSL anpassen. Das geht von Mailer zu Mailer unterschiedlich. Wenn Ihr dann gefragt werdet, ob Ihr ein Zertifikat akzeptieren wollt habt Ihr es geschafft.




Zeitverschiebung des Servers korrigieren

Je länger nun die Slug läuft, desto weiter wird auf dem Gerät die korrekte Zeit von der Slug-Zeit abweichen. Eine Geschichte, die einwenig ärgerlich ist, aber sehr einfach zu beheben. Hierzu werden wir einen NTP Clienten einrichten, der von einem Zeitserver im Internet die aktuelle und genaue Zeit mit der NSLU2 synchronisiert. Nichts ist schlimmer, als z.B. ein falsches Empfangsdatum einer E-Mail angezeigt zu bekommen, gerade wenn es um geschäftliche Dinge geht. Installiert den NTP Client mit folgenden Befehl:


ipkg install ntpclient


Dann müssen wir einmal die Zeit manuell synchronisieren und dem Timer der Slug übergeben. Führt dazu folgenden Befehl als root aus:


/opt/bin/ntpclient -s -h 0.pool.ntp.org && hwclock --systohc --utc


Legt ein Logfile an in dem das letzte Update dokumentiert wird:


touch /var/log/ntp.log


Editiert /etc/crontab und fügt folgende Zeile ein:


1 * * * * root /opt/bin/ntpclient -s -h 0.pool.ntp.org > /var/log/ntp.log && hwclock --systohc --utc


Dann entfernt die Zeile (oder kommentiert sie mit einem # aus):


1 * * * * root /usr/sbin/hwclock -s &>/dev/null


Startet nun die NSLU2 neu. Ab jetzt wird jede Stunde die Zeit neu mit der Slug synchronisiert.




Dovecot auf der NSLU2 selbst kompilieren

Als ich ein paar Probleme mit dem ssl Handshake hatte und festellte, dass es neueren Dovecot Code gibt, habe ich mich entschlossen, meinen Dovecot von Grund auf selbst zu bauen. Das ist keine wirklich schwere Angelegenheit. Installiert zuerst folgende Pakete:


ipkg install optware-devel openssl-dev 


Erstellt ein Build Verzeichnis:


mkdir work


Hier ladet dann den Quellcode der aktuellen Version herunter (z.B.)


wget http://www.dovecot.org/releases/1.1/dovecot-1.1.4.tar.gz

(Schaut im Downloadbereich unter http://www.dovecot.org nach, ob das auch die aktuelle Version ist)

Wie gehabt auspacken:


tar -zvxf dovecot-1.1.4.tar.gz


Wechselt in das neue Verzeichnis dovecot-1.1.4 und bereitet den Kompilierungsvorgang vor:


CPPFLAGS=-I/opt/include LDFLAGS=-L/opt/lib ./configure --prefix=/opt --with-ssl=openssl --with-ssldir=/etc/ssl


Dann wird übersetzt:


make


An der Stelle könnt Ihr einen Kaffee trinken gehen. Auf dem 266MHz ARM Prozessor dauert das seine Zeit-

Dann installieren wir ganz unkonventionell den dovecot wie ipkg:


ipkg install dovecot


Das machen wir, damit alle Verzeichnisse und auch das Startscript unter /opt/etc/init.d angelegt wird. Die alten Files werden dann mit unseren neuen übersetzten überschrieben:


make install


Danach müssen wir zwei Bibliotheken umlinken, damit die neue Programmversion diese unter /lib findet:


ln -s /opt/lib/libssl.so.0.9.7 /lib/libssl.so.0.9.7
ln -s /opt/lib/libcrypto.so.0.9.7 /lib/libcrypto.so.0.9.7


Legt zwei neue Verzeichnisse für die Zertifikate an (falls noch nicht geschehen):


mkdir /etc/ssl
mkdir /etc/ssl/certs 
mkdir /etc/ssl/private


Sollten hier schon Dovecot Zertifikate der alten Version liegen entfernt die besser erst einmal. In /work/dovecot-1.1.4/doc/ führt dann


sh mkcert.sh


aus und die Zertifikate werden erstellt.

Wir kümmern uns nun um die dovecot.conf Datei. Solltet Ihr bereits schon den Dovecot in der Slug Version am Laufen gehabt haben, dann liegt diese bereits unter /opt/etc/dovecot.conf. Da sich an manchen Stellen die Notierung geändert hat kopiert diese ersteinmal um ( z.B. dovecotconf.old). Schaut Euch dann die /opt/etc/dovecot-example.conf an. Dies ist eine Beispielskonfiguration der neuen Dovecot Version. Gleicht diese ersteinmal mit den Einstellungen Eurer alten Konfig ab. Wenn Ihr Dovecot neu installiert habt muss das von Grund auf neu durchgegangen werden. Speichert die fertige Konfiguration dann als dovecot.conf ab. Die SSL Geschichten müssen dann wie oben bereits besprochen aktiviert werden. Startet dann Dovecot neu:


/opt/etc/init.d/S90dovecot restart




Externer Webmailer

Um einmal von außen auf Eure E-Mails zugreifen zu können empfehle ich den Webmailer Roundcube [2]. Roundcube benötigt hierfür einen Webspace mit php und einer mysql Datenbank. Ihr müsst nur ein paar wenige Angaben in den Konfigurationsdateien von Roundcube erledigen, die fast selbsterklärend sind. Etwas kniffeliger wird es beim Anlegen der mysql Tabellen. Das wird über einen mysql Befehl erledigt, den man aber auch über den phpmyadmin absetzen kann, der bei den meisten Hoster denke ich mit angeboten wird. Mittels Roundcube könnt Ihr Euch über das Login in jder Eurer Mailboxen einloggen. Das geschieht über das bekannte Login auf der Slug. Deshalb UNBEDINGT das SSL in der Roundcube Konfiguration aktivieren. Dann wird der Handshake geschützt ausgeführt. Ansonsten bietet Rondcube die entsprechenden Verwaltungsmöglichkeiten der gängigen Webmailer. Es können Absendeadressen angelegt werden, ein eigenes Adressbuch und auch E-Mails verschickt werden. Dazu nutzt Roundcube den Mailer des Servers, auf dem dieser seinen Dienst verrichtet.

Konfigurationshilfen und Anleitungen findet Ihr auf der Roundcube Projektseite [3]. Diese sind sehr gut und einfach nachzuvollziehen, weshalb ich hier auf eine weitere Dokumentation verzichte.

Roundcube Webmailer:

Slug30.jpg




FAQ

Q: Der Webmailer kann sich nicht an die SLUG anbinden. Der IMAP Server liefert mir einen Timeout
A: Du musst den Port 143 (imap) und 993 (imaps) an die IP Deiner NSLU2 weiterleiten. Das geht über Deinen Router. Der hat normalerweise in seiner Konfiguration die Möglichkeit, Ports auf eine IP Adresse im LAN weiter zu leiten. Wie das funktioniert verrät die Betriebsanleitung des jeweiligen Routers. Das ist von Hersteller zu Hersteller und Modell zu Modell durchaus unterschiedlich zu konfigurieren.


Q: Wenn ich mir die var/log/messages ansehe, dann bekomme ich die Meldung, dass der getmail Cron eines Users UNSAFE sei. Was hat das zu bedeuten?
A: Da der Cron seitens eines Users passiert ist der Prozess normalerweise sicher, da das nicht über Root passiert. Jedoch kann es sein, dass vergessen wurde, bei der getmail.sh den korrekte Nutzer zu setzten. Prüft das zuerst nach. Falls dass der Fall ist bitte mit einem chown wie oben beschrieben korrigieren. Ich hatte auch den Fall, dass der User gestimmt hat. Kurioserweise war der Fehler damit zu beheben, indem ich einfach den entsprechenden Cronjob mit einem Editor geöffnet habe:

mcedit /opt/var/cron/crontabs/yourcronjob

(Midnight Commander muss dafür installiert sein) Danach einfach wieder speichern ohne etwas zu verändern. Dann nur noch den cron Dämon mit /opt/etc/init.d/S10cron neu starten. Danach sollte der Fehler weg sein.


Q: Mein Mailer der SSL verwendet sagt, dass die SLUG ein falsches Zertifikat hat, weil der NSLU2 Hostame von dem im Zertifikat abweicht.
A: Hierzu muss die ssl Konfiguration im Arbeitsverzeichnis geändert werden: /work/dovecot-1.0.7/doc/dovecot-openssl.cnf . Hier muss ein Parameter (common name) auf die IP Adresse oder dem Domain Namen der NSLU2 geändert werden. Normalerweise sollte wird das wie folgt aussehen: CN=192.168.... (hier Diene IP bitte eintragen). Jetzt die Änderungen speichern und die alten Zertifikate /etc/ssl/certs/dovecot.pem und /etc/ssl/private/dovecot.pem löschen. Dann nocheinmal mkcert.sh im .../dovecot-1.0.7/doc/ Verzeichnis ausführen. Dovecot neu starten : /opt/etc/init.d/S90dovecot .


Q: Windows Mail bricht manchmal mit einem Timeout ab.
A: Wenn manchmal etwas mehr zu synchronisieren ist kann es vorkommen, dass der Client zu lange auf die Beendigung des Vorganges warten muss. Hierzu kann man den Servertimeout in den Konteneinstellungen jedes einzelnen Kontos unter Erweitert verlängern. Stellt das auf 2 Minuten ein, das sollte genügen.


Q: Kann es sein, dass meine E-Mails nicht mehr auf Viren untersucht werden?
A: Manche Virenscanner scannen von Haus aus nicht auf gesicherte Verbindung. Wenn also ein SSL Handshake verwendet wird, dann kann es sein, dass der Scanner hier davon ausgeht, dass die Verbindung sicher ist und er hier nichts zu tun hat. Man kann dies in der Konfiguration des Scanners oft verändern und diesen auch gesicherte Verbinden überprüfen lassen. Alternativ kann man aber auch im lokalen Netzwerk seinen Mailer eine ungesicherte Verbindung zulassen, damit der Scanner wieder seine Arbeit erledigen kann. Entscheidet selbst, wie herum Ihr das machen wollt.


Q: Wenn ich beim Roundcube Mailer manche Ordner aufrufe benötigt er sehr lange um zu synchronisieren und bleibt hängen.
A: Klickt einfach auf "Refresh/Neu laden" im Browsermenü. Dann sollte es normalerweise gehen. Es kann auch sein, dass Ihr in der Konfiguration des Webmailers das Cashing aktiviert habt. Stellt dieses in der Main-Config auf false. Das behebt so manche Probleme.