TODO: Postfix E-Mail-Server mit Dovecot, MySQL und SpamAssasin


Vorwort



Installation


MySQL


Installieren Sie den MySQL-Server mit folgendem Befehl:
apt-get install mysql-server

Postfix


Für den SMTP Versand und Empfang wird Postfix benötigt, Postfix installieren Sie wie folgt:
apt-get install postfix postfix-mysql

Dovecot


Dovecot stellt den Clients POP und IMAP zu Verfügung und kann wie folgt installiert werden (Optional, sinnvoll bei Webhosting-Umgebungen):
apt-get install dovecot-core dovecot-pop3d dovecot-imapd dovecot-lmtpd dovecot-mysql

SpamAssassin


SPAM Filter um unerwünschte E-Mails auszufiltern:
apt-get install spamassassin spamc


Konfiguration


MySQL


Wechseln Sie in die MySQL Konsole mit:
mysql -uroot -p
Enter password: JWz2f9yMvmabkBH

Erstellen Sie eine neue Datenbank mit dem Namen mail:
CREATE DATABASE mail;
Query OK, 1 row affected (0.00 sec)

Nachdem Sie die Datenbank erstellt haben, müssen Sie noch einen Benutzer erstellen:
GRANT SELECT ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'JWz2f9yMvmabkBH';

Nun laden Sie die MySQL Berechtigungen neu:
FLUSH PRIVILEGES;

Wechseln Sie nun in die neue Datenbank:
USE mail;

Erstellen Sie nun die MySQL Tabellen:
CREATE TABLE `virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Legen Sie nun eine Domain und einen Benutzer an:
INSERT INTO `mail`.`virtual_domains` VALUES ('1', '4b42.com');
INSERT INTO `mail`.`virtual_users` VALUES ('1', '1', ENCRYPT('JWz2f9yMvmabkBH', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'admin@4b42.com');
INSERT INTO `mail`.`virtual_aliases` VALUES ('1', '1', 'kevin.buehl@4b42.com', 'admin@4b42.com');

Nun können Sie die MySQL Konsole verlassen:
exit


Postfix


Öffnen Sie die Postfix Mailserver Konfiguration:
nano /etc/postfix/main.cf

Fügen Sie die folgenden Parameter am Ende der Konfigurationsdatei ein:
# TLS parameters
smtpd_tls_cert_file=/usr/share/ssl-cert/4b42.crt
smtpd_tls_key_file=/usr/share/ssl-cert/4b42.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
# SASL parameters
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

mydestination = localhost
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf


Erstellen Sie nun die Konfigurationsdatei für die Mailbox Domains:
nano /etc/postfix/mysql-virtual-mailbox-domains.cf

user = mail
password = JWz2f9yMvmabkBH
hosts = 127.0.0.1
dbname = mail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Starten Sie Postfix neu:
/etc/init.d/postfix restart

[ ok ] Stopping Postfix Mail Transport Agent: postfix.
[ ok ] Starting Postfix Mail Transport Agent: postfix.

Nun können Sie die Konfiguration prüfen:
postmap -q 4b42.ch mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

1

Des gleiche noch die die Mailbox Benutzer:
nano /etc/postfix/mysql-virtual-mailbox-maps.cf

user = mail
password = JWz2f9yMvmabkBH
hosts = 127.0.0.1
dbname = mail
query = SELECT 1 FROM virtual_users WHERE email='%s'

Starten Sie Postfix neu:
/etc/init.d/postfix restart

[ ok ] Stopping Postfix Mail Transport Agent: postfix.
[ ok ] Starting Postfix Mail Transport Agent: postfix.

Nun können Sie die Konfiguration prüfen:
postmap -q admin@4b42.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

1


Als letztes noch für die Aliase
nano /etc/postfix/mysql-virtual-alias-maps.cf

user = mail
password = JWz2f9yMvmabkBH
hosts = 127.0.0.1
dbname = mail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Starten Sie Postfix neu:
/etc/init.d/postfix restart

[ ok ] Stopping Postfix Mail Transport Agent: postfix.
[ ok ] Starting Postfix Mail Transport Agent: postfix.

Nun können Sie die Konfiguration prüfen:
postmap -q kevin.buehl@4b42.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

admin@4b42.com


nano /etc/postfix/master.cf

Entfernen Sie die # Raute vor den folgenden Zeilen:
submission inet n       -       -       -       -       smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject


Dovecot


nano /etc/dovecot/dovecot.conf

Fügen Sie folgendende Zeile hinzu
protocols = imap pop3 lmtp

Die Konfiguration sieht dann in etwa so aus:
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp


Nun zur Mail Konfigurationsdatei:
nano /etc/dovecot/conf.d/10-mail.conf

Suchen Sie folgende Parameter und passen Sie die Werte an:
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail


Erstellen Sie eine neue Gruppe und einen neuen Benutzer:
groupadd -g 5000 vmail && useradd -g vmail -u 5000 vmail -d /var/mail

Passen Sie die Berechtigungen des Ordners mail an:
chown -R vmail:vmail /var/mail


nano /etc/dovecot/conf.d/10-auth.conf

Passen Sie die folgenden Parameter wie folgt an:
auth_mechanisms = plain login digest-md5
#!include auth-system.conf.ext
!include auth-sql.conf.ext


nano /etc/dovecot/conf.d/auth-sql.conf.ext

Passen Sie die Konfiguration wie folgt an:
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}


nano /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail password=JWz2f9yMvmabkBH
default_pass_scheme = PLAIN
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Passen Sie nun die Berechtigungen an:
chown -R vmail:dovecot /etc/dovecot && chmod -R o-rwx /etc/dovecot


Nun werden die Protokolle konfiguriert:
nano /etc/dovecot/conf.d/10-master.conf

Passen Sie folgende Zeilen an:
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
user = dovecot
}
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn't necessary, the user should be changed to
# $default_internal_user.
user = vmail
}



SSL aktiveren
nano /etc/dovecot/conf.d/10-ssl.conf

ssl = required
ssl_cert = </usr/share/ssl-cert/4b42.crt
ssl_key = </usr/share/ssl-cert/4b42.key


Quota


aptitude install dovecot-sieve

nano /etc/dovecot/conf.d/90-quota.conf

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
}

plugin {
quota_warning = storage=95%% quota-warning 95 %u
quota_warning2 = storage=80%% quota-warning 80 %u
quota_warning3 = -storage=100%% quota-warning below %u # user is no longer over quota
}

service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
# use some unprivileged user for executing the quota warnings
user = vmail
unix_listener quota-warning {
}
}

plugin {
# allow user to become max 10% over quota
quota_grace = 10%%
# allow user to become max 50 MB over quota
quota_grace = 50 M
}

doveadm quota get -u admin@lingo.4b42.net


nano /usr/local/bin/quota-warning.sh

#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@domain.com
Subject: quota warning

Your mailbox is now $PERCENT% full.
EOF


SpamAssassin


Erstellen Sie einen Benutzer für SpamAssassin
adduser spamd --disabled-login

Lege Benutzer »spamd« an ...
Lege neue Gruppe »spamd« (1001) an ...
Lege neuen Benutzer »spamd« (1001) mit Gruppe »spamd« an ...
Erstelle Home-Verzeichnis »/home/spamd« ...
Kopiere Dateien aus »/etc/skel« ...
Benutzerinformationen für spamd werden geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
Vollständiger Name []: SpamAssassin
Zimmernummer []:
Telefon geschäftlich []:
Telefon privat []:
Sonstiges []:
Sind die Informationen korrekt? [J/n] j

Öffnen Sie nun die Konfigurationsdatei
nano /etc/default/spamassassin

Passen Sie die Parameter wie folgt an:
ENABLED=1
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir -s /var/log/spamd.log"
CRON=1

Spamfilter-Einstellungen:
nano /etc/spamassassin/local.cf

rewrite_header Subject  *** SPAM ***
report_safe 0
trusted_networks 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
required_score 5.0
use_bayes 1
bayes_auto_learn 1
use_bayes_rules 1
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
skip_rbl_checks 0
use_razor2 0
use_dcc 0
use_pyzor 0


nano /etc/postfix/master.cf

Passen Sie die smtp Zeile wie folgt an:
smtp      inet  n       -       -       -       -       smtpd
-o content_filter=spamassassin
und fügen Sie ganz unten folgenden Code ein:
spamassassin unix -     n       n       -       -       pipe
user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}