DKIM mit Postfix und OpenDKIM

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.

3 Gedanken zu „DKIM mit Postfix und OpenDKIM“

  1. M
    Matthias Pfaller

    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 :-)

    1. Arno Welzel

      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.

      1. M
        Matthias Pfaller

        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…

Öffentlichen Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Dies ist kein Kontaktformular! Wenn Du mir eine persönliche Nachricht schreiben möchtest, benutze die E-Mail-Adresse in meinem Impressum.

Du kannst die folgenden HTML-Tags im Kommentar verwenden:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>