DKIM und SPF

DKIM (DomainKeys Identified Mail) ist eine Technik, Emails zu signieren. Ich gebe hier eine Anleitung, wie dies mit dem Mailserver exim4 auf Debian-Systemen einzurichten ist.

Schlüsselerzeugung

DKIM benötigt für jede Domain ein Schlüsselpaar. Mit dem privaten Schlüssel wird die ausgehende Email signiert. Im DNS wird der öffentliche Schlüssel hinterlegt, so dass Empfänger die Signatur prüfen können. Als Schlüssellänge wird 2048 Bits empfohlen. Problematisch kann es werden, wenn der Provider keine DNS-TXT-Einträger zulässt, die länger als 255 Zeichen sind. Dann muss als Schlüssellänge auf 1024 zurückgegriffen werden. Für die Schlüsselerzeugung aber auch Prüfung kann opendkim benutzt werden.

apt-get install opendkim-tools

Ich verwende für jede Domain ein eigenes Unterverzeichnis. Dort werden auch die Schlüsseldateien abgelegt.

mkdir /etc/exim4/domains/planet-laas.de
cd /etc/exim4/domains/planet-laas.de
opendkim-genkey --selector mail --domain planet-laas.de
chown -R root:Debian-exim dkim.pem
chmod 600 dkim.pem

Zuletzt werden noch die Zugriffsrechte korrekt gesetzt, damit der exim4 die Dateien auch nutzen kann. In neueres Versionen darf nur noch für den Eigentümer das Leserecht vorliegen, ansonsten verweigert exim4 die Nutzung der Schlüssel. Für jede Domain werden zwei Dateien erzeugt. Die Datei mit der Endung .private entält den privaten Schlüssel Die Datei mit der Endung .txt enthält den öffentlichen Schlüssel, so wie er im Nameserver hinterlegt werden muss.

Konfiguration des Mailservers exim4

In der Datei /etc/exim4/exim4.conf.localmacros sind die folgenden Zeilen anzufügen.

DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/exim4/domains/${lookup{${lc:${domain:$h_from:}}}dsearch{/etc/exim4/domains/}}/mail.private
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
DKIM_SELECTOR = mail
DKIM_CANON = relaxed
DKIM_STRICT=1

Der Wert DKIM_SELECTOR ist für den späteren DNS-Eintrag wichtig, kann aber ziemlich beliebig gewählt werden. Eine Neuerzeugung der Konfiguration sowie ein Neustart des Mailservers schließen diesen Teil ab.

update-exim4.conf
systemctl restart exim4

DNS-Einträge

Für DKIM muss ein spezieller DNS-Eintrag eingerichtet werden. In meinem Fall muss ich einen TXT-Eintrag für mail._domainkey.planet-laas.de hinzufügen. Dabei steht mail für den Selektor, welcher in der Exim4-Konfiguration angegeben worden ist. Der Wert des Eintrags enthält auch den öffentlichen Schlüssel, allerdings ohne die Begrenzer. Es muss also nur der Teil zwischen "-----BEGIN PUBLIC KEY-----" und "-----END PUBLIC KEY-----" verwendet werden. Alles muss in einer Zeile stehen, Zeilenumbrüche sind also vorher zu entfernen.

Der Eintrag beginnt immer mit v=DKIM1. Dies zeigt die Version an, aktuell gibt es nur diese. Weiterhin wird mit k=rsa der Typ des Schlüssels angegeben. Hinter p= folgt der öffentliche Schlüssel. Das Flag t=s gibt an, dass signiert werden soll. Alle Werte sind durch Semikolon voneinander getrennt. Ich gebe beispielhaft meinen Eintrag an.

v=DKIM1; t=s; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzDXUQ4+f35IKgDyQVQdoVU+gIpXBuIXDlCNPJUn/8Gzj86newOPsQWvpeabhcLq3GCqO08O+FvHQTlozfBg78Wgp0OQwMUQ794oTATjvh1vXe4Da4p176K40TmLXxDekCLO4ge6HneUTh2qL/hbfgp+LuLdS+yG1wNy/fl8rILZL2h9RwziXjmIf8ZbIALtHLiLN/ucpe8LZisfjFVISjp8CCOW5v81yWwtm3XvhotANDEfG/wTkYoy5P0u1hl8HKbhuchzuG90uWUzyEu8qIX0YQcaDRPqw5owtoks1t/cdTgw/eSPotDMRHg4RB9PA9l1vz1touv4qgF/3jmvaQIDAQAB

Änderungen an den DNS-Einträgen dauern leider einige Zeit, manchmal bis zu 24 Stunden, bis sie weltweit propagiert sind. Direkt auf der Konsole kann der Eintrag mit

dig mail._domainkey.planet-laas.de TXT

geprüft werden. Alternativ kann auch einer der angegebenen Checks benutzt werden.

SPF

Sender Policy Framework ist ein Verfahren, um die Zustellung von Spam zu erschweren. Es wird ein DNS-Eintrag angelegt, in welchen angegeben wird, von welchen IP-Adressen Mails über diesen Server versendet werden dürfen. Der Empfänger prüft bei Empfang, ob der Sender dazu berechtigt war. SPF ist schnell eingerichtet und erfordert wenig Aufwand.

Im einfachsten Fall wird ein TXT-Eintrag für die Domain hinzugefügt.

v=spf1 a -all