Hinweis: dieser Artikel ist veraltet. Mittlerweile nutze ich rspamd für DKIM.
Kürzlich stand ich vor der Anforderung, einen Mailserver auf Basis von Postfix unter einem Debian-artigen Linux mit DKIM (DomainKeys Identified Mail) zu versorgen und bin dabei wie nachfolgend beschrieben vorgegangen.
1. Installation OpenDKIM
OpenDKIM ist in der Regel als Paket verfügbar und kann mit apt installiert werden:
apt-get install opendkim opendkim-tool
2. Konfiguration
Die folgende Konfiguration ist für den Betrieb mit mehreren Domains gedacht. Ich empfehle sie generell, da man sich so auch bei nur einer Domain auf dem Server die Option offen hält, später leicht weitere Domains ergänzen zu können.
2.1 Allgemeine Einstellungen von OpenDKIM
Die Konfiguration von OpenDKIM erfolgt in der Datei /etc/opendkim.conf
. Diese sollte folgende Einträge enthalten:
Syslog yes UMask 002 Canonicalization relaxed/simple Mode sv SubDomains yes OversignHeaders From KeyTable /etc/opendkim/KeyTable SigningTable /etc/opendkim/SigningTable ExternalIgnoreList /etc/opendkim/TrustedHosts InternalHosts /etc/opendkim/TrustedHosts
Den Ordner /etc/opendkim
muss man ggf. noch manuell anlegen.
2.2 Verbindung zwischen OpenDKIM und Postfix
In der Datei /etc/default/opendkim
wird folgender Eintrag ergänzt:
SOCKET="inet:8891@localhost"
Damit wird festgelegt, dass der OpenDKIM-Daemon lokal Verbindungen auf Port 8891 entgegennimmt. Analog dazu trägt man in der Postfix-Konfiguration /etc/postfix/main.cf
folgenden Abschnitt ein, um OpenDKIM als Mailfilter zu nutzen:
milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
Anmerkung: falls Port 8891 bereits für andere Anwendungen benötigt wird, kann dieser natürlich auch geändert werden. Man muss nur daran denken, das sowohl bei OpenDKIM als auch bei Postfix entsprechend einzutragen.
2.3 OpenDKIM-Domainkonfiguration
Nun erstellt man die Datei /etc/opendkim/TrustedHosts
mit folgenden Einträgen:
127.0.0.1 localhost 192.168.1.1 example.com
Statt 192.168.1.1
und example.com
gibt man die öffentliche IP-Adresse und den Namen der eigenen Domain an, für die man DKIM einrichten möchte. Wenn es mehrere IP-Adressen und Domains gibt, sind diese hier alle entsprechend einzutragen.
2.4 Schlüssel für eine Domain
Zunächst erstellt man ein Verzeichnis für den öffentlichen und privaten Schlüssel und generiert dann die Schlüssel mit folgenden Kommandos:
mkdir -p /etc/opendkim/keys/example.com cd /etc/opendkim/keys/example.com opendkim-genkey -r -d example.com
Statt example.com
gibt den Namen der Domain an.
Danach ändert man den Besitzer der Datei für den privaten Schlüssel auf OpenDKIM:
chown opendkim.opendkim /etc/opendkim/keys/example.com/default.private
Diesen Schlüssel kann man nun in der Datei /etc/opendkim/KeyTable
wie folgt eintragen:
default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private
Und schließlich auch noch in der Datei /etc/opendkim/SigningTable
wie folgt:
example.com default._domainkey.example.com
2.5 DNS-Eintrag für eine Domain ergänzen
Damit Empfänger die DKIM-Signaturen prüfen können, muss der öffentliche Schlüssel als zusätzlicher TXT-Eintrag für die Domain im Nameserver hinterlegt werden. Dieser Eintrag kann der Datei /etc/opendkim/keys/example.com/default.txt
entnommen werden, der etwa wie folgt aussieht (hier stark gekürzt):
default._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA...DAQAB"
Je nach dem, wie man die DNS-Einträge bearbeitet, kann man den Eintrag entweder direkt als zusätzliche Angabe in die DNS-Konfiguration für die jeweilige Domain übernommen oder man legt einen TXT-Eintrag mit dem Namen default._domainkey
und als Inhalt alles, was zwischen den Anführungszeichen steht, an – also beginnend mit v=DKIM; k=rsa; p=
.
Ob die Änderung erfolgreich war, kann man z.B. mit der „MxToolbox“ auf https://mxtoolbox.com/dkim.aspx testen. Als „Selector“ gibt man hier default
ein. Man sollte dabei beachten, dass es einige Zeit dauern kann, bis Änderungen in DNS-Einträgen weltweit sichtbar sind.
3. Server neu starten und testen
Nach Abschluss der Konfiguration startet man die Dienste opendkim und postfix neu.
Auf der Website http://dkimvalidator.com kann man dann eine temporäre E-Mail-Adresse bekommen, an die man eine Testnachricht schickt, deren Header dann dort angezeigt und geprüft werden können, sobald die Nachricht dort angekommen ist.
Ziemlich genau so hatte ich das auch gemacht.
Inzwischen ist mir aber klar geworden, dass es besser ist, „default“ durch z.B. „20170701“ zu ersetzten. Bei einer Schlüsselerneuerung sollte nämlich der alte Schlüssel im DNS erhalten bleiben. Wenn für den Selektor eine fortlaufende Nummer (oder eben ein Datum) verwendet wird, ist das einfach möglich.
Die Schlüsselerneuerung kann man dann sogar automatisch alle 6 Monate vom cron erledigen lassen :-)
Danke für die Ergänzung.
Gedacht ist der Selektor allerdings für den Fall, dass es in einer Domain mehrere Server gibt, die jeweils einen eigenen privaten Schlüssel nutzen. Auch besteht keine technische Notwendigkeit, diese Schlüssel regelmäßig zu erneuern.
Auf die Idee mit dem Schlüsselwechsel haben mich die Mails von US-CERT@ncas.us-cert.gov gebracht. Die wechseln nämlich den Schlüssel und benennen den dann yyQn.
Für den Thunderbird gibt es überigens https://github.com/lieser/dkim_verifier. Dann kann man den dkim-Status auch im Client sofort sehen.
Und dkim-key-rotation scheint zumindestens als „best practice“ zu sein. Ich bin mir aber nicht sicher, ob man die alten keys im DNS lassen sollte oder vielleicht doch besser nicht…