Postfix, SPF, DKIM & DMARC

2017-Jan-22, Postfix, SPF, DKIM & DMARC

Nach dem mein Mailserver einging, habe ich 4h benötigt einen neuen aufzusetzen. Inklusive TLS, SPF und DKIM. Was da noch fehlte war etwas gegen Spam (Greylisting, SPF), aber inzwischen ist auch das umgesetzt.

Besonders für das nächste Mal oder für Leute, die eine schnelle Anleitung haben wollen, ein paar Notizen.

Postgrey vs Postscreen: Nicht lange nachdenken, Postscreen. ;)

TLS - Sicherheit geht vor
# TLS parameters
smtpd_tls_cert_file = /etc/ssl/PATH/HOST.crt
smtpd_tls_key_file = /etc/ssl/PATH/HOST.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_auth_only = yes
tls_ssl_options = NO_COMPRESSION
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
lmtp_tls_mandatory_protocols = !SSLv2, !SSLv3
lmtp_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers=high
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA
Dovecot
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"

Man kann natürlich auch LMTP verwenden, was sich in Multiserverumgebungen eventuell anbietet.

In Dovecot muss man dafür den LMTP-Server einschalten:

/etc/dovecot/conf.d/10-master.conf
unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }

Und in Postfix statt mailbox_command mailbox_transport verwenden:

mailbox_transport = lmtp:unix:private/dovecot-lmtp

Dies hat noch weitere nette Eigenschaften. ;)

SPAM SPAM SPAM
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unauth_destination,
        reject_unknown_reverse_client_hostname,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unknown_sender_domain,
        reject_unknown_recipient_domain,
        reject_invalid_hostname,
        check_policy_service unix:private/policy-spf,
        reject_rbl_client ix.dnsbl.manitu.net

# postscreen
postscreen_access_list = permit_mynetworks,
        cidr:/etc/postfix/postscreen_access.cidr
postscreen_pipelining_enable = yes

# SPF
policy-spf_time_limit = 3600s

# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891

OpenDKIM via Unix-Socket hat bisher bei mir nicht richtig funktioniert. Vielleicht ein chroot in postfix? TODO. Wäre praktisch, wenn OpenDKIM über postmaster gestartet werden könnte; dann könnte es bereits gelöst sein. Oder es reicht das Socket in /var/spool/postfix/public zu erstellen.

master.cf
smtp      inet  n       -       -       -       1       postscreen -o soft_bounce=yes
smtpd     pass  -       -       -       -       -       smtpd -o syslog_name=postfix/smtps
dnsblog   unix  -       -       -       -       0       dnsblog
tlsproxy  unix  -       -       -       -       0       tlsproxy
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o tls_preempt_cipherlist=yes
policy-spf unix -       n       n       -       -       spawn user=nobody argv=/usr/bin/policyd-spf