Mailserver mit Postfix, dovecot, spamassassin, opendkim und postgrey unter debian jessy

Der alte Server war dann doch etwas langsam, daher der Umzug auf neue Hardware. Mit dem Umzug galt es auch den bisherigen IMAP Server (cyrus) durch dovecot zu ersetzen. Soweit der Vorsatz, die Umsetzung war dann weitaus schwieriger…

Setup

Neben der Grundfunktionalität (Mails empfangen und senden) sollte der Mailserver wenigstens folgendes können:

  • DKIM zur Authentifizierung
  • SPF
  • Greylisting
  • spamassassin Unterstützung
  • Volltextsuche über IMAP
  • Mehrere virtuelle Domains
  • Weiterleitungen
  • Mehrere Benutzer für IMAP/SMTP
  • TLS Unterstützung

Vorarbeiten

  1. MX-Record im DNS einrichten: Der MX Eintrag verweist bei der Domain auf mail.ideas-in-logic.de als alleiniger Eintrag. Wichtig ist, das dieser Name einen eigenen A-Record bekommt. Ein CNAME für mail.elektrowolle.de wird von einigen Mailservern abgelehnt.
    ideas-in-logic.de.      3600 IN MX 100 mail.ideas-in-logic.de.
    mail.ideas-in-logic.de. 3600 IN A      185.11.138.5
  2. SPF im DNS eintragen: über SPF gibt es zwar einige Diskussionen über die Sinnhaftigkeit, aber mir erscheint es sinnvoll, die zulässigen Mailserver bekannt zu geben:
    ideas-in-logic.de. 3233 IN TXT "v=spf1 mx a ip4:185.11.138.5 ?all"
  3. PTR beim Provider für den MX eintragen:
    $ host 185.11.138.5
    5.138.11.185.in-addr.arpa domain name pointer mail.ideas-in-logic.de
DNS Konfiguration

DNS Konfiguration bei domain Factory

Installation unter Debian

Folgende Pakete sind unter debian mindestens notwendig:

apt-get update
apt-get install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-sieve postfix postgrey spamass-milter spamassassin spamc libmail-dkim-perl libopendkim9 opendkim openssl fail2ban

Benutzer einrichten für die einzelnen Hilfssysteme:

useradd -g mail -d /home/vmail -m vmail 
passwd -l vmail
useradd -s /bin/false -m spamfilter 
passwd -l spamfilter
useradd -g nogroup -s /bin/false -d /var/lib/spamass-milter -m spamass-milter 
passwd -l spamass-milter

TLS einrichten

Zunächst brauchen wir ein public-/private Key Paar für den Server. Dies kann mit openssl erzeugt werden:

> mkdir -p /etc/ssl/private/
> openssl req -nodes -new -newkey rsa:2048 -sha256 -out /etc/ssl/private/ideas-in-logic.de.csr -keyout /etc/ssl/private/ideas-in-logic.de-private-key.pem -subj '/C=DE/ST=Hessen/L=City/O=Ideas In Logic GbR/CN=ideas-in-logic.de/emailAddress=hostmaster@ideas-in-logic.de'

Wichtig ist dabei, dass der Eintrag bei CN mit dem Domainnamen übereinstimmt! Die hierbei erzeugte .csr kann dann von einer beliebigen Zertifizierungsstelle signiert werden. Für die meisten Zwecke reicht ein kostenloses Zertifikat bei StartSSL, hierfür muss aber bereits der Mailempfang für hostmaster oder postmaster funktionieren. StartSSL verlangt zusätzlich zu dem Domainnamen einen FQDN. Hier bietet sich der Name des MX-Servers (mail.ideas-in-logic.de) an. Die Installation geht davon aus, dass das Zertifikat mit allen evtl. vorhandenen Zwischenzertifizierungsstellen in der Datei /etc/ssl/private/ideas-in-logic.de.chain.crt.pem liegt.

Um Angriffe auf die Verschlüsselung zu verhindern sowie Perfect Forward Secrecy zu unterstützen sollten eigene Diffie-Hellman Parameter generiert werden:

openssl dhparam -out /etc/ssl/private/dhparams.pem 2048

Das StartSSL-Zertifikat kann auch gleichzeitig für den Webserver eingesetzt werden und schneidet bei https://www.ssllabs.com/ssltest/index.html gar nicht so schlecht ab:

Qualys SSL Labs Report

Qualys SSL Labs Report

Dovecot einrichten

Benutzerkonfiguration in /etc/dovecot/conf.d/10-auth.conf:

auth_mechanisms = plain login
!include auth-passwdfile.conf.ext

Anmeldekonfiguration in /etc/dovecot/conf.d/auth-passwdfile.conf.ext:

passdb {
  driver = passwd-file
  args = scheme=plain username_format=%u /etc/dovecot/users
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%u
}

Anlegen neuer Benutzer in der Datei /etc/dovecot/users mit:

> echo NeuerUserName:`doveadm pw -s SSHA256` >> /etc/dovecot/users

SSL-Einstellungen in /etc/dovecot/conf.d/10-ssl.conf (siehe https://weakdh.org/sysadmin.html):

ssl_cert = </etc/ssl/private/ideas-in-logic.de.chain.crt.pem
ssl_cipher_list=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_dh_parameters_length = 2048
ssl_key = </etc/ssl/private/ideas-in-logic.de-private-key.pem
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2
ssl = required

Mail Einstellungen in /etc/dovecot/conf.d/10-mail.conf:

mail_location=maildir:/home/vmail/%u
namespace inbox {
 inbox = yes
}
mail_plugins = fts fts_squat

Generelle Service Einstellungen in /etc/dovecot/conf.d/10-master.conf:

default_process_limit = 100
default_client_limit = 1000
service imap-login {
 inet_listener imap {
   port = 143
 }
 inet_listener imaps {
   port = 993
   ssl = yes
 }
}
service pop3-login {
 inet_listener pop3 {
   port = 0
 }
 inet_listener pop3s {
   port = 0
 }
}
service lmtp {
 unix_listener lmtp {
   mode = 0666
   user = postfix
   group = postfix
 }
 inet_listener lmtp {
   address = 127.0.0.1
   port = 24
 }
}
service imap {
}
service pop3 {
}
service auth {
 unix_listener auth-userdb {
 }
 unix_listener /var/spool/postfix/private/auth {
   mode = 0660
   user = postfix
   group = postfix
 }
}
service auth-worker {
}
service dict {
 unix_listener dict {
 }
}

Automatische Anlage neuer Mailboxen in /etc/dovecot/conf.d/15-lda.conf:

lda_mailbox_autocreate = yes
protocol lda {
}

Workaround für die Suchfunktion auf dem iPhone in /etc/dovecot/conf.d/20-imap.conf:

protocol imap {
  mail_max_userip_connections = 80
}

Benutzername ohne Domain in /etc/dovecot/conf.d/20-lmtp.conf:

auth_username_format = %n
protocol lmtp {
}

Automatische Volltextsuche in /etc/dovecot/conf.d/90-plugin.conf:

plugin {
  fts = squat
  fts_autoindex = yes
}

Sieve-Unterstützung in /etc/dovecot/conf.d/90-sieve.conf:

plugin {
  sieve_before = /home/vmail/sieve/spam-global.sieve
  sieve_dir = /home/vmail/%d/%n/sieve/scripts/
  sieve = /home/vmail/%d/%n/sieve/active-script.sieve
}

Spam-Mails auf dem Server automatisch in den Ordner “Spam” verschieben (/home/vmail/sieve/spam-global.sieve):

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
 fileinto "Spam";
}

Mit diesen Einstellungen sollte dovecot nun neu gestartet werden:

# /etc/init.d/dovecot restart

Dovecot sollte die Ports 143 (imap), 993 (imaps) und 4190 (sieve) öffnen (auf allen Interfaces) sowie Port 24 (lmtp) auf dem localhost Interface:

# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0    0.0.0.0:143     0.0.0.0:* LISTEN
tcp 0 0    127.0.0.1:24    0.0.0.0:* LISTEN
tcp 0 0    0.0.0.0:443     0.0.0.0:* LISTEN
tcp 0 0    0.0.0.0:4190    0.0.0.0:* LISTEN
tcp 0 0    0.0.0.0:993     0.0.0.0:* LISTEN

Ob die TLS-Verbindung funktioniert, kann mit openssl getestet werden:

# echo | openssl s_client -connect localhost:993
# echo | openssl s_client -connect localhost:143  -starttls imap
# echo | openssl s_client -connect localhost:4190  -starttls smtp

Alle drei Kommandos sollten das Zertifikat des Servers ausgeben.

Infos zu dovecot: https://thomas-leister.de/internet/sieve-mailfilter-fuer-dovecot-installieren-und-konfigurieren/http://wiki.dovecot.org/Authentication/PasswordSchemeshttp://wiki.dovecot.org/AuthDatabase/PasswdFilehttp://wiki.dovecot.org/UserDatabase/Static

Postfix einrichten

In der /etc/postfix/main.cf sollten folgende Einträge gemacht werden:

smtpd_banner = mail.ideas-in-logic.de ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = mail.ideas-in-logic.de
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

milter_protocol = 2
milter_default_action = accept
mydomain=localhost

mime_header_checks = regexp:/etc/postfix/mime_header_checks.regexp

maps_rbl_domains = blackholes.mail-abuse.org, bl.spamcop.net, inputs.orbz.org, outputs.orbz.org, proxies.blackholes.easynet.nl, zombie.dnsbl.sorbs.net, cbl.abuseat.org
# smtpd_client_restrictions = sleep 5, permit_sasl_authenticated, permit_mynetworks, reject_rbl_client proxies.blackholes.easynet.nl, reject_rbl_client zombie.dnsbl.sorbs.net, reject_rbl_client cbl.abuseat.org, check_policy_service inet:127.0.0.1:10023, permit
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client proxies.blackholes.easynet.nl, reject_rbl_client zombie.dnsbl.sorbs.net, reject_rbl_client cbl.abuseat.org, check_policy_service inet:127.0.0.1:10023, permit
smtpd_helo_required = yes
smtpd_helo_restrictions =
smtpd_sender_restrictions =
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated
  reject_unauth_destination,
  reject_invalid_hostname,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_rbl_client cbl.abuseat.org,
  permit
# virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps=hash:/etc/postfix/virtual
virtual_alias_maps=hash:/etc/postfix/virtual_alias
virtual_mailbox_domains=ideas-in-logic.de

#### Versand über LMTP von dovecot
mailbox_transport=lmtp:inet:localhost

transport_maps = hash:/etc/postfix/transport

#### SASL Einstellungen
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

message_size_limit=20480000
smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem
smtpd_tls_eecdh_grade = strong
tls_preempt_cipherlist = yes
smtpd_tls_protocols = !SSLv2
smtpd_tls_mandatory_ciphers=high
smtpd_tls_exclude_ciphers=aNULL,MD5,RC4,DES
smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
smtpd_tls_auth_only = yes
smtpd_tls_cert_file=/etc/ssl/private/ideas-in-logic.de.chain.crt.pem
smtpd_tls_key_file=/etc/ssl/private/ideas-in-logic.de-private-key.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache
smtpd_tls_auth_only = yes

smtpd_milters = inet:localhost:12301,unix:/spamass/spamass.sock
non_smtpd_milters = inet:localhost:12301
milter_connect_macros = j {daemon_name} v {if_name} _
milter_default_action = accept

Der Aufbau geht davon aus, dass die Mails über greylisting auf Port 10023 sowie DKIM über Port 12301 gefiltert werden.

Die restliche Konfiguration ist in den Dateien /etc/postfix/transport, /etc/postfix/virtual/, /etc/postfix/virtual_alias sowie /etc/postfix/mime_header_checks.regexp:

> cat /etc/postfix/transport
# Jeder IMAP Benutzer, der lokal zugestellt werden soll muss hier eingetragen werden
NeuerUsername@localhost lmtp:127.0.0.1

> cat /etc/postfix/virtual
# Jede Domain, die von uns verwaltet wird, muss hier mit OK aufgeführt werden
meine-andere-domain.de OK
meine-domain.de        OK

> cat /etc/postfix/virtual_alias
# Jede Emailadresse, die von außen erreichbar sein soll, bekommt einen Alias auf den Localhost Benutzer. Die abuse, hostmaster und postmaster Adressen müssen nach RFC 2142 vorhanden sein
abuse@meine-domain.de       wolle@localhost
webmaster@meine-domain.de   wolle@localhost
hostmaster@meine-domain.de  wolle@localhost
postmaster@meine-domain.de  wolle@localhost
#
abuse@meine-andere-domain.de      wolle@localhost
webmaster@meine-andere-domain.de  wolle@localhost
hostmaster@meine-andere-domain.de wolle@localhost
postmaster@meine-andere-domain.de wolle@localhost

> cat /etc/postfix/mime_header_checks.regexp
# Optionales Verbot für den Versand von den üblichen Binärdaten
# /name=[^>]*\.(bat|chm|cmd|com|exe|hta|jse|scr|pif|vbe|vbs|vxd)/ 
#   REJECT Rule #666 We do not like Windows executables for security reason. Please do not send us executables. Thank you.

> postmap virtual transport virtual_alias  # (Neu bauen der .db Dateien)
> /etc/init.d/postfix reload

Die Postfix Konfiguration ist damit fast vollständig. Offen ist nur noch die Signatur mittels OpenDKIM.

Weitere Infos zu Postfix: http://www.stefan-seelmann.de/wiki/mailserver-postfix-dovecothttp://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL

OpenDKIM konfigurieren

Die Konfiguration selbst liegt unter /etc/opendkim.conf und wird wie folgt geändert:

Syslog yes
UMask 002
OversignHeaders From
AutoRestart Yes
AutoRestartRate 10/1h
UMask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12301@localhost

In der Datei /etc/opendkim/TrustedHosts werden alle Hosts aufgeführt, deren Emails signiert werden sollen. Üblicherweise sind das nur wir selbst:

> cat /etc/opendkim/TrustedHosts
127.0.0.1
localhost
mail.ideas-in-logic.de

Nun können die Schlüssel für unsere Domains generiert werden:

# mkdir -p /etc/opendkim/keys/ideas-in-logic.de
# cd /etc/opendkim/keys/ideas-in-logic.de
# opendkim-genkey --domain=example.com --selector=mail --verbose
# chown -R opendkim:opendkim /etc/opendkim
# chmod go-rwx -R /etc/opendkim

 

Die Schlüssel müssen jetzt nur noch in der KeyTable und SigningTable eingetragen werden:

> cat SigningTable
*@ideas-in-logic.de mail._domainkey.ideas-in-logic.de
> cat KeyTable
mail._domainkey.ideas-in-logic.de ideas-in-logic.de:mail:/etc/opendkim/keys/ideas-in-logic.de/mail.private

Der Eintrag des öffentlichen Schlüssels ist in der .txt Datei unter “/etc/opendkim/keys/ideas-in-logic.de/mail.txt” abgelegt. Dieser Eintrag wird im nächsten Schritt benötigt.

Weitere Infos zu openDKIM unter http://edoceo.com/howto/opendkim und http://www.opendkim.org/docs.html

 

DNS anpassen für DKIM und DMARC

Damit andere Mailserver prüfen können, ob die Mail auch tatsächlich von unserem Mailserver stammt, muss der obige öffentliche Schlüssel im DNS eingetragen werden:

> dig mail._domainkey.ideas-in-logic.de txt
mail._domainkey.ideas-in-logic.de. 3600 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD0mN1vza/Yq7Ub3ENPbfaxlWDxhiMcQ8UZV/Hur6Jtj6YjE09/+8cfdaicTFxEzOjfbRSVTWJMitEW6jnGj94vj8d+9O1417sislRWEjHdbr2MIzPkb7gqsLGsh+NM2HkBeuViMb0F9UOhTk635MNinDDdcooGvPR4xviAmnMFmQIDAQAB

Für das Reporting von Spam gehört noch ein DMARC Eintrag ins DNS:

> dig _dmarc.ideas-in-logic.de txt
_dmarc.ideas-in-logic.de. 3600 IN TXT "v=DMARC1\; p=none\; sp=reject\; rua=mailto:postmaster@ideas-in-logic.de"

Infos zu DMARC von: http://blog.returnpath.com/reading-your-first-dmarc-reports/ und https://support.google.com/a/answer/2466563?hl=de

Letzte Anpassungen

/etc/default/spamass-milter Einstellungen prüfen:

OPTIONS="-u spamass-milter -m -I -- -U /var/run/spamassassin/spamd.sock"
SOCKET="/var/spool/postfix/spamass/spamass.sock"
SOCKETOWNER="postfix:postfix"
SOCKETMODE="0660"

/etc/default/spamassassin Einstellungen prüfen:

ENABLED=1
OPTIONS="-x --virtual-config-dir=/var/lib/spamassassin/%u/spamassassin -c -u spamd --max-children 2 --socketpath=/var/run/spamassassin/spamd.sock --socketowner=spamd --socketgroup=spamd --socketmode=0660"
PIDFILE="/var/run/spamd.pid"
CRON=1

/etc/default/postgrey:

POSTGREY_OPTS="--inet=10023 --delay=60"

Wenn alles fertig ist (in der Zwischenzeit ist die TTL für die DNS Einträge abgelaufen…) kann der Mailserver getestet werden über: