E-mail mit DKIM einrichten mit Postfix, OpenDKIM und PowerDNS

Mailserver gelten (zu Recht) mittlerweile als mit die komplexesten und am schwierigsten zu wartenden Systeme. Das liegt unter anderem daran, dass es sich beim „S“ in SMTP leider nicht um „secure“ sondern um „simple“ handelt. SMTP ist das Simple Mail Transfer Protocol, das ist die Sprache nach welcher sich Mailserver untereinander verständigen und e-mails weiter reichen. Als es definiert wurde, war die Welt des Internet noch sehr klein und auch wesentlich friedfertiger. Heute muss man aufpassen wie ein Schießhund, schneller als einem lieb ist hat man mit einem Mailserver sonst Ärger. Free-Relays gibt es mittlerweile dankenswerter Weiser fast gar keine mehr – diese waren ein erster Angriffspunkt für unerwünschte Werbung (SPAM).

Die eigentliche Installation eines Mailservers ist meist gar nicht das Problem, es sind die vielfachen Absicherungen die es benötigt um ihn auch „sicher“ zu betreiben und nicht als SPAM-Schleuder missbraucht zu werden und natürlich auch sich der diversen SPAM-Quellen zu erwehren. Noch dazu kommt, dass man ggf. auch weitere Server-Prozesse benötigt die der Abholung von Mails durch den Benutzer dienen – heute in der Regel per IMAP (Internet Message Access Protocol), eher historisch zu sehen ist POP(3). Hier muss man dann auch noch dafür sorgen, dass die Authentifizierung für die ganzen Server-Prozesse auch noch schön synchron bleibt. Kurzum: Es ist ein System das man häufig unter dem Motto: Never touch a running system betreibt sobald die Konfiguration einmal den Vorstellungen und Bedürfnissen entspricht (von den üblichen Sicherheitsupdates einmal abgesehen).

Es gibt aber auch Weiterentwicklungen, insbesondere im Kampf gegen SPAM, eines der Verfahren dazu nennt sich DKIM (DomainKeys Identified Mail). Das System macht sich DNS (Domain Name System) und asymmetrische Kryptographie zu nutze: Jede e-mail die durch den Server verschickt wird, wird in den Kopfzeilen um eine digitale Signatur ergänzt. Anhand des im DNS hinterlegten öffentlichen Schlüssels kann dann jeder empfangende Mailserver prüfen ob die Mail vom sendenden Server stammt (korrekt signiert wurde). Das Verfahren ist mittlerweile den Kinderschuhen entwachsen und in den letzten Wochen und Monaten bin ich immer wieder einmal auf kleinere Probleme beim Mailversand gestoßen. Allerhöchste Zeit sich einmal den Thema zu widmen.

Dankenswerter Weise hat Michael Kofler einen sehr schönen Blogeintrag geschrieben, wie man das Ganze für Postfix aufsetzt. Die Anleitung ist recht gut geschrieben und die wichtigsten Schritte sind recht fix abgehandelt. Allerdings hat es bei mir nicht ganz auf Anhieb funktioniert, was an einigen Rahmenbedingungen lag. Für den Fall, dass jemand ein ähnliches Setup fährt, daher hier die Ergänzung.

OpenDKIM Output für PowerDNS

Der erste wesentliche Unterschied ist, dass ich nicht nur den Mailserver sondern auch meinen DNS-Server zumindest teilweise selbst betreibe. Dafür verwende ich Power-DNS als Server Software, die ist etwas moderner und gekoppelt mit einer „echten“ Datenbank auch etwas leichter zu pflegen als die klassische BIND-Files. Hier lauert dann auch der erst Fallstrick beim Eintragen des öffentlichen Schlüssels: Einfach aus der Datei die OpenDKIM ausspuckt kopieren ist nicht ausreichend. Meine Erfahrung ist: am einfachsten kopiert man sich den kompletten Eintrag samt Key zusammen. Aus der Datei im Bind-Format

20250609._domainkey     IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; s=email; " 
         "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmisgEdSwzjqxHP4CWVrcSeA8wmAZL2btqu22aT9JHWmdRJzgQu0Gqpd+9m6zkc5h5io2SyOoeOWVZYz+wug5iN/bTZtuDb3abifYB+EfbUUCQKF7mjSxKwJxCPYVNDokXvbA8q2PS03aJZJj48bUJLQWPQXrVuuiZj+JgQfRndObj4WEv7i
G+EdU8m6x5AOT5qFw3xaTEIdG91" 
         "0w+kG+mD/7H8lmYnEabCz1qKZIopgry0/EVG/45lKswdydI3E1BqCgHVcylQFSBVpkthhKJS9hP3eNDbJpnU15UwAAgsMnf22uzOSfvbyho2RCZa7Qq27yW5/ipyoOaVodYTZ5QQIDAQAB" )  ; -

wird somit:


v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmisgEdSwzjqxHP4CWVrcSeA8wmAZL2btqu22aT9JHWmdRJzgQu0Gqpd+9m6zkc5h5io2SyOoeOWVZYz+wug5iN/bTZtuDb3abifYB+EfbUUCQKF7mjSxKwJxCPYVNDokXvbA8q2PS03aJZJj48bUJLQWPQXrVuuiZj+JgQfRndObj4WEv7i
G+EdU8m6x5AOT5qFw3xaTEIdG910w+kG+mD/7H8lmYnEabCz1qKZIopgry0/EVG/45lKswdydI3E1BqCgHVcylQFSBVpkthhKJS9hP3eNDbJpnU15UwAAgsMnf22uzOSfvbyho2RCZa7Qq27yW5/ipyoOaVodYTZ5QQIDAQAB

Das Format ist eigentlich sehr simple, immer eine Variablenbezeichnung (v,h,k,s,p) gefolgt von einem „=“ und dann dem Wert, Trennung durch „;“. Wenn man es ganz genau machen will kann man am Ende auch noch ein weiteres „;“ spendieren. Was in der Datenbank (im Gegensatz zur Datei) unerheblich ist, ist die Trennung in „Chunks“ – historisch bedingt dürfen DNS-Einträge nur bis zu 255 Zeichen (ASCII) enthalten. PowerDNS kümmert sich dankenswerter Weise um das Chunking bei der Auslieferung (man kann es in der Datenbank auch als chunks eintragen, ich finde das aber eher schlechter verständlich. Das Ergebnis sieht dann wie folgt aus:

</pre>
dig 20250609._domainkey.murphyslantech.de txt +short
"v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmisgEdSwzjqxHP4CWVrcSeA8wmAZL2btqu22aT9JHWmdRJzgQu0Gqpd+9m6zkc5h5io2SyOoeOWVZYz+wug5iN/bTZtuDb3abifYB+EfbUUCQKF7mjSxKwJxCPYVNDokXvbA8q2PS03aJZJj48bUJLQWPQ
XrVuuiZj+JgQfRndObj4" "WEv7iG+EdU8m6x5AOT5qFw3xaTEIdG910w+kG+mD/7H8lmYnEabCz1qKZIopgry0/EVG/45lKswdydI3E1BqCgHVcylQFSBVpkthhKJS9hP3eNDbJpnU15UwAAgsMnf22uzOSfvbyho2RCZa7Qq27yW5/ipyoOaVodYTZ5QQIDAQAB"

Bis Änderungen im DNS übernommen sind, dauert es ggf. ein wenig. Als hilfreich hat sich bei mir DKIM Core herausgestellt, damit kann man recht einfach prüfen ob die erzeugten Werte stimmig sind und auch ob der DNS-Eintrag korrekt ausgeliefert wird.

Somit hat man immerhin einmal eine mögliche Fehlerquelle im Griff.

Die Sache mit dem Content-Filter (amavisd) und der doppelten Signatur

DKIM hat als eine wichtige Aufgabe den Schutz gegen unautorisierte Mails, ganz häufig sind das (leider) Viren und diverse unerwünschte Werbung (SPAM). Um dem was dann noch durchkommt ein wenig Einhalt zu gebieten, gibt es natürlich weitere Maßnahmen. Bei mir ist hierfür amavisd als Content-Filter-Proxy am Werk. Das hat aber im konkreten Fall leider etwas ungeplante Nebenwirkungen, denn nach dem Durchlauf durch amavisd wird die e-mail wieder in Postfix eingespeist und dort dann nochmals mit einer weiteren Signatur versehen. Das ist natürlich nicht, dass was wir haben wollen, macht es doch die e-mail-Signatur ungültig, weil es dann zwei DKIM-Header gibt. Abhilfe schafft es, die /etc/postfix/master.cf für den Eingang aus Amavis entsprechend anzupassen und dort um ’no_milters‘ zu ergänzen:

-o receive_override_options= ... no_milters

Damit wird der Open-DKIM-Milter nicht aktiv und es gibt damit auch keine doppelte Signatur mehr.

Fazit

DKIM bietet eine zusätzliche Sicherheit und wird von mehr und mehr der großen Anbieter eingefordert. Um die kommt man auch nicht herum, denn die wenigstens Benutzer betreiben einen eigenen Mailserver. Ich werde mich auch nochmal etwas weiter mit der Konfiguration beschäftigen, wie bereits eingangs beschrieben ist es eher selten beackert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.