Postfix empfängt und sendet Nachrichten via SMTP. Sowohl Clients als auch andere Server kommunizieren möglichst verschlüsselt via TLS und verifizieren das Zertifikat via DANE. Benutzer authentifizieren sich via SASL. Eingehende Nachrichten werden vom Rspamd als Ham oder Spam klassifiziert und via LMTP an Dovecot ausgeliefert.
Zusätzlich zum Postfix-Paket wird in dieser Konfiguration das LDAP-Modul benötigt.
apt install postfix{,-ldap}
Da Postfix in einer Changeroot-Umgebung läuft, kopieren wir das Wurzelzertifikat dort hinein.
cp /etc/ssl/ca.crt /var/spool/postfix/etc/ssl/
Zuerst legen wir fest, für welche Internet-Domäne Postfix überhaupt zuständig ist.
/etc/postfix/main.cfcompatibility_level = 2 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mydomain = illusioni.de myorigin = $mydomain mydestination = $mydomain relayhost =
Für die Verschlüsselung verwendet Postfix die vorhandenen Schlüssel und Zertifikate. Veraltete Protokolle schließen wir explizit aus.
smtpd_use_tls = yes smtpd_tls_key_file = /etc/letsencrypt/illusioni.de/privkey.pem smtpd_tls_cert_file = /etc/letsencrypt/illusioni.de/fullchain.pem smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 smtpd_tls_exclude_ciphers = EXP, MEDIUM, LOW, aNULL, MD5, DES, 3DES, SSLv2 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
Postfix greif auf Dovecot zurück, um Benutzer zu authentifizieren.
smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/dovecot-auth
Grundsätzlich nimmt Postfix Nachrichten nur für zwei Konstellationen an: Autorisierte Benutzer dürfen Nachrichten an beliebige Empfänger senden. Fremde Server dürfen Nachrichten nur an lokale Benutzer senden.
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_reverse_client_hostname, reject_unauth_pipelining smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain, reject_non_fqdn_sender, reject_unauth_pipelining smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain smtpd_data_restrictions = reject_unauth_pipelining
Eingehende Nachrichten durchlaufen den Spamfilter. Ausgehende Nachrichten erhalten eine DKIM-Signatur.
milter_protocol = 6 milter_default_action = accept smtpd_milters = inet:localhost:11332 non_smtpd_milters = $smtpd_milters milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
Nachrichten an lokale Benutzer werden an Dovecot übergeben.
virtual_mailbox_domains = ldap:/etc/postfix/domains.ldap alias_maps = ldap:/etc/postfix/aliases.ldap local_recipient_maps = ldap:/etc/postfix/recipients.ldap, $alias_maps recipient_delimiter = + mailbox_transport = lmtp:unix:private/dovecot-lmtp mailbox_size_limit = 0 biff = no
Um festzustellen, ob ein Benutzer tasächlich existiert, sucht Postfix einen Eintrag mit der Empfängeradresse im LDAP-Verzeichnis und liefert den zugehörigen Benutzernamen.
/etc/postfix/recipients.ldapbind = yes bind_dn = cn=postfix,ou=daemons,dc=illusioni,dc=de bind_pw = Password server_host = ldap://localhost start_tls = yes tls_ca_cert_file = /etc/ssl/ca.crt search_base = ou=users,dc=illusioni,dc=de query_filter = (mail=%s) result_attribute = uid
Mit den gleichen Zugangsdaten aber einer anderen Quelle werden Weiterleitungen aufgelöst.
/etc/postfix/aliases.ldapbind = yes bind_dn = cn=postfix,ou=daemons,dc=illusioni,dc=de bind_pw = Password server_host = ldap://localhost start_tls = yes tls_ca_cert_file = /etc/ssl/ca.crt search_base = ou=aliases,dc=illusioni,dc=de query_filter = (cn=%s) result_attribute = rfc822MailMember
Wenn der Server mehrere virtuelle Domänen unterstützt
/etc/postfix/domains.ldapbind = yes bind_dn = cn=postfix,ou=daemons,dc=illusioni,dc=de bind_pw = Password server_host = ldap://localhost start_tls = yes tls_ca_cert_file = /etc/ssl/ca.crt search_base = ou=domains,dc=illusioni,dc=de query_filter = (dc=%s) result_attribute = dc
Zuordnung von Adresse zu Benutzer:
postmap -q phrank@illusioni.de ldap:/etc/postfix/recipients.ldap phrank
Manueller Verbindungstest mit Verschlüsselung:
echo -n User | base64 echo -n Password | base64 openssl s_client -connect localhost:25 -starttls smtp … AUTH LOGIN 334 VXNlcm5hbWU6 Username: BaSe64Encoded== 334 UGFzc3dvcmQ6 Password: BaSe64Encoded==
Ober das gesamte System funktioniert, erfährt man, indem man eine Nachricht an check-auth@verifier.port25.com sendet. Als Antwort erhält man einen Bericht, insbesondere ob die DKIM-Signatur akzeptiert wird. Dabei sollte man auch das Systemprotokoll im Auge behalten.