Tag Archive: webmail

AfterLogic WebMail Lite: Simple Webmail Alternative zu Horde, Roundcube und Co.

WebMail Lite Logo

Lange war ich auf der Suche nach einem sehr simplen Webmail Client ohne viel drum und dran. Einzig und allein für den Notfall, um schnell auf E-Mails zugreifen zu können.
Nun habe ich endlich den Richtigen für mich gefunden. Wichtig war mir, dass dieser nicht veraltet ist und sich in aktiver Entwicklung befindet.

WebMail Lite (c) www.afterlogic.com
WebMail Lite (c) www.afterlogic.com
„AfterLogic WebMail Lite“ ist definitiv ein Außenseiter unter den Webmail Clients. Abstriche müssen auch im Bezug auf eine mobile Version hingenommen werden. Für mich kein Problem, da ich via Smartphone sowieso auf den eingebauten E-Mail Client zugreifen werde.

Die Installationsumgebung

In meinem Fall wird der Webmail Client unter „/usr/share/nginx/webmail“ gespeichert. Unter Umständen bitte anpassen. Apache2 wird gewöhnlich mit einem Webroot „/var/www“ ausgeliefert.
PHP- und Webserver-Prozess laufen als Benutzer „www-data“.
Ich gehe davon aus, dass folgendes bereits installiert wurde:

– Ein Webserver (…)
– MySQL Server
– PHP Anbindung

Installation

Hinweis: Es geht hier nur um die Grundkonfiguration. Bei Zeit werde ich erweiterte Funktionen ergänzen!

Der Client ist in seinen Abhängigkeiten sehr dünn, lediglich ein PHP Modul muss noch installiert werden. Zum Entpacken des Downloads, der nur als zip-Datei angeboten wird, benötigen wir noch „unzip“:

sudo apt-get install php5-curl unzip

Das Verzeichnis erstellen, in dieses wechseln, herunterladen/entpacken des Clients und aufräumen:

mkdir /usr/share/nginx/webmail
cd /usr/share/nginx/webmail
wget http://www.afterlogic.com/download/webmail_php.zip
unzip webmail_php.zip
rm changelog.txt readme.txt webmail_php.zip
mv webmail/* .
rm -r webmail
chown -R www-data:www-data /usr/share/nginx/*

mysql -u root -pMYSQL-ROOT-PASSWD ausführen (Achtung: nach -p KEIN Leerzeichen) und folgendes einfügen. PASSWORT unten durch ein eigenes Passwort für die Webmail Datenbank ändern:

CREATE DATABASE webmaildb;
GRANT ALL PRIVILEGES ON webmaildb.* TO 'webmailusr'@'localhost' IDENTIFIED BY 'PASSWORT';
FLUSH PRIVILEGES;

Die Datenbank „webmaildb“ wurde jetzt erstellt. Der Benutzer „webmailusr“ darf diese verwalten.
Mit „exit“ die MySQL Kommandozeile beenden.

http://domain.tld/webmail/install aufrufen. Die Abhängigkeiten noch einmal überprüfen und die Konfiguration durch einen Klick auf „Next“ beginnen:

Beginn der Konfiguration
Beginn der Konfiguration

Mit „Test database“ sichergehen, dass die Anbindung besteht. Eingetragen werden natürlich die Daten, mit denen zuvor die Datenbank erstellt wurde.
Nach einem Klick auf „Next“ nun ein Passwort für den Administrator („mailadm“) erstellen und fortfahren.

In der nächsten Maske beide Haken für „IMAP4“ und „SMTP“ setzen:

Administrator Konfiguration
Administrator Konfiguration

Da die Installation nun abgeschlossen ist, das Verzeichnis „install“ löschen:

rm -r /usr/share/nginx/webmail/install

Sieve

Ist Sieve eingerichtet, beispielsweise via Dovecot, kann dieses hier ebenfalls noch aktiviert werden. Dazu die Datei „webmail/data/settings/config.php“ öffnen und verändern:

$aSieveDomains = array('imap.domain.tld');
return array(

        'sieve' => true,
        'sieve.autoresponder' => true,
        'sieve.forward' => true,
        'sieve.filters' => true,
        'sieve.config.host' => '',
        'sieve.config.port' => 4190,
        'sieve.config.filters-folder-charset' => 'utf-8', // [utf7-imap, utf-8]
        'sieve.config.domains' => $aSieveDomains

);

Unbedingt „’sieve‘ => true“ setzen!
Dovecot benutzt – jedenfalls unter Debian Wheezy – bereits den neueren Port 4190, oben schon geändert. Bitte überprüfen, ob euer Sieve das auch tut. Bis auf die IMAP-Adresse im Array „aSieveDomains“ ist weiter nichts mehr zu ändern.

Benutzung

Einloggen mit dem E-Mail Login unter http://domain.tld/webmail, um E-Mails abzurufen.
Via http://domain.tld/webmail/adminpanel das Panel administrieren. Beispielsweise die Sprache umstellen oder das Zeitformat/die Zeitzone ändern.

Mailserver: Postfix und Dovecot mit MySQL-Anbindung auf Debian Wheezy

Alle Kommentare befinden sich auf dieser einen Seite des Artikels. Das soll niemanden ärgern, ich möchte euch damit die Möglichkeit geben, mit STRG+F nach Keywords zu suchen.

Auf wyden.com findet sich ein sehr gutes und vor allem sauberes Tutorial für Postfix und Dovecot mit MySQL Anbindung. Ich habe mich dazu entschieden dieses ein wenig umzuschreiben für Debian Wheezy, außerdem beschreibe ich noch die Installation eines Spam- sowie Viren-Filters.

WebMail Lite (c) www.afterlogic.com
WebMail Lite (c) www.afterlogic.com

Die Installation eines schlanken Webmail-Clients beschreibe ich HIER.

Seit November 2013 führe ich einen Changelog in Form einer Tabelle:

ÄnderungsdatumBetroffene PaketeBeschreibung
22. Mär 2015OpenSSL, Dovecot- SSL-Zertifikat: SHA1 ist out-dated
- Sieve-Script: "Junk" anstatt "Spam" verwenden
23. Januar 2015Dovecot- Verschiedene Mailboxen automatisch erstellen und abonnieren
22. Januar 2015Postfix- Hinweis zu Hostnamen
02. Jan 2015Dovecot
Allgemein
- "disable_plaintext_auth", um Authentifizierungsversuche ohne TLS abzulehnen
- Einrichtung am Client verändert
11. Dez 2014Postfix- Goodbye SMTPS (Überfällig, da deprecated), Submission ist nun Standard
08. Dez 2014Postfix, Dovecot- "local_transport" ist nicht mehr "virtual"
- Sichere Cipher und kein SSLv2 sowie SSLv3 für Dovecot + Postfix
- Kleine Korrekturen im Text, verständlichere Passagen
28. Nov 2014Postfix (Spamabwehr)- "reject_rbl_client" mit ZEN Spamhaus Blacklist in "smtpd_recipient_restrictions"
- "reject_unauth_pipelining" als "data restriction"
17. Juni 2014PostifxSMTP TLS, betrifft ausgehende Verbindungen
02. Juni 2014Postfix"reject_unverified_sender" hinzugefügt. Unbedingt "Achtung #2" an jeweiliger Stelle beachten!
22. Mai 2014AmavisAlle Domänen in den Spam-Filter miteinbeziehen (Danke, Christian!)
06. Mai 2014Dovecot- POP3 Deaktivierung: Syntaxfehler behoben (danke für den Hinweis!)
13. Mär 2014Postgrey- Hinweis zu StartSSL.com und Postgrey (Whitelist)
12. Mär 2014Dovecot- De-/Aktivierung einer Domäne in Postfixadmin nun möglich ("user_query")
- Optional: Simple Quota-Implementierung
11. Mär 2014Dovecot, Postfixadmin, Postfix- De-/Aktivierung einer Mailbox in Postfixadmin durch "user_query"
- "MD5-CRYPT" wieder als Verschlüsselungsmethode in der Datenbank
- Submission Optionen in "master.cf" verbessert
10. Mär 2014Postifx, Rsyslog- "reject_unknown_reverse_client_hostname" anstatt "reject_unknown_client_hostname" - weniger streng
- "postgrey" als Option für Postfix
- "rsyslog.conf" Modifikation verbessert
09. Mär 2014Dovecot- Optional nur IMAPS/POP3S benutzen (als Hinweis)
05. Mär 2014Postfix- "reject_unknown_client_hostname" hinzugefügt (Hinweis beachten)
18. Feb 2014Allgemein- Hinweise hinzugefügt
17. Feb 2014Dovecot- LDA-Optionen im Bereich Spam
14. Feb 2014Fail2Ban- Hinweise zu "jail.local"
01. Jan 2014Postfix- Submission hinzugefügt
23. Nov 2013Dovecot: Sieve- Automatisches Verschieben von Spam
21. Nov 2013Postfix, Fail2Ban- "smtp_banner" in main.cf
- Wichtige Erklärung zu "local_transport = virtual"
- Fail2Ban: Minimale Ergänzung
19. Nov 2013Postfix- "local_transport = virtual" in main.cf

Voraussetzungen / Abhängigkeiten

An der ein- oder anderen Stelle gehe ich etwas mehr ins Detail, jedoch setze auch ich folgendes voraus:

– Eine vorhandene Webserver Installation mit PHP (inkl. „php5-imap“ Paket) und Webroot /var/www
– Einen vorhandenen MySQL Server

Es wird von folgender Datenbankkonfiguration ausgegangen:

Database: postfixdb
Benutzer: postfix
Passwort: MYSQLPW

Zuerst werden die Paketquellen aktualisiert und die notwendigen Pakete installiert, exim4 wird hierbei – falls installiert – entfernt:

apt-get update
apt-get install dovecot-common dovecot-mysql dovecot-imapd dovecot-pop3d postfix postfix-mysql openssl

Bei der Installation wird von Postfix folgendes abgefragt:

Standardkonfiguration: Internet-Site
System-E-Mail-Name: domain.tld

Postfixadmin Grundeinrichtung

Nun wird die notwendige Datenbank angelegt und die Berechtigungen gesetzt, das Passwort nicht vergessen zu ändern:

mysql -uroot -p -e "CREATE DATABASE postfixdb; GRANT ALL PRIVILEGES ON postfixdb.* TO 'postfix'@'localhost' IDENTIFIED BY 'MYSQLPW'; FLUSH PRIVILEGES;"

Postfixadmin in das Webroot laden und entpacken. Das Verzeichnis soll rekursiv www-data gehören (natürlich anzupassen, falls der Webserver nicht als Benutzer www-data ausgeführt wird):

cd /var/www
wget --content-disposition http://sourceforge.net/projects/postfixadmin/files/latest/download?source=files
tar xfvz postfixadmin-*.tar.gz
mv postfixadmin*/ postfixadmin
chown www-data:www-data -R postfixadmin
cd postfixadmin
nano config.inc.php

Im Editor folgende Werte anpassen, gesucht werden kann in Nano mit STRG+W:

$CONF['configured'] = true;
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'MYSQLPW';
$CONF['database_name'] = 'postfixdb';
$CONF['encrypt'] = 'md5crypt';
$CONF['domain_path'] = 'YES';
$CONF['default_language'] = 'de';
$CONF['domain_in_mailbox'] = 'NO';

Um die Domain in der Datei nicht überall manuell zu ersetzen, kann auch sed eingesetzt werden:

sed -i "s/change-this-to-your.domain.tld/domain.tld/g" config.inc.php

Weitere (einfache) Einstellungen wie Links im Footer etc., können jetzt auch schon eingestellt werden.
Um das Setup zu starten, wird die setup.php angesurft:

http://domain.tld/postfixadmin/setup.php

Die Abhängigkeiten sollten nun alle auf „OK“ stehen. Falls später noch einmal das Setup ausgeführt werden soll, kann nun ein Setup Passwort festgelegt werden.
Die angezeigte Zeile für $CONF[’setup_password‘] muss in der config.php gesucht und eingefügt werden.
Surft erneut die setup.php an, gebt das festgelegte Passwort ein und definiert einen Admin.
Achtung! Die als Admin hinterlegte E-Mailadresse ist nur für den Login gedacht, sie wird noch nicht als vom Server verwaltete Adresse angelegt. Um eine fiktive oder woanders gehostete E-Mailadresse zu verwenden, kann in der config.inc.php folgender Wert festgelegt werden:

$CONF['emailcheck_resolve_domain']='NO';

Wurde der Admin angelegt, kann mit der Konfiguration im Terminal fortgefahren werden.

Postfix

Als nächstes werden Benutzer und Gruppe für die virtuelle Mailverwaltung angelegt sowie der Speicherort erstellt und die Berechtigungen gesetzt:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail
mkdir /var/vmail
chown vmail:vmail /var/vmail

Anschließend den Speicherort für die SSL-Zertifikate erstellen, in diesen wechseln und ein Zertifikat erstellen:

mkdir /etc/postfix/sslcert
cd /etc/postfix/sslcert
openssl req -new -newkey rsa:3072 -nodes -keyout mailserver.key -sha256 -days 730 -x509 -out mailserver.crt

Es werden verschiedene Eigenschaften abgefragt, die frei einzustellen sind, jedoch ist es wichtig, dass der „Common Name“ der Adresse entspricht, unter der später die E-Mails abgerufen werden (z.B. der IMAP-Server in Thunderbird):

Common Name (e.g. server FQDN or YOUR name) []:mail.domain.tld

Keys sind sensible Daten, daher werden sie vor fremden Zugriff geschützt:

chmod go-rwx mailserver.key

Nun zur Postfix-Konfiguration.

WICHTIG: In der Datei „/etc/postfix/main.cf“ sicherstellen, dass der Parameter „mydestination“ NICHT die öffentliche Domain enthält! Das ist wichtig, da es hier nur um die lokale Mail-Zustellung geht!

In die Datei – immer noch „/etc/postfix/main.cf“ – Folgendes einfügen:

# a bit more spam protection
disable_vrfy_command = yes
# Authentification
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth_dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql_sender_login_maps.cf
smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch
		reject_unknown_sender_domain
		reject_unverified_sender
		permit_sasl_authenticated
smtpd_recipient_restrictions = permit_sasl_authenticated
		permit_mynetworks
		reject_rbl_client zen.spamhaus.org
		reject_unauth_destination
		reject_unknown_reverse_client_hostname
smtpd_data_restrictions = reject_unauth_pipelining
		permit
# Virtual mailboxes
#local_transport = virtual
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 104
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
Achtung: „local_transport = virtual“ bewirkt, dass auch für Benutzer auf dem lokalen System, der Versand und Empfang über das hier erstellte Mail-System verläuft. Ich habe diesen Eintrag hinzugefügt (08.12.2014: auskommentiert), um für einige Benutzer Probleme mit dem Empfang zu lösen. Die lokalen Benutzer im Anschluss als Alias anlegen ODER ein eigenes Postfach für diese einrichten! Das gilt auch für root! Falls nicht gewünscht, sollte der Eintrag weg gelassen werden!
Achtung #2: „reject_unverified_sender“ überprüft die Absender auf Gültigkeit. Und damit jeden Absender. Bei sehr hohem Mailaufkommen ist diese Option nur noch bedingt von Vorteil. Hierzu ein Lesezeichen, welches das Für und Wider abwägt.
Achtung #3: Seit dem 10. März 2014 findet sich hier der Eintrag „reject_unknown_reverse_client_hostname“ unter „smtpd_recipient_restrictions“.
Wenn es vermehrt zu abgewiesenen Mails kommt, dann bitte diese Option (nur „reject_unknown_reverse_client_hostname“) entfernen! Dies kann schon der Fall sein, wenn der Absender fehlerhaft konfiguriert ist. Bei sehr hohem Mailaufkommen besser direkt verzichten.

Immer noch in der Datei main.cf, werden folgende zwei Zeilen gesucht und für TLS angepasst:

smtpd_tls_cert_file = /etc/postfix/sslcert/mailserver.crt
smtpd_tls_key_file = /etc/postfix/sslcert/mailserver.key

Für eine ausgehende Kommunikation von Server zu Server, wird nun ebenfalls TLS aktiviert. Ist eine solche sichere Verbindung nicht möglich, wird darauf verzeichtet („may“). Am 08.12.2014 habe ich noch ein einige sichere Cipher hinzugefügt und SSLv2,3 deaktiviert.

Sind Einträge bereits vorhanden, diese bitte ersetzen.

Aber Vorsicht: Bitte darauf achten, dass hier um „smtp_tls_cert_file“ geht, im vorherigen Schritt war es „smtpD_tls_key_file“ – auf keinen Fall ersetzen, da es sich um zwei verschiedene Parameter handelt:

smtp_tls_cert_file = /etc/postfix/sslcert/mailserver.crt
smtp_tls_key_file = /etc/postfix/sslcert/mailserver.key
smtp_tls_security_level=may
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

Außerdem kann hier Folgendes noch geändert werden:

smtpd_banner = $myhostname

Die Einstellung bewirkt, dass „Postfix“ sowie „Debian“ beim Verbinden als Produktname nicht angezeigt werden. Dies hat keine Auswirkung auf die Funktionalität, ist jedoch zur Sicherheit zu empfehlen.

Als nächstes die Datei „/etc/postfix/master.cf“ editieren:

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Achtung! Die Einrückung der zweiten Zeile ist wichtig!

Immer noch in der Datei master.cf, nun den Submission-Listener aktivieren. Dafür folgende Zeilen einfügen:

submission inet n       -       -       -       -       smtpd
  -o smtpd_enforce_tls=yes
  -o smtpd_tls_security_level=encrypt
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Wo diese Zeilen eingefügt werden, spielt keine Rolle. Der Logik/Übersicht halber würde ich sie jedoch an einer oberen Stelle platzieren. Im Standard existiert der Eintrag „submission“ bereits, ist jedoch auskommentiert.
Auch hier die Einrückung bestehen lassen!

Nun werden vier Dateien für die Datenbankverbindung erstellt. Nicht vergessen, das Passwort anzupassen:
/etc/postfix/mysql_virtual_alias_maps.cf

hosts = localhost
user = postfix
password = MYSQLPW
dbname = postfixdb
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = MYSQLPW
dbname = postfixdb
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

/etc/postfix/mysql_sender_login_maps.cf

hosts = localhost
user = postfix
password = MYSQLPW
dbname = postfixdb
query = SELECT username AS allowedUser FROM mailbox WHERE username="%s" AND active = 1 UNION SELECT goto FROM alias WHERE address="%s" AND active = 1

/etc/postfix/mysql_virtual_domains_maps.cf

hosts = localhost
user = postfix
password = MYSQLPW
dbname = postfixdb
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

 
 
Wichtig: Die Rechte für die Dateien ändern, damit kein unbefugter Zugriff erfolgt.

cd /etc/postfix
chmod o-rwx,g+r mysql_*
chgrp postfix mysql_*

Neuer Hinweis vom 22. Januar 2015: Bitte stellt zum Schluss noch sicher, dass unter „myhostname“ ein FQDN eingetragen ist, Beispiel:

myhostname = name.domain.tld

Das gleiche gilt für die Datei „/etc/mailname“, auch in diese bitte den FQDN des Servers eintragen:

nano /etc/mailname

Als Inhalt lediglich den FQDN:

name.domain.tld

Soweit zu Postfix.

Dovecot

Zunächst sichern wir die Standardkonfiguration:

mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.sample

Nun eine neue Konfiguration anlegen…

nano /etc/dovecot/dovecot.conf

…und folgenden Inhalt einfügen:

auth_mechanisms = plain login
log_timestamp = "%Y-%m-%d %H:%M:%S "
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
namespace inbox {
  inbox = yes
  location =
  separator = .
  prefix =
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
}
protocols = imap pop3
service auth {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-master {
    mode = 0600
    user = vmail
  }
  user = root
}
listen = *
ssl_cert = 

Hinweise: Die Postmaster-Adresse kann an dieser Stelle natürlich angepasst werden.
Zudem darf in Zeile 7, "protocols = imap pop3", "pop3" oder "imap" vollkommen weg gelassen werden. Für beide Protokolle gilt, dass neben Port 110 und 143 auch die reinen SSL-Ports 993 (IMAPS) und 995 (POP3S) geöffnet werden.

Um nur Port 993 und 995 zu öffnen, kann am Ende Folgendes eingefügt werden.
Vorsicht: Damit verliert der Server die Möglichkeit zur Aufwertung der Verbindung durch STARTTLS.

Randnotiz: Die Ports 993 und 995 sind vom Kontakt an verschlüsselt. "IMAPS" und "POP3S" wurden verwendet, als STARTTLS noch nicht verfügbar war. Die Protokolle IMAP und POP3 wurden einfach "in SSL gewickelt". State of the Art ist STARTTLS.
service imap-login {
  inet_listener imap {
    port=0
  }
}
service pop3-login {
  inet_listener pop3 {
    port=0
  }
}

Für die MySQL-Anbindung folgende Datei erstellen...

nano /etc/dovecot/dovecot-mysql.conf

...und diesen Inhalt einfügen. Auch hier wieder in zweiter Zeile das Passwort für die Datenbank anpassen:

driver = mysql
connect = "host=localhost dbname=postfixdb user=postfix password=MYSQLPW"
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, 5000 AS uid, 5000 AS gid FROM mailbox INNER JOIN domain WHERE username = '%u' AND mailbox.active = '1' AND domain.active = '1'

Im Abschluss den Zugriff auf die Datei absichern:

chmod o-rwx,g+r /etc/dovecot/dovecot-mysql.conf
chgrp vmail /etc/dovecot/dovecot-mysql.conf

Die Dienste für Postfix und Dovecot neustarten, um den Mailserver bereitzustellen:

/etc/init.d/postfix restart
/etc/init.d/dovecot restart

An dieser Stelle noch einmal herzlichen Dank an das großartige How-To auf wyden.com!

Eine E-Mailadresse anlegen

Um eine E-Mailadresse anzulegen, wird postfixadmin im Browser angesurft. Einloggen als Admin und folgende Schritte abarbeiten:

Domain Liste > Neue Domain.

Als Domain wird die Domain definiert, für die der Server zuständig ist.
Standard-Aliase können hinzugefügt werden, dabei handelt es sich etwa um postmaster, hostmaster etc. Der Server ist kein Backup MX.
Um ein Postfach für die Domain zu erstellen, gilt folgendes:

Virtual Liste > Mailbox hinzufügen

Die Einstellungen sind selbsterklärend. Mit diesen Daten authentifiziert sich der Benutzer am Mailserver.

OPTIONAL: Spam- und Virenfilter

Ich habe bewußt die Anpassungen der Postfix-Konfiguration oben weg gelassen, um die Installation optional durchführen zu können.

Zu Beginn werden die notwendigen Pakete installiert. Unter anderem unrar, unzip etc., um Anhänge zu scannen.

apt-get install amavisd-new spamassassin clamav-daemon libnet-dns-perl \
libmail-spf-perl pyzor razor arj bzip2 cabextract \
cpio file gzip nomarch pax rar unrar unzip \
zip zoo

Sollte eines der Pakete nicht gefunden werden, so muss vorab das non-free Repository aktiviert werden:

sed -i 's/wheezy main/wheezy main non-free/g' /etc/apt/sources.list \
&& apt-get update

Oder manuell die Datei /etc/apt/sources.list bearbeiten und für das Debian Repository am Ende (nach main) non-free einfügen, z.B. so:

deb http://ftp.de.debian.org/debian/ wheezy main non-free

Auch in diesem Fall: apt-get update

Es ist möglich, dass während der Installation folgende Fehlermeldung erscheint:

[FAIL] Clamav signatures not found in /var/lib/clamav ... failed!
[FAIL] Please retrieve them using freshclam ... failed!
[FAIL] Then run '/etc/init.d/clamav-daemon start' ... failed!

Hier besteht kein größeres Problem. In diesem Fall wird der clamav-daemon nach der Installation (neu)gestartet:

/etc/init.d/clamav-daemon restart

Nun zwei Gruppenzugehörigkeiten erstellen:

adduser clamav amavis
adduser amavis clamav

ClamAV aktualisiert die Virusdatenbank im Hintergrund eigenständig. Das Intervall beträgt 24mal am Tag (zu diesem Zeitpunkt), ergo jede Stunde. Dieses kann in der Datei "/etc/clamav/freshclam.conf" geändert werden (> "Checks 24").

Damit Spamassassin aktiviert wird und auch diese Datenbank sich automatisch aktualisieren kann, werden in der Datei "/etc/default/spamassassin" folgende Einträge verändert:

ENABLED=1
CRON=1

Die Änderungen übernehmen, indem der Dienst neugestartet wird:

/etc/init.d/spamassassin restart

Amavis ist eine Schnittstelle zwischen dem Mailagent und der Filtersoftware (ClamAV und Spamassassin).
Zur Bereitstellung der Schnittstelle wird die Datei "15-content_filter_mode" geöffnet und folgende Blöcke aktiviert (die Rauten werden entfernt):

/etc/amavis/conf.d/15-content_filter_mode:

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Weitere Einstellungen sind notwendig.

Es folgt ein Eintrag in die Datei "50-user", durch welchen der Spam-Filter auf allen virtuellen Domänen aktivieren wird (vielen Dank an Christian!):
Diesen Eintrag bitte VOR der letzten Zeile in die Datei einfügen und den Benutzernamen, das Passwort sowie den Datenbanknamen der MySQL-Installation anpassen!

/etc/amavis/conf.d/50-user:

@lookup_sql_dsn = (
    ['DBI:mysql:database=postfixdb;host=127.0.0.1;port=3306',
     'postfix',
     'MYSQLPW']);

$sql_select_policy = 'SELECT "Y" as local FROM alias WHERE address IN (%k)';

Weiter Änderungen der Amavis Konfiguration:
/etc/amavis/conf.d/01-debian:

$unrar      = ['rar', 'unrar']; #disabled (non-free, no security support)
#$unrar      = ['unrar-free'];

/etc/amavis/conf.d/05-node_id:

$myhostname = "mail.domain.tld";

Optional kann zusätzlich Folgendes eingestellt werden (Danke an Jan!).
Diese Option ebenfalls unbedingt VOR der letzten Zeile unterbringen!
/etc/amavis/conf.d/50-user:

$virus_admin = "postmaster\@$mydomain";
$spam_admin = "postmaster\@$mydomain";
$banned_quarantine_to = "postmaster\@$mydomain";
$bad_header_quarantine_to = "postmaster\@$mydomain";
$final_spam_destiny = D_PASS;

Diese Optionen bewirken, dass "postmaster@domain.tld" über blockierte E-Mails benachrichtigt wird. Durch "$final_spam_destiny = D_PASS;" würde eine als Spam markierte Nachricht letztendlich an den Benutzer weitergeleitet werden, was durchaus Vorteile hat.

Abschließend Amavis (neu)starten:

/etc/init.d/amavis restart

Um Amavis in Postfix zu aktivieren, werden weitere Schritte benötigt. Zuerst die main.cf mit folgendem Befehl anpassen:

postconf -e "content_filter = smtp-amavis:[127.0.0.1]:10024"

Weiter mit der Datei "/etc/postfix/master.cf", diese mit einem Editor öffnen und folgendes am Ende einfügen:

smtp-amavis     unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Wieder die Einrückungen beachten und beibehalten!

Immer noch in der Datei master.cf, wird eine weitere Änderung vorgenommen.
Aus

pickup    fifo  n       -       -       60      1       pickup

wird

pickup    fifo  n       -       -       60      1       pickup
         -o content_filter=
         -o receive_override_options=no_header_body_checks

Natürlich wieder mit Einrückungen.

Nach einem finalen reload des Postfix Dienstes, ist dieser um einen Spam- und Virenfilter reicher:

/etc/init.d/postfix reload

"netstat -tulpen" sollte nun die Bindungen 127.0.0.1:10025 und 127.0.0.1:10024 anzeigen. Auf "heise" findet sich außerdem die Möglichkeit, eine Test E-Mail mit dem harmlosen EICAR "Virus" zu versenden. Dieser richtet keinen Schaden an und wird ausschließlich dazu eingesetzt, Anti-Viren Funktionen zu überprüfen.

OPTIONAL: Postgrey für Greylisting

Greylisting fordert unbekannte Mailserver eines Absenders dazu auf, seinen Zustellversuch später zu wiederholen. Die Nachricht wird nicht abgelehnt, viel mehr wird mitgeteilt, dass die Zustellung im Moment nicht möglich ist. Dieses Verhalten ist Standardkonform, aber keine Pflicht.
Postgrey ist seit 2011 in der stabilen Version 1.34 vorhanden. Die Paketquellen Wheezys beinhalten diese Version. Zur Information: Ubuntu ab 12.04 LTS ebenfalls.
Die Installation:

apt-get install postgrey

Kam es beim Start des Dienstes zu einem Fehler, so bitte folgende Datei öffnen:

nano /etc/default/postgrey

Der Parameter POSTGREY_OPTS ist im Debian-Standardpaket auf --inet=10023 gesetzt, was in diesem Artikel einsetzbar wäre.
Ungültige Werte wären 10024 oder 10025 - falls der Spam- und Virenfilter eingerichtet wurde.
Der Dienst sollte nach einem "service postgrey restart" lauffähig sein.

Nun Postfix konfigurieren, hierzu die Datei "main.cf" öffnen:

nano /etc/postfix/main.cf

Hier findet sich folgender Eintrag ("reject_unknown_reverse_client_hostname" etc. könnten hier ebenfalls stehen, siehe Hinweis aus der Postfix-Konfiguration):

smtpd_recipient_restrictions = permit_sasl_authenticated
        permit_mynetworks
        reject_unauth_destination
        [...]

Diesen ändern und um "check_policy_service" erweitern/an das Ende anfügen. Der Port "10023" muss dem Port der Datei "/etc/default/postgrey" entsprechen:

smtpd_recipient_restrictions = permit_sasl_authenticated
        permit_mynetworks
        reject_unauth_destination
        [...]
        check_policy_service inet:127.0.0.1:10023

Nach dem Speichern werden Postfix die Änderungen mitgeteilt:

postfix reload

Zum Testen kann eine E-Mail von einem externen Server gesendet werden.
Nach Erhalt der Nachricht:

cat /var/log/mail.log | grep greylist

Die Ausgabe sollte nicht leer sein.

Soll Postgrey für einen oder mehrere Empfänger deaktiviert werden, so reicht eine Änderung folgender Datei:

nano /etc/postgrey/whitelist_recipients

Zu sehen ist, dass E-Mails an "postmaster" sowie "abuse" bereits vom Nutzen des Greylistings ausgeschlossen sind.
Im selben Format kann hier untereinander jeder weitere Empfänger eingetragen werden.
Eine Domäne hinter "@" ist nicht notwendig, kann aber eingetragen werden, falls mehrere Domains konfiguriert sind. Um eine gesamte Domäne auszuschließen, einfach den Domänennamen eintragen, etwa "domain.tld".

Ebenso besteht eine Whitelist für Absender. Die Debian-Installation bringt bereits einige mit. Diese Absender sind dafür bekannt, entweder gar nicht oder nur sehr langsam einen erneuten Versand anzustoßen.
Der Pfad zur Datei lautet "/etc/postgrey/whitelist_clients".
Hinweis: StartSSL.com bietet kostenlose (validierte) Zertifikate. Möchte ich dort meine E-Mailadresse verifizieren, blockiert Postgrey den Eingang und der Vorgang bricht an. Daher empfehle ich an dieser Stelle "gateway.startcom.org" einzufügen.

OPTIONAL: Sieve installieren und Spam in den Ordner "Spam" verschieben

Ich habe mich dazu entschieden, die Installation von Sieve ebenfalls als optional anzuhängen.
Zusätzlich erkläre ich die Einrichtung einer globalen Sieve Regel zum verschieben von Spam in den jeweiligen Spam-Ordner.
Natürlich beziehe ich mich auf die oben eingerichtete Installation zuzüglich des Spam-Filters.

 
Zwei zusätzliche Pakete installieren:

apt-get install dovecot-sieve dovecot-managesieved

Folgendes Verzeichnis anlegen:

mkdir /var/lib/dovecot/sieve/

Nun hier die Datei "default.sieve" erstellen und die Regel zum Verschieben von Spam in den jeweiligen Ordner eintragen:

/var/lib/dovecot/sieve/default.sieve

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Junk";
}

Das eben erstellte Script muss durch sievec noch kompiliert werden:

sievec /var/lib/dovecot/sieve/default.sieve

Die Rechte rekursiv an "vmail" vergeben:

chown -R vmail:vmail /var/lib/dovecot

Es folgen einige Änderungen der Datei "/etc/dovecot/dovecot.conf":

Zwei Optionen steuern die automatische Erstellung- sowie das Abonnement (im Mail-Client) von Unterordnern. Danke Christian für den Hinweis in den Kommentaren!

lda_mailbox_autosubscribe = yes
lda_mailbox_autocreate = yes

"sieve" zu den Protokollen hinzufügen:

protocols = imap pop3 sieve

Das "homedir" der Benutzer definieren, einfach unter "protocols" als eigene Zeile einfügen:

mail_home = /var/vmail/%d/%n

Innerhalb des Protokolls "lda" die Zeile "mail_plugins = $mail_plugins sieve" einfügen, z.B.:

protocol lda {
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = postmaster@domain.tld
  mail_plugins = $mail_plugins sieve
}

An das Ende der Datei noch folgendes anfügen:

plugin {
   sieve_global_path = /var/lib/dovecot/sieve/default.sieve
   sieve_global_dir = /var/lib/dovecot/sieve/
}

Die gesamte dovecot.conf !kann! dann beispielsweise so aussehen:

# 2.1.7: /etc/dovecot/dovecot.conf
# OS: Linux 3.2.0-4-amd64 x86_64 Debian 7.1
auth_mechanisms = plain login
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_home = /var/vmail/%d/%n
lda_mailbox_autosubscribe = yes
lda_mailbox_autocreate = yes
disable_plaintext_auth = yes
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocols = imap pop3 sieve
service auth {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-master {
    mode = 0600
    user = vmail
  }
  user = root
}
listen = *
ssl_cert = 

Den Dovecot-Dienst im Anschluss neustarten:

/etc/init.d/dovecot restart

Durch Sieve sollte nun der Port 4190 offen für Verbindungen sein, zu Überprüfen via "netstat -tulpen | grep -i dovecot":

Netstat mit Dovecot, Sieve
Netstat mit Dovecot, Sieve

Hinweis: Das Mailverzeichnis des jeweiligen Benutzers ("homedir") wird nach einer eigenen Sieve Konfiguration abgesucht. Exisitiert keine, so gelten die in "sieve_global_path" definiverten Regeln. Die Regeln eines Benutzers überschreiben die Globalen!
 
 
Um sich zum Testen Spam zusenden zulassen - natürlich einmalig ;) -, empfehle ich diesen Dienst:
http://www.maysoft.com/selfservespam.nsf/dl

OPTIONAL: Allgemeine Quota

Ganz einfach und ohne viel Aufwand, lässt sich eine allgemeine Quota in Dovecot einrichten. Diese Quota benutzt nicht die Tabelle "quota2" aus der MySQL-Datenbank, hierzu ist einiges mehr an Konfiguration notwendig, auf die ich erst einmal verzichte.

Die Änderungen finden alle in der Datei "dovecot.conf" statt:

nano /etc/dovecot.conf

Folgende Zusätze einfügen, "mail_plugins" an den Anfang setzen:

mail_plugins = quota
[...]
plugin {
  quota = maildir:User quota
  quota_exceeded_message = Quota exceeded
  quota_rule = *:storage=1024M
  quota_rule2 = Trash:storage=+100M
  quota_rule3 = Spam:ignore
  [...]
}
protocol lda {
  [..]
  mail_plugins = $mail_plugins sieve quota
}
protocol imap {
  mail_plugins = quota imap_quota
  [...]
}

Um eine Quota nicht zu erzwingen, kann "quota" in der Sektion "plugin" um die Option "nonenforcing" ergänzt werden:

quota = maildir:User quota:noenforcing

Weiterhin darf der Parameter "quota_exceeded_message" nach eigenen Wünschen angepasst werden.
Die Quota-Regeln ("quota_rule") sind ein Beispiele. Es können beliebig viele erweitert werden, Zusätze werden durchnummeriert ("quota_rule4", "quota_rule5" usw.).
Die erste Regel im Beispiel limitiert die Mailboxen auf 1GB, anstatt "1024M" darf auch mit "1GB" gearbeitet werden.
Zweite Regel erweitert die Quota um 10MB für Nachrichten im Papierkorb.
Dritte Regel ignoriert den Ordner Spam, falls vorhanden.

Anschließend den Diest neustarten:

service dovecot restart

Kleiner Tipp: Via Konsole eine Abfrage des Kontingents eines Benutzers starten:

doveadm quota get -u benutzer.name

OPTIONAL: Attacken durch Fail2Ban reduzieren

Leider ist es so, dass der neue Mail-Server bereits nach einigen Stunden von Spammern attackiert wird. Das lässt sich - wenigstens minimal - durch Fail2Ban verhindern. Bruteforce Attacken können jedenfalls relativ erfolgreich verhindert werden.

Hinweis für Debian Squeeze: Auch wenn nicht ausdrücklich von diesem Artikel abgedeckt, findet ihr HIER eine kleine Hilfe für die Installation eines Filters in Debian Squeeze, da dieser nicht Teil des "Fail2ban" Paketes aus den offiziellen Quellen zu sein scheint. (Danke Funjack für den Hinweis!)

Ist "Fail2Ban" noch nicht installiert, so kann dies folgendermaßen nachgeholt werden:

sudo apt-get install fail2ban

In der Datei "/etc/fail2ban/jail.local" (wird neu angelegt!) folgendes einfügen:

[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
port = pop3,pop3s,imap,imaps
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]
# optionaly mail notification # mail[name=dovecot-pop3imap, dest=root@domain] # see /etc/fail2ban/action$
logpath = /var/log/mail.log

[sasl]
enabled = true
port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter = sasl
logpath = /var/log/mail.log

Anschließend den Dienst neustarten:

/etc/init.d/fail2ban restart

Genauer möchte ich an diesem Punkt nicht auf Fail2Ban eingehen. Mit der Installation wird automatisch auch SSH überwacht. Wer das nicht möchte, muss diese Funktion deaktivieren.
"Bantimes" und mehr global in "jail.conf" definieren oder oben ergänzen. Globale Einstellungen unter "Default" in dieser Konfiguration werden immer überschrieben.

OPTIONAL: Logging nur nach /var/log/mail*

Soll das Syslog vom Maildienst verschont bleiben und Ereignisse nur nach "/var/log/mail*" geschrieben werden, wird der zugehörige Dienst "rsyslog" entsprechend konfiguriert:

sed "s/*.*;auth,authpriv.none/*.*;auth,mail.none,authpriv.none/" -i /etc/rsyslog.conf

Der Befehl ersetzt die zugehörige Zeile durch eine neue, modifizierte Zeile.
Selbstverständlich hat diese Einstellung keinen Einfluss auf das Log-Level.

Einrichtung am Client

Der eingerichtete Mailserver kann nun auf verschiedenen Ports angesprochen werden.

Allgemein
Server: mail.domain.tld
Benutzer: user.name@domain.tld
Passwort: XYZ

IMAP
* Port 143 verschlüsselt nach STARTTLS - TLS wird nach Connect initiiert
Port 993 unmittelbar verschlüsselt, TLS Handshake erfolgt sofort (keine besonderen Vorteile)
Authentifizierungsmethode: PLAIN oder LOGIN, in Thunderbird z.B. "Passwort, normal"
Hinweis: Unverschlüsselte "plain text" Authentifizierung ist deaktiviert.

POP3 (falls nicht deaktiviert)
* Port 110 verschlüsselt nach STARTTLS - TLS wird nach Connect initiiert
Port 995 unmittelbar verschlüsselt, TLS Handshake erfolgt sofort (keine besonderen Vorteile)
Authentifizierungsmethode: PLAIN oder LOGIN, in Thunderbird z.B. "Passwort, normal"
Hinweis: Unverschlüsselte "plain text" Authentifizierung ist deaktiviert.

SMTP
Port 25 unverschlüsselt, Authentifizierung jedoch nicht möglich
Port 25 verschlüsselt nach STARTTLLS - TLS wird nach Connect initiiert
* Port 587 verschlüsselt nach STARTTLS - TLS wird nach Connect initiiert
Hinweis: Ein User speist seine Nachrichten vorrangig auf dem Submission Port 587 in Postfix ein. Hinter Port 25 lauert gelegentlich ein strengeres Regelwerk (in diesem Artikel ist das nicht der Fall), das Verbindungen von Usern ablehnen könnte. Daher bitte nicht angewöhnen über Port 25 zu mailen, außer es ist ausdrücklich Vorschrift.

* = empfohlen/gängig