Postfix/Dovecot Mailserver unter Debian einrichten und mit MySQL und phpMyAdmin verwalten

Einen sicheren Mailserver unter Debian einzurichten ist eine einfache Sache und geht sehr zügig. Das ist nicht nur nützlich um seine E-Mails zu verwalten, sondern auch praktisch für Anwendungen die in der Lage sein sollen E-Mails zu versenden (z.B. PHP Skripte über die mail() Funktion).

Als erstes benötigt der Server (sofern nicht bereits vorhanden) MySQL, denn darüber sollen später ja die Benutzer verwaltet werden.

apt-get update && apt-get upgrade

apt-get install mysql-server

Das Passwort das hier abgefragt wird ist nicht das Password des Systemusers root, sondern des MySQL Users root, der Rechte auf alles hat. Wenn nicht vorhanden, muss dieses hier festgelegt werden. Danach können die nötigen Tabellen für unseren Mailserver erstellt werden.

mysql -u root -p

Danach mit dem eben festgelegten root Passwort einloggen und dann folgende SQL-Befehle feuern:

create database vmail;

use vmail; create table users (id INT UNSIGNED AUTO_INCREMENT NOT NULL, username VARCHAR(128) NOT NULL, domain VARCHAR(128) NOT NULL, password VARCHAR(128) NOT NULL, UNIQUE (id), PRIMARY KEY (username, domain) );

create table domains (id INT UNSIGNED AUTO_INCREMENT NOT NULL, domain VARCHAR(128) NOT NULL, UNIQUE (id), PRIMARY KEY (domain));

create table aliases (id INT UNSIGNED AUTO_INCREMENT NOT NULL, source VARCHAR(128) NOT NULL, destination VARCHAR(128) NOT NULL, UNIQUE (id), PRIMARY KEY (source, destination) );

GRANT ALL ON vmail.* TO 'vmail'@'localhost' IDENTIFIED BY 'vmailpasswort';

Beim letzten Befehl muss "vmailpasswort" natürlich durch ein sicheres, selbstgewähltes Passwort ersetzt werden.

Als nächstes erstellen wir eine Verzeichnisstruktur für die E-Mail-Postfächer unter /var/vmail

mkdir /var/vmail

Jetzt erstellen wir einen eigenen User, der diese Verzeichnisse besitzt und beschreiben darf

sdfduseradd vmail

chown -R vmail:vmail /var/vmail

chmod -R 770 /var/vmail/

Soviel zur Vorbereitung. Jetzt wird dovecot installiert.

apt-get install dovecot-common dovecot-imapd dovecot-mysql dovecot-lmtpd

Jetzt muss die Konfiguration angepasst werden. In /etc/dovecot/conf.d/10-mail.conf folgende Einstellungen setzen (ggf. einkommentieren):

mail_home = /var/vmail/%d/%n
mail_location = maildir:~/mail:LAYOUT=fs
mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail

Danach in /etc/dovecot/dovecot-sql.conf.ext folgende Einstellungen setzen und "vmailpasswort" durch das selbstgewählte Passwort ersetzen:

driver = mysql
connect = host=127.0.0.1 dbname=vmail user=vmail password=vmailpasswort
default_pass_scheme = MD5

password_query = \
SELECT username, domain, password \
FROM users WHERE username = '%n' AND domain = '%d'

In /etc/dovecot/conf.d/10-auth.conf folgende Sicherheitseinstellungen setzen (ggf. sind einige schon vorhanden und müssen entsprechend abgeändert werden):

disable_plaintext_auth = yes

auth_mechanisms = plain login

#!include auth-system.conf.ext

In der Datei /etc/dovecot/dovecot.conf den ganzen Inhalt löschen und stattdessen diesen Inhalt einfügen:

# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol

listen = *, ::

base_dir = /var/run/dovecot/

# Greeting message for clients.
login_greeting = Dovecot ready.

!include conf.d/*.conf
!include_try local.conf

# Passdb SQL
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

In der Datei /etc/dovecot/conf.d/10-master.conf die service auth Sektion folgendermaßen einstellen...

service auth {
    unix_listener auth-userdb {
        mode = 0600
        user = vmail
        group = vmail
    }

    # Postfix smtp-auth
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}

... und die service lmtp Sektion so einstellen:

service lmtp {
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
      mode = 0660
      group = postfix
      user = postfix
    }
    user = vmail
}

Jetzt noch in /etc/dovecot/conf.d/15-lda.conf unter

postmaster_address =

eine gültige Adresse eintragen an die Fehlermeldungen des Servers versendet werden sollen.

In der Datei /etc/dovecot/conf.d/10-ssl.conf können Sicherheitseinstellungen vorgenommen werden.

ssl = required
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem
ssl_cipher_list = 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
ssl_protocols = !SSLv2 !SSLv3
ssl_prefer_server_ciphers = yes

Jetzt wird Postfix installiert

apt-get install postfix postfix-mysql

Während der Installation sollte ein kleines Setup durchlaufen werden. Falls nicht, kann es mit...

dpkg-reconfigure postfix

... neu augelöst werden. Ansonsten einfach Internet-Site wählen und als Server den Domainnamen des Servers nehmen, z.B. ubuntu-server.local o.ä.

Die Datei /etc/postfix/main.cf kann wieder komplett geleert und mit folgendem Inhalt befüllt werden:

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

append_dot_mydomain = no

readme_directory = no

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mydestination =
mailbox_size_limit = 51200000
message_size_limit = 51200000
recipient_delimiter =
inet_interfaces = all
myorigin = ubuntu-server
inet_protocols = all

##### TLS parameters ######
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

###### SASL Auth ######
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

###### Use Dovecot LMTP Service to deliver Mails to Dovecot ######
virtual_transport = lmtp:unix:private/dovecot-lmtp

##### Only allow mail transport if client is authenticated or in own network (PHP Scripts, ...) ######
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

###### MySQL Connection ######
virtual_alias_maps = mysql:/etc/postfix/virtual/mysql-aliases.cf
virtual_mailbox_maps = mysql:/etc/postfix/virtual/mysql-maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/virtual/mysql-domains.cf
local_recipient_maps = $virtual_mailbox_maps

Für „myorigin” wird wieder die Domain des Servers eingetragen und die beiden *_size_limit Parameter sind Werte in Byte, die die maximale Größe für Mailbox und Message definieren. Am besten etwas höher stellen, wenn der Server es hergibt. Wer außerdem wieder gültige Zertifikate besitzt, sollte diese oben bei TLS parameters anstelle der ssl-cert-snakeoil.pem und .key Dateien verlinken.

Anschließend in der Datei /etc/postfix/master.cf den kompletten "submission"-Block inkl -o Parameter löschen und durch diesen ersetzen:

submission inet n       -       -       -       -       smtpd -v
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Jetzt noch die nötigen Ordner anlegen und berechtigen:

mkdir /etc/postfix/virtual
chmod 660 /etc/postfix/virtual/
cd /etc/postfix/virtual

Darin dann eine neue Datei mysql-aliases.cf erstellen und mit folgendem Inhalt befüllen (vmailpasswort logischerweise durch das selbst gewählte Passwort ersetzen):

user = vmail
password = vmailpasswort
hosts = 127.0.0.1
dbname = vmail
query = SELECT destination FROM aliases WHERE source='%s'

Im selben Ordner dann eine Datei namens mysql-maps.cf erstellen und befüllen (auch hier auf vmailpasswort achten):

user = vmail
password = vmailpasswort
hosts = 127.0.0.1
dbname = vmail
query = SELECT * FROM users WHERE username='%u' AND domain='%d'

Und zuguterletzt unter Berücksichtigung von vmailpasswort auch die Datei mysql-domains.cf anlegen und befüllen:

user = vmail
password = vmailpasswort
hosts = 127.0.0.1
dbname = vmail
query = SELECT * FROM domains WHERE domain='%s'

Das war's mit der Konfiguration. Bevor wir den Server neustarten, muss die Datenbank mit einem ersten Benutzer befüllt werden. Dazu entweder händisch die Konsole bedienen, oder mit phpMyAdmin einloggen und User anlegen. Hier ein paar Beispielkommandos für die Konsole:

mysql -u root -p
use vmail;
insert into domains (domain) values ('allvintage.net');
insert into users (username, domain, password) values ('webmaster', 'allvintage.net', MD5('MeinMd5VerschluesseltesPasswort'));
insert into aliases (source, destination) values ('support@allvintage.net', 'webmaster@allvintage.net');
exit;

//Nicht vergessen alle Services neuzustarten
service dovecot restart
service postfix reload
service postfix restart

//Die Einrichtung im Webserver funktioniert jetzt übrigens per STARTTLS mit IMAP Port 143 und SMTP Port 25 bzw 587

Kommentare

In der Übersicht steht Debian. In der Main.cf steht Ubuntu. Was jetzt?