Tags: E-Mail, Authentifizierung, Linux, DNS
Domain Keys Identified Mail (DKIM) ist eine Methode zur E-Mail-Authentifizierung. Die für die Signierung und Überprüfung von Nachrichten erforderlichen Schlüssel lassen sich mit OpenSSL im Subsystem für Linux erzeugen. Der Public Key muss dann mittels eines TXT-Records in das DNS eingetragen werden.
Mechanismen wie das Sender Policy Framework (SPF) oder DKIM dienen dazu, die Authentizität einer Nachricht zu belegen und so den Missbrauch von E-Mail einzuschränken. Wenn man diese Techniken verwendet, dann verringert sich das Risiko, dass die eigenen Mails beim Empfänger im Spam-Ordner landen.
Konfiguration abhängig vom Mail-System
Nutzt man Online-Dienste wie GMail oder Mailchimp, dann kümmern sich in der Regel deren Betreiber um die DKIM-Konfiguration. Anders sieht es hingegen aus, wenn man Office 365 einsetzt. Dort bleibt es dem Anwender überlassen, die DKIM-Keys zu generieren und zu hinterlegen (siehe: Exchange Online für DKIM konfigurieren).
Um die Echtheit von Mails zu bestätigen, signiert der Versender (Mail-Server, Newsletter-System, etc.) die Nachricht mit dem privaten Schlüssel, den man im jeweiligen System hinterlegt. Der Empfänger prüft die Signatur mit Hilfe des Public Key, den er aus dem DNS-Eintrag der Senderdomäne entnimmt.
Auswahl des Tools zur Schlüsselgenerierung
Einige Online-Tools vereinfachen das Generieren der Keys und das Zusammenstellen des DNS-Eintrags. Man gibt bloß den Namen der Domäne ein und sie spucken die benötigten Daten aus.
Für produktive Umgebungen ist deren Einsatz jedoch nicht ratsam, weil die Betreiber dieser Services dann auch im Besitz des privaten Schlüssels sind und sein Missbrauch somit nicht ausgeschlossen werden kann.
Stattdessen bietet sich an, die Keys selbst mit OpenSSL zu erzeugen. Wenn man unter Windows arbeitet, müsste man dort jedoch erst OpenSSL installieren. Dies kann man sich sparen, wenn man das Subsystem für Linux (WSL) eingerichtet hat. Für Admins und Web-Entwickler gehört das WSL zu den besten neuen Windows-Features der letzten Jahre und sollte auf deren Workstations nicht fehlen.
Aufruf von OpenSSL
Entscheidet man sich dort für Ubuntu als Distribution, dann enthält dieses bereits eine aktuelle Version von OpenSSL. Um den privaten Schlüssel zu erzeugen, gibt man folgenden Befehl ein:
openssl genrsa -out contoso.private.key 2048
Die Schlüssellänge von 2048 ist nicht zwingend, aber üblich.
Anschließend generiert man daraus den öffentlichen Schlüssel:
openssl rsa -in contoso.private.key -pubout -out contoso.public.key
Die Datei contoso.public.key enthält in unserem Beispiel den Public Key, kodiert als Base64. Für den DNS-Eintrag benötigt man ihn jedoch ohne die Beginn- und Endemarkierung sowie ohne Zeilenumbrüche.
Wenn man diese nicht manuell entfernen möchte, dann kann man die Datei gleich auf der Linux-Shell durch den Stream-Editor schicken und die Zeilenvorschübe mit tr ausfiltern:
sed 's/---.*---//' dkim.pub.key | tr -d '\n' | paste -d ' '
Während man nun den privaten Schlüssel in das Mail-System auf die jeweils dort vorgesehene Weise eingibt, benötigt man den Public Key für das DNS.
TXT-Eintrag im DNS anlegen
Dort erstellt man einen TXT-Eintrag, dessen Name sich so zusammensetzt:
Selector._domainkey.domain.tld
Den Selector kann man beliebig wählen (Klein- und Großbuchstaben, Ziffern und Bindestriche), aber es ist sinnvoll, dafür einen sprechenden Namen zu finden. Er könnte etwa das Jahr oder das Programm enthalten, das den Key nutzt. Pro Domäne dürfen mehrere derartige Einträge hinterlegt werden, und der Selector dient dazu, diese voneinander zu unterscheiden. Ein Beispiel wäre:
newsletter2021._domainkey.contoso.de
Nach dem Namen benötigt man nun noch den Wert für den TXT-Record. Er beginnt meistens mit der optionalen DKIM-Version, gefolgt vom Typ und Wert des öffentlichen Schlüssels:
v=DKIM1;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA…
Nachdem man den TXT-Eintrag gespeichert hat, kann man diesen mit diversen Online-Tools testen. Eines davon findet sich zum Beispiel bei MXToolbox. Diese Programme prüfen jedoch nur das Vorhandensein und die syntaktische Korrektheit des DNS-Eintrags.
Ob die Signierung tatsächlich funktioniert, lässt sich nur über das Versenden einer Mail herausfinden. Schickt man sie etwa an eine Adresse bei GMail oder Outlook.com, dann kann man dort den rohen Inhalt der Nachricht anzeigen. Im Header müsste sich ein dkim=pass finden.
Als Problem könnte sich zum Beispiel erweisen, dass die Nachrichten über PHP mail rausgehen. Dort lässt sich die Reihenfolge der E-Mail-Header nicht festgelegen, so dass der DKIM-Eintrag nicht wie vom RFC empfohlen an erster Stelle steht.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links