How-To: Mail-Server mit Postfix, Dovecot und PostgreSQL unter Debian 11 einrichten

Anleitungen zu verschiedenen Linux-Themen.
Antworten
Benutzeravatar
MrKermit
Beiträge: 2
Registriert: 09 Jul 2022 10:56

How-To: Mail-Server mit Postfix, Dovecot und PostgreSQL unter Debian 11 einrichten

Beitrag von MrKermit »

Die folgende Anleitung ist meine gekürzte Anpassung an PostgreSQL der ausgezeichneten ISPmail Guide for Debian von Christoph Haas.

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:

    Code: Alles auswählen

    sudo apt install apache2 php7.4 php7.4-cli php-pear php7.4-pgsql
    Achtung: Aktivieren den folgenden Block in /etc/apache2/apache2.conf, um /srv als DocumentRoot verwenden zu können:

    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:

    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>
    
    Bemerkungen:
    1. Das Verzeichnis /etc/apache2/users muss von Hand angelegt werden.
    2. Die Datei etc/apache2/users/meinserver erzeugen Sie mit htpasswd.
    Nicht vergessen, den Apache-Server dann neu zu starten:

    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:

    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>
    
    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

    sudo a2enmod ss
    sudo systemctl restart apache2
    
  • Erzeugen Sie einen PostgreSQL-Benutzer mailadm für die Verwaltung der Mail-Server-Datenbank:

    Code: Alles auswählen

    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:

    Code: Alles auswählen

    sudo -u postgres createuser -P -E -d mailusr
    Achtung: Notieren Sie sich das Passwort!
  • Erzeugen Sie die PostgreSQL-Datenbank mailserver:

    Code: Alles auswählen

    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:

    Code: Alles auswählen

    local mailserver mailadm md5
    local mailserver mailusr md5
    
  • Erzeugen Sie eine Datei mailserver.sql mit folgendem Inhalt:

    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
        );
    
    Dann führen Sie den Befehl

    Code: Alles auswählen

    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:

    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:

    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'
    
    Anschliessend aktualisieren Sie die Postfix-Konfiguration:

    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:

    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'
    
    Anschliessend aktualisieren Sie die Postfix-Konfiguration:

    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:

    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'
    
    Anschliessend aktualisieren Sie die Postfix-Konfiguration:

    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:

    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'
    
    Anschliessend aktualisieren Sie die Postfix-Konfiguration:

    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:

      Code: Alles auswählen

      !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:

    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:

    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
    
    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

    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:

    Code: Alles auswählen

    service lmtp {
       unix_listener /var/spool/postfix/private/dovecot-lmtp {
         group = postfix
         mode = 0600
         user = postfix
       }
    }
    
    Dann noch Dovecot neu starten:

    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:

    Code: Alles auswählen

    mail_plugins = $mail_plugins sieve
    
    Anschliessend Dovecot neu starten:

    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:

    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
          }
    }
    
    Anschliessend Dovecot neu starten:

    Code: Alles auswählen

    sudo systemctl restart dovecot 
  • Eine Datei namens /usr/local/bin/quota-warning.sh mit folgendem Inhalt erzeugen:

    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
    
    Die Datei dann als ausführbaren Script konfigurieren:

    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
Konfiguration der Anti-Spam-Software rspamd
  • 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:

    Code: Alles auswählen

    extended_spam_headers = true;
    
    und dann rspamd neu starten:

    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
Installation und Konfiguration der Antiviren-Software ClamAV
  • 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";
      }
      
  • rspamd neu starten:

    Code: Alles auswählen

    sudo systemctl restart rspamd
Viel Spass mit Ihrem neuen Mail-Server!
Antworten