Basisinstallation
- Nachdem Sie Debian 11 auf Ihrem Server installiert haben, installieren Sie als root folgende Pakete:
Code: Alles auswählen
apt install sudo rsync pwgen screen
- Installieren Sie Apache mit PHP 7.4:
Achtung: Aktivieren den folgenden Block in /etc/apache2/apache2.conf, um /srv als DocumentRoot verwenden zu können:
Code: Alles auswählen
sudo apt install apache2 php7.4 php7.4-cli php-pear php7.4-pgsql
Code: Alles auswählen
<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:
Bemerkungen:
Code: Alles auswählen
<VirtualHost *:80> ServerName [i]meinserver.meinedomain.de[/i] ServerAdmin webmaster@meinedomain.de DocumentRoot /srv/vhosts/default <Directory /srv/vhosts/orion/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>
- Das Verzeichnis /etc/apache2/users muss von Hand angelegt werden.
- Die Datei etc/apache2/users/meinserver erzeugen Sie mit htpasswd.
Code: Alles auswählen
sudo systemctl restart apache2
- Die für die Verwaltung des Mail-Servers benötigten Pakete installieren:
Code: Alles auswählen
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:
Code: Alles auswählen
sudo apt install rspamd
- Let's encrypt installieren und ein SSL-Zertifikat für den Hostname des Servers generieren:
Code: Alles auswählen
apt install certbot
Code: Alles auswählen
certbot certonly --webroot --webroot-path /srv/vhosts/orion/default -d meinserver.meinedomain.de
- Folgende Zeile in der Datei /etc/letsencrypt/cli.ini hinzufügen:
Code: Alles auswählen
post-hook = systemctl restart postfix dovecot apache2
- Konfigurieren Sie den Virtual Host default-ssl in der Datei /etc/apache2/sites-available/default-ssl.conf:
Ist die neue Virtual-Host-Konfiguration bereit, dann sollten Sie das Modul ssl aktivieren und den Apache-Server neu zu starten:
Code: Alles auswählen
<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>
Code: Alles auswählen
sudo a2enmod ss sudo systemctl restart apache2
- Erzeugen Sie einen PostgreSQL-Benutzer mailadm für die Verwaltung der Mail-Server-Datenbank:
Achtung: Notieren Sie sich das Passwort!
Code: Alles auswählen
sudo -u postgres createuser -P -E -d mailadm
- Erzeugen Sie einen PostgreSQL-Benutzer mailusr, der von den verschiedenen Diensten für den lesenden Zugriff auf die Mail-Server-Datenbank benötigt wird:
Achtung: Notieren Sie sich das Passwort!
Code: Alles auswählen
sudo -u postgres createuser -P -E -d mailusr
- Erzeugen Sie die PostgreSQL-Datenbank 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:
Code: Alles auswählen
sudo -u postgres createdb -O mailadm -E UTF-8 mailserver
Code: Alles auswählen
local mailserver mailadm md5 local mailserver mailusr md5
- Erzeugen Sie eine Datei mailserver.sql mit folgendem Inhalt:
Dann führen Sie den Befehl
Code: Alles auswählen
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 );
aus, um die Tabellen zu konfigurieren.Code: Alles auswählen
pgsql -U mailadm mailserver < mailserver.sql
- Der Benutzer mailusr soll nur lesenden Zugriff auf die Tabellen der Datenbank mailserver bekommen:
Code: Alles auswählen
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:
Code: Alles auswählen
sudo postconf -e inet_interfaces=all
- Legen Sie die Datei /etc/postfix/pgsql-virtual-mailbox-domains.cf mit folgendem Inhalt an:
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
Code: Alles auswählen
user = mailusr password = <Das Passwort von mailusr> hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
Code: Alles auswählen
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:
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
Code: Alles auswählen
user = mailusr password = the_password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s'
Code: Alles auswählen
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:
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
Code: Alles auswählen
user = mailusr password = the_password hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
Code: Alles auswählen
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:
Anschliessend aktualisieren Sie die Postfix-Konfiguration:
Code: Alles auswählen
user = mailusr password = the_password hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s'
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Code: Alles auswählen
auth_mechanisms = plain login
- Aktivieren Sie die folgende Zeile:
und deaktivieren Sie alle anderen Zeilen dieses Typs.
Code: Alles auswählen
!include auth-sql.conf.ext
- Vergewissern Sie sich, dass die folgende Zeile vorhanden ist:
- Ändern Sie die Datei /etc/dovecot/conf.d/auth-sql.conf.ext so, dass sie den folgenden Block enthält:
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Code: Alles auswählen
# 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:
Code: Alles auswählen
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:
Code: Alles auswählen
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:
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:
Code: Alles auswählen
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
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Dann noch Dovecot neu starten:
Code: Alles auswählen
service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } }
Code: Alles auswählen
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:
Anschliessend Dovecot neu starten:
Code: Alles auswählen
mail_plugins = $mail_plugins sieve
Code: Alles auswählen
sudo systemctl restart dovecot
- Die Konfiguration von Postfix wie folgend anpassen:
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Anschliessend Dovecot neu starten:
Code: Alles auswählen
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 } }
Code: Alles auswählen
sudo systemctl restart dovecot
- Eine Datei namens /usr/local/bin/quota-warning.sh mit folgendem Inhalt erzeugen:
Die Datei dann als ausführbaren Script konfigurieren:
Code: Alles auswählen
#!/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
Code: Alles auswählen
sudo chmod +x /usr/local/bin/quota-warning.sh
- Folgende Befehle ausführen, um die Konfiguration von Postfix anzupassen:
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Code: Alles auswählen
sudo systemctl restart postfix
- Folgende Befehle eingeben:
Code: Alles auswählen
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:
und dann rspamd neu starten:
Code: Alles auswählen
extended_spam_headers = true;
Code: Alles auswählen
sudo systemctl restart rspamd
- Die Datei /etc/dovecot/conf.d/90-sieve.conf so ändern, dass sie die folgende Zeile enthält:
Code: Alles auswählen
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:
Code: Alles auswählen
require ["fileinto","mailbox"]; if header :contains "X-Spam" "Yes" { fileinto :create "Junk"; stop; }
- Die soeben angelegte Datei mit dem folgenden Befehl kompilieren:
.
Code: Alles auswählen
sievec /etc/dovecot/sieve-after/spam-to-folder.sieve
Anschliessend Dovecot neu starten:Code: Alles auswählen
sudo systemctl restart dovecot
- Die Datei /etc/rspamd/override.d/classifier-bayes.conf mit dem folgenden Inhalt anlegen:
Code: Alles auswählen
autolearn = true;
- Die Datei /etc/dovecot/conf.d/20-imap.conf mit dem folgenden Inhalt anlegen:
Code: Alles auswählen
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:
Code: Alles auswählen
# 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:
Code: Alles auswählen
sudo mkdir /etc/dovecot/sieve
- Die Datei /etc/dovecot/sieve/learn-spam.sieve mit folgendem Inhalt anlegen:
Code: Alles auswählen
require ["vnd.dovecot.pipe", "copy", "imapsieve"]; pipe :copy "rspamd-learn-spam.sh";
- Die Datei /etc/dovecot/sieve/learn-ham.sieve mit folgendem Inhalt anlegen:
Code: Alles auswählen
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:
Code: Alles auswählen
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:
Code: Alles auswählen
#!/bin/sh exec /usr/bin/rspamc learn_spam
- Den Script /etc/dovecot/sieve/rspamd-learn-ham.sh mit folgendem Inhalt anlegen:
Code: Alles auswählen
#!/bin/sh exec /usr/bin/rspamc learn_ham
- Die Zugriffsrechte der beiden soeben angelegten Scripts anpassen:
Code: Alles auswählen
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:
Code: Alles auswählen
sudo systemctl restart dovecot
- Die benötigten Pakete installieren:
Code: Alles auswählen
sudo apt install clamav clamav-daemon clamav-unofficial-sigs
- Die Viren-Datenbank manuell aktualisieren:
Code: Alles auswählen
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:
Code: Alles auswählen
clamav { symbol = "CLAM_VIRUS"; type = "clamav"; action = "reject"; servers = "/var/run/clamav/clamd.ctl"; }
- Die Datei /etc/rspamd/override.d/antivirus.conf mit folgendem Inhalt anlegen:
- rspamd neu starten:
Code: Alles auswählen
sudo systemctl restart rspamd