OpenWRT als Mailserver mit Dovecot, fetchmail und procmail

Diese Anleitung ist Teil des Projekts OpenWRT als eierlegende Wollmilchsau.

OpenWRT bietet in seinem Repository alle Pakete an die wir benötigen. Das Sieve Plugin wurde nicht für OpenWRT übersetzt insofern kommt hier die altbewährte fetchmail – procmail Chain zum Einsatz. Im Vorfeld sollte man sich darüber im Klaren sein, ob man Dovecot im Maildir- oder im Mbox – Format betreiben möchte. Im folgendem wird eine Installation für Maildir beschrieben, wobei MBOX analog abhandelbar ist.

Als erstes installieren wir einmal alle benötigten Pakete:

opkg install fetchmail dovecot procmail sudo

Ich benötige mindestens 2 Imapkonten, also lege ich mir entsprechend 2 Konten an:

mkdir -p /home/user1
mkdir -p /home/user2

Die User müssen wir händisch im System anlegen, dazu fügen wir für jeden User in die /etc/passwd folgendes ein:

user1:x:1000:100:user1:/home/user:/bin/ash
user2:x:1001:100:user2:/home/user:/bin/ash

in der /etc/shadow tragen wir für jeden User zusätzliches folgendes ein

user1:::::7:::

anschließend generieren wir die Passwörter

passwd user1

und passen die Nutzerberechtigungen an

chown user1:user /home/user1

Als nächstes wird die /etc/dovecot.conf unseren Wünschen entsprechend konfiguriert:

## Dovecot configuration file

# LAN und Localhost
listen = 192.168.69.1 127.0.0.1

disable_plaintext_auth = no
log_path = /var/log/dovecot.log

# Mein LAN ist sicher da brauche ich kein SSL. 
# WlAN habe ich in ein eigenes Subnetz gesteckt 
# und nur Zugriff via FORWARD in das Internet gestattet. 
# Zugriff von EXTERN erfolgt über OpenVPN.

ssl = no

# Dies den eigenen Gegebenheiten Anpassen. Ich benutze 
# hier unterschiedliche Systemuser, somit kann ich 
# einfacher mehrere IMAP - Accounts pflegen.
mail_location = maildir:/home/%n/Maildir

# Ich authentifiziere gegen die /etc/passwd.dovecot
auth default {
mechanisms = plain login
passdb passwd-file {
    args = scheme=plain username_format=%n /etc/passwd.dovecot
    #deny = yes
}
userdb passwd-file {
    args = username_format=%n /etc/passwd.dovecot
}
}

Bleibt uns noch die /etc/passwd.dovecot zu erstellen. Dovecot nutzt dieses Datei in unserem Fall um zu ermitteln mit welcher UID und GID er in Verzeichnisse schreibt, welches Passwort vergeben wurde und welches das Maildirectory ist.

user1:{PLAIN}passwort1:1000:1000::/home/user1::userdb_mail=maildir:~/Maildir
user2:{PLAIN}passwort2:1000:1000::/home/user2::userdb_mail=maildir:~/Maildir

Dovecot unterstützt mehrere sogenannte Password Schemes. Wir vertrauen uns, insofern wird der Einfachheit halber PLAIN genutzt. Dovecot starten und den Zugriff mittels eine beliebigen Imapclients testen:

/etc/init.d/dovecot start
/etc/init.d/dovecot enable

Als nächstes sorgen wir dafür, daß procmail die Mails richtig einsortiert. Hierzu erstellen wir in jeden Homedirectory des Users eine .procmailrc die Später auch dazu dienen kann Mails gleich vorzusortieren. Meine .procmailrc ist wesentlich größer,  dafür nutze ich in Thunderbird keine Regeln. Als Delivercommand nutzen wir das Dovecot eigene deliver – somit wird das Imapfolder auch immer gleich aktualisiert.

SHELL="/bin/ash"
LOGFILE="/home/user1/log/procmail.log"
DELIVER="/usr/lib/dovecot/deliver"

DROPPRIVS="YES"

DEFAULT="/home/user1/Maildir/"
MAILDIR="/home/user1/Maildir/"

:0 w
| $DELIVER

Hier noch mal ein Beispiel für eine Regel um E-Mail von einem Bestimmten Absender in ein Unterverzeichnis einzusortieren

:0 w
* ^From.*nagios@okami.de
| $DELIVER -m INBOX.nagios

Als letzte Amtshandlung für den Mailempfang richtet sich jeder User fetchmail ein. Aktuell rufe ich das Abholen der E-Mail mittels der Crontab auf. Damit die User dies auch dürfen müssen wir crontab suid verpassen.

chmod +s /usr/bin/crontab
#und dann als user1
crontab -e

*/5 *   * * *   fetchmail -vf /home/user1/.fetchmailrc

 

set postmaster root

poll <deinserver.de>
        proto pop3
        user 'user1'
        password 'strenggeheim'
        is user1 here
        mda "/usr/bin/procmail -d user1"
        ssl
        sslcertck
        sslcertpath /etc/ssl/certs
        sslfingerprint "00:00:00:00:00"

Ich hole meine E-Mail via SSL ab. Hierzu sind ein paar Handgriffe mehr nötig, da Zertifikate importiert werden müssen etc.  Hier gibt es eine Anleitung wie man dazu normalerweise vorgeht.

Da c_rehash für OpenWRT nicht vorliegt habe ich händisch Abhilfe geschaffen.

opkg install openssl-util

Für jeden abzuholenden Mailserver geht man entsprechend vor:

cd /etc/ssl/certs
openssl s_client -connect mailserver.de:995 < /dev/null > temporary.out
openssl x509 -outform PEM < temporary.out > mailserver.de.cer

HASH=`openssl x509 -hash -noout -in mailserver.de.cer`.0

# create link
ln -s mailserver.de.cer $HASH
#
# fingerprint
openssl x509 -fingerprint -md5 -noout -in mailserver.de.cer

Abschließend bleibt die Installation des SMTP Dienst.