Mail Server mit Postfix, Dovecot und PostgreSQL
01.06.2024
Die folgende Anleitung ist meine gekürzte Anpassung an PostgreSQL der ausgezeichneten ISPmail Guide for Debian von Christoph Haas.
Basisinstallation
-
Nachdem Sie Debian 12 auf Ihrem Server installiert haben, installieren Sie als root folgende Pakete:
apt install sudo rsync pwgen screen
-
Installieren Sie Apache mit PHP 8.2:
sudo apt install apache2 php8.2 php8.2-cli php-pear php8.2-pgsql
Achtung: Aktivieren den folgenden Block in /etc/apache2/apache2.conf, um /srv als DocumentRoot verwenden zu können:
<Directory /srv/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
-
Konfigurieren Sie den Virtual Host default in der Datei /etc/apache2/sites-available/000-default.conf:
<VirtualHost *:80> ServerName *meinserver.meinedomain.de* ServerAdmin webmaster@meinedomain.de DocumentRoot /srv/vhosts/default <Directory /srv/vhosts/default> AuthName "MeinServer Adm" AuthType Basic AuthUserFile /etc/apache2/users/meinserver Require valid-user </Directory> <Directory /srv/vhosts/orion/default/.well-known/acme-challenge> AllowOverride None Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined RewriteEngine On RewriteCond %{REQUEST_URI} !.well-known/acme-challenge RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L] </VirtualHost>
Bemerkungen:
-
Das Verzeichnis /etc/apache2/users muss von Hand angelegt werden.
-
Die Datei etc/apache2/users/meinserver erzeugen Sie mit htpasswd. Nicht vergessen, den Apache-Server dann neu zu starten:
sudo systemctl restart apache2
-
-
Die für die Verwaltung des Mail-Servers benötigten Pakete installieren:
sudo apt install postfix postfix-pgsql postfix-doc dovecot-common dovecot-imapd dovecot-pop3d dovecot-managesieved dovecot-pgsql dovecot-lmtpd libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin openssl telnet bsd-mailx postgresql-13 postgresql-contrib swaks
-
Das rspamd-Programm installieren:
sudo apt install rspamd
-
Let’s encrypt installieren und ein SSL-Zertifikat für den Hostname des Servers generieren:
apt install certbot certbot certonly --webroot --webroot-path /srv/vhosts/orion/default -d meinserver.meinedomain.de
-
Folgende Zeile in der Datei /etc/letsencrypt/cli.ini hinzufügen:
post-hook = systemctl restart postfix dovecot apache2
-
Konfigurieren Sie den Virtual Host default-ssl in der Datei /etc/apache2/sites-available/default-ssl.conf:
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerName meinserver.meinedomain.de ServerAdmin webmaster@meinedomain.de DocumentRoot /srv/vhosts/default <Directory /srv/vhosts/default> AuthName "MeinServer Adm" AuthType Basic AuthUserFile /etc/apache2/users/meinserver Require valid-user </Directory> <Directory /srv/vhosts/orion/default/.well-known/acme-challenge> AllowOverride None Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/meinserver.meinedomain.de/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/meinserver.meinedomain.de/privkey.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule>
Ist die neue Virtual-Host-Konfiguration bereit, dann sollten Sie das Modul ssl aktivieren und den Apache-Server neu zu starten:
sudo a2enmod ss sudo systemctl restart apache2
-
Erzeugen Sie einen PostgreSQL-Benutzer mailadm für die Verwaltung der Mail-Server-Datenbank:
sudo -u postgres createuser -P -E -d mailadm
Achtung: Notieren Sie sich das Passwort!
-
Erzeugen Sie einen PostgreSQL-Benutzer mailusr, der von den verschiedenen Diensten für den lesenden Zugriff auf die Mail-Server-Datenbank benötigt wird:
sudo -u postgres createuser -P -E -d mailusr
Achtung: Notieren Sie sich das Passwort!
-
Erzeugen Sie die PostgreSQL-Datenbank mailserver:
sudo -u postgres createdb -O mailadm -E UTF-8 mailserver
Vergessen Sie bitte nicht, die Datei /etc/postgresql/11/main/pg_hba.conf so anzupassen, dass die Benutzer mailadm und mailusr lokalen Zugriff auf Sie bekommen:
local mailserver mailadm md5 local mailserver mailusr md5
-
Erzeugen Sie eine Datei mailserver.sql mit folgendem Inhalt:
CREATE TABLE virtual_domains ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL ); CREATE TABLE virtual_users ( id SERIAL PRIMARY KEY, domain_id INTEGER REFERENCES virtual_domains ON DELETE CASCADE, password VARCHAR(150) NOT NULL, quota BIGINT DEFAULT 0, email VARCHAR(100) NOT NULL UNIQUE ); CREATE TABLE virtual_aliases ( id SERIAL PRIMARY KEY, domain_id INTEGER REFERENCES virtual_domains ON DELETE CASCADE, source VARCHAR(100) NOT NULL, destination VARCHAR(100) NOT NULL );
-
Dann führen Sie den Befehl
pgsql -U mailadm mailserver < mailserver.sql
aus, um die Tabellen zu konfigurieren.
-
Der Benutzer mailusr soll nur lesenden Zugriff auf die Tabellen der Datenbank mailserver bekommen:
psql -U mailadm mailserver GRANT SELECT ON ALL TABLES IN SCHEMA public TO mailusr; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO mailusr;
-
Vergewissern Sie sich, dass Postfix auf allen Interfaces antwortet:
sudo postconf -e inet_interfaces=all
-
Legen Sie die Datei /etc/postfix/pgsql-virtual-mailbox-domains.cf mit folgendem Inhalt an:
user = mailusr password = <Das Passwort von mailusr> hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
-
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
sudo postconf -e virtual_mailbox_domains=pgsql:/etc/postfix/pgsql-virtual-mailbox-domains.cf
-
Legen Sie die Datei /etc/postfix/pgsql-virtual-mailbox-maps.cf mit folgendem Inhalt an:
user = mailusr password = the_password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
-
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
sudo postconf -e virtual_mailbox_maps=pgsql:/etc/postfix/pgsql-virtual-mailbox-maps.cf
-
Legen Sie die Datei /etc/postfix/pgsql-virtual-alias-maps.cf mit folgendem Inhalt an:
user = mailusr password = the_password hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
-
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
sudo postconf -e virtual_alias_maps=pgsql:/etc/postfix/pgsql-virtual-alias-maps.cf
-
Legen Sie die Datei /etc/postfix/pgsql-email2email.cf mit folgendem Inhalt an:
user = mailusr password = the_password hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s'
-
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
sudo postconf -e virtual_alias_maps=pgsql:/etc/postfix/pgsql-virtual-alias-maps.cf,pgsql:/etc/postfix/pgsql-email2email.cf
-
Ändern Sie die Zugriffsrechte der Dateien /etc/postfix/pgsql-*.cf:
sudo chgrp postfix /etc/postfix/pgsql-.cf sudo chmod u=rw,g=r,o= /etc/postfix/pgsql-.cf
-
Erzeugen Sie die Gruppe vmail und den Benutzer vmail, dem alle Mailboxen gehören werden:
sudo groupadd -g 2000 vmail sudo useradd -g vmail -u 2000 vmail -d /srv/vmail -m
-
Passen Sie die Datei /etc/dovecot/conf.d/10-auth.conf wie folgend an:
-
Vergewissern Sie sich, dass die folgende Zeile vorhanden ist:
auth_mechanisms = plain login
-
Aktivieren Sie die folgende Zeile:
!include auth-sql.conf.ext
und deaktivieren Sie alle anderen Zeilen dieses Typs.
-
-
Ändern Sie die Datei /etc/dovecot/conf.d/auth-sql.conf.ext so, dass sie den folgenden Block enthält:
userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext }
-
Ändern Sie die Datei /etc/dovecot/conf.d/10-mail.conf so, dass sie die folgenden Zeilen enthält:
mail_location = /srv/vmail/%d/%n/Maildir mail_plugins = quota
-
Ändern Sie die Datei /etc/dovecot/conf.d/10-master.conf so, dass der Block service auth folgende Anweisungen enthält:
# Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix }
-
Verändern Sie die Datei /etc/dovecot/conf.d/10-ssl.conf so, dass sie folgende Zeilen enthält:
ssl = required ssl_cert = </etc/letsencrypt/live/meinserver.meinedomain.de/fullchain.pem ssl_key = </etc/letsencrypt/live/meinserver.meinedomain.de/privkey.pem
-
Die Datei /etc/dovecot/conf.d/15-mailboxes.conf so anpassen, dass sie den folgenden Block enthält:
mailbox Junk { auto = subscribe special_use = \Junk autoexpunge = 30d } mailbox Trash { auto = subscribe special_use = \Trash autoexpunge = 90d }
-
Die Datei /etc/dovecot/dovecot-sql.conf.ext so anpassen, dass sie folgende Zeilen enthält:
default_pass_scheme = BLF-CRYPT driver = pgsql connect = host=127.0.0.1 dbname=mailserver user=mailusr password=the_password user_query = SELECT email as user, CONCAT('*:bytes=', quota) AS quota_rule, '/srv/vmail/%d/%n' AS home, 2000 AS uid, 2000 AS gid FROM virtual_users WHERE email='%u' password_query = SELECT password FROM virtual_users WHERE email='%u' iterate_query = SELECT email AS user FROM virtual_users
Falls Sie den Benutzern die Möglichkeit geben möchten, sich per alias und/oder im case-insensitive-Modus anzumelden, verwenden Sie die folgende Query:
password_query = SELECT password FROM virtual_users WHERE email=LOWER('%u') UNION SELECT destination FROM virtual_aliases WHERE source=LOWER('%u');
-
Die Zugriffsrechte für etc/dovecot/dovecot-sql.conf.ext wie folgend anpassen:
sudo chown root:root /etc/dovecot/dovecot-sql.conf.ext sudo chmod go= /etc/dovecot/dovecot-sql.conf.ext
-
Die Datei /etc/dovecot/conf.d/10-master.conf so anpassen, dass sie den folgenden Block enthält:
service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } }
Dann noch Dovecot neu starten:
sudo systemctl restart dovecot
-
Die Datei /etc/dovecot/conf.d/20-lmtp.conf so anpassen, dass sie in der Sektion protocol lmtp die folgende Anweisung enthält:
mail_plugins = $mail_plugins sieve
Anschliessend Dovecot neu starten:
sudo systemctl restart dovecot
-
Die Konfiguration von Postfix wie folgend anpassen:
sudo postconf virtual_transport=lmtp:unix:private/dovecot-lmtp
-
Die Datei /etc/dovecot/conf.d/90-quotas.conf so anpassen, dass sie den folgenden Block enthält:
plugin { quota = maildir:User quota quota_status_success = DUNNO quota_status_nouser = DUNNO quota_status_overquota = "452 4.2.2 Mailbox is full and cannot receive any more emails" }
-
Der Datei /etc/dovecot/conf.d/90-quotas.conf noch folgende Blöcke hinzufügen:
service quota-status { executable = /usr/lib/dovecot/quota-status -p postfix unix_listener /var/spool/postfix/private/quota-status { user = postfix } } 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 } service quota-warning { executable = script /usr/local/bin/quota-warning.sh unix_listener quota-warning { group = dovecot mode = 0660 } }
Anschliessend Dovecot neu starten:
sudo systemctl restart dovecot
-
Eine Datei namens /usr/local/bin/quota-warning.sh mit folgendem Inhalt erzeugen:
#!/bin/sh PERCENT=$1 USER=$2 cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing" From: postmaster@eurisco.com Subject: Quota warning - $PERCENT% reached Your mailbox can only store a limited amount of emails. Currently it is $PERCENT% full. If you reach 100% then new emails cannot be stored. Thanks for your understanding. EOF
Die Datei dann als ausführbaren Script konfigurieren:
sudo chmod +x /usr/local/bin/quota-warning.sh
-
Folgende Befehle ausführen, um die Konfiguration von Postfix anzupassen:
sudo postconf smtpd_recipient_restrictions=reject_unauth_destination,"check_policy_service unix:private/quota-status" sudo postconf smtpd_sasl_type=dovecot sudo postconf smtpd_sasl_path=private/auth sudo postconf smtpd_sasl_auth_enable=yes sudo postconf smtpd_tls_security_level=may sudo postconf smtpd_tls_auth_only=yes sudo postconf smtpd_tls_cert_file=/etc/letsencrypt/live/orion.eurisco.ch/fullchain.pem sudo postconf smtpd_tls_key_file=/etc/letsencrypt/live/orion.eurisco.ch/privkey.pem sudo postconf smtpd_sender_login_maps=pgsql:/etc/postfix/pgsql-email2email.cf
-
Die Datei /etc/postfix/master.cf wie folgend anpassen:
submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_tls_auth_only=yes -o smtpd_reject_unlisted_recipient=no -o smtpd_recipient_restrictions= -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING -o smtpd_sender_restrictions=reject_sender_login_mismatch,permit_sasl_authenticated,reject
-
Postfix neu starten:
sudo systemctl restart postfix
Konfiguration der Anti-Spam-Software rspamd
-
Folgende Befehle eingeben:
sudo postconf smtpd_milters=inet:127.0.0.1:11332 sudo postconf non_smtpd_milters=inet:127.0.0.1:11332 sudo postconf milter_mail_macros="i {mail_addr} {client_addr} {client_name} {auth_authen}"
-
Die Datei /etc/rspamd/override.d/milter_headers.conf mit dem folgenden Inhalt erzeugen:
extended_spam_headers = true;
und dann rspamd neu starten:
sudo systemctl restart rspamd
-
Die Datei /etc/dovecot/conf.d/90-sieve.conf so ändern, dass sie die folgende Zeile enthält:
sieve_after = /etc/dovecot/sieve-after
-
Verzeichnis /etc/dovecot/sieve-after anlegen.
-
Die Datei /etc/dovecot/sieve-after/spam-to-folder.sieve mit dem folgenden Inhalt anlegen:
require ["fileinto","mailbox"]; if header :contains "X-Spam" "Yes" { fileinto :create "Junk"; stop; }
-
Die soeben angelegte Datei mit dem folgenden Befehl kompilieren:
sievec /etc/dovecot/sieve-after/spam-to-folder.sieve
Anschliessend Dovecot neu starten:
sudo systemctl restart dovecot
-
Die Datei /etc/rspamd/override.d/classifier-bayes.conf mit dem folgenden Inhalt anlegen:
autolearn = true;
-
Die Datei /etc/dovecot/conf.d/20-imap.conf mit dem folgenden Inhalt anlegen:
mail_plugins = $mail_plugins imap_sieve
-
Den Inhalt der Datei /etc/dovecot/conf.d/90-sieve.conf so anpassen, dass der Block plugin folgende Zeilen enthält:
# From elsewhere to Junk folder imapsieve_mailbox1_name = Junk imapsieve_mailbox1_causes = COPY imapsieve_mailbox1_before = file:/etc/dovecot/sieve/learn-spam.sieve # From Junk folder to elsewhere imapsieve_mailbox2_name = * imapsieve_mailbox2_from = Junk imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_before = file:/etc/dovecot/sieve/learn-ham.sieve sieve_pipe_bin_dir = /etc/dovecot/sieve sieve_global_extensions = +vnd.dovecot.pipe sieve_plugins = sieve_imapsieve sieve_extprograms
-
Das Verzeichnis /etc/dovecot/sieve anlegen:
sudo mkdir /etc/dovecot/sieve
-
Die Datei /etc/dovecot/sieve/learn-spam.sieve mit folgendem Inhalt anlegen:
require ["vnd.dovecot.pipe", "copy", "imapsieve"]; pipe :copy "rspamd-learn-spam.sh";
-
Die Datei /etc/dovecot/sieve/learn-ham.sieve mit folgendem Inhalt anlegen:
require ["vnd.dovecot.pipe", "copy", "imapsieve", "variables"]; if string "${mailbox}" "Trash" { stop; } pipe :copy "rspamd-learn-ham.sh";
-
Die beiden soeben angelegten Script kompilieren und ihre Zugriffsrechte ändern:
sudo sievec /etc/dovecot/sieve/learn-spam.sieve sudo sievec /etc/dovecot/sieve/learn-ham.sieve sudo chmod u=rw,go= /etc/dovecot/sieve/learn-{spam,ham}.{sieve,svbin} sudo chown vmail.vmail /etc/dovecot/sieve/learn-{spam,ham}.{sieve,svbin}
-
Den Script /etc/dovecot/sieve/rspamd-learn-spam.sh mit folgendem Inhalt anlegen:
#!/bin/sh exec /usr/bin/rspamc learn_spam
-
Den Script /etc/dovecot/sieve/rspamd-learn-ham.sh mit folgendem Inhalt anlegen:
#!/bin/sh exec /usr/bin/rspamc learn_ham
-
Die Zugriffsrechte der beiden soeben angelegten Scripts anpassen:
sudo chmod u=rwx,go= /etc/dovecot/sieve/rspamd-learn-{spam,ham}.sh sudo chown vmail.vmail /etc/dovecot/sieve/rspamd-learn-{spam,ham}.sh
-
Dovecot neu starten:
sudo systemctl restart dovecot
Installation und Konfiguration der Antiviren-Software ClamAV
-
Die benötigten Pakete installieren:
sudo apt install clamav clamav-daemon clamav-unofficial-sigs
-
Die Viren-Datenbank manuell aktualisieren:
sudo service clamav-daemon stop sudo freschclam sudo service clamav-daemon start
-
rspamd so konfigurieren, dass es ClamAV verwendet:
-
Die Datei /etc/rspamd/override.d/antivirus.conf mit folgendem Inhalt anlegen:
clamav { symbol = "CLAM_VIRUS"; type = "clamav"; action = "reject"; servers = "/var/run/clamav/clamd.ctl"; }
-
-
rspamd neu starten:
sudo systemctl restart rspamd
Viel Spass mit Ihrem neuen Mail-Server!