[Linux-Server] DKIM-Signaturen unter Ubuntu

E-Mail-Spam ist ein zeitfressendes Problem in unserer heutigen Gesellschaft und die Administratoren der Mailserver sind in einem permanenten Kopf-an-Kopf-Rennen mit den Versendern dieser unerwünschten und zeitraubenden E-Mails. Leider ist das ursprünglich genutzte SMTP-Protokoll selber nicht dafür ausgelegt Spam zu bekämpfen. Allerdings haben sich vor etwa 5 Jahren einige Leute bei Yahoo hingesetzt und eine DNS-basierte Signaturmöglichkeit für Mailserver erarbeitet. Inzwischen wurde die damals erarbeitete Lösung durch das neuere DKIM abgelöst.

DKIM arbeitet auf dem Prinzip der asymmetrischen Verschlüsselung und fügt der E-Mail serverseitig eine Signatur hinzu, die es ermöglicht zu prüfen, ob der Mailserver, der für die entsprechende Domain zuständig ist, auch wirklich der Versender der E-Mail ist. Somit kann kein anderer Server mehr behaupten, dass er im Auftrag des Domain-Eigentümers E-Mails versendet, obwohl er dazu nicht befugt ist, denn dann würde er die richtige Signatur setzen können. (Mehr Informationen zur Funktionsweise gibt es in der Wikipedia)

Zwar ist DKIM auch nicht die Lösung auf alle Spamprobleme, allerdings kann man sichje weiter sich DKIM durchsetzt, mehr auf die Resultate dieser Überprüfung verlassen und es wird schwerer für Spammer von Domains, die nicht ihnen selbst gehören, Spam zu versenden.

Im folgenden möchte ich die Einrichtung der DKIM-Signierung auf einem Ubuntu-Server zeigen. Ich setze dabei voraus, dass ein bereits vollständig laufender Postfix-Mailserver existiert. Weiterhin wird Zugriff auf das DNS benötigt, da einige Informationen im DNS abgelegt werden müssen. Alle hier aufgeführten Schritte und Befehle werden als Benutzer "root" durchgeführt.

Vorbereiten der Einrichtung

Im ersten Schritt wird das einzige zusätzlich notwendige Paket auf dem Ubuntu-Server installiert:
# aptitude install dkim-filter
Damit ist die Installation der neuen Pakete abgeschlossen und es kann mit der Konfiguration begonnen werden. Die Konfiguration besteht aus mehreren Schritten. Zuerst werden wir den DKIM-Deamon entsprechend einrichten, damit er die E-Mails signiert. Im zweiten Schritt binden wir den DKIM-Deamon in den schon bestehenden Postfix-Server ein. Der dritte Schritt dient der Konfiguration der Keys und des DNS.

Schritt 1: Konfiguration des DKIM-Deamon

Die Konfiguration besteht nach der Installation zuerst aus 2 Dateien. Die erste Datei befindet sich unter "/etc/defaults/dkim-filter" und legt fest, wie der DKIM-Deamon angesprochen werden kann. Hier sollte alles so gelassen werden wie es ist.

Die zweite Datei findet sich unter "/etc/dkim-filter.conf" und konfiguriert das eigentliche Verhalten des Servers. Hier werden wir einige Änderungen vornehmen. Hier als erstes eine Beispiel-Konfiguration, wie ich sie nutze:

# Log to syslog
Syslog			yes

# Weitere Domains mit Komma anfügen Domain example.com # Standard-Selektor für die DNS-Abfrage Selector mail KeyList /etc/dkim-keys.conf

# Common settings. See dkim-filter.conf(5) for more information. AutoRestart yes Background yes Canonicalization simple DNSTimeout 5 Mode sv SignatureAlgorithm rsa-sha256 SubDomains no X-Header no

# Standardaktionen bei bestimmten Vorkommnissen On-Default tempfail On-BadSignature tempfail On-DNSError tempfail On-InternalError accept On-NoSignature accept On-Security tempfail

Diese Konfiguration kann so übernommen werden und muss dann nur im Wert "Domain" angepasst werden. Dort müssen alle Domains aufgelistet werden, für die später eine Signatur gesetzt werden soll.

Weiterhin legen wir an dieser Stelle schon eine Datei und einen Ordner für die Verwendung in Schritt 3 an:

# touch /etc/dkim-keys.conf
# mkdir -p /etc/dkim/

Schritt 2: Einbinden in den Postfix-Mailserver

Die Einbindung in den Postfix-Server gestaltet sich recht einfach. Hierzu werden einfach folgende Zeilen in die Datei "/etc/postfix/main.cf" eingefügt: (Sollten schon vorher Milter konfiguriert gewesen sein, müssen die Zeilen entsprechend abgeändert werden!)
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
Wenn Ihr im ersten Schritt die Datei "/etc/defaults/dkim-filter" verändert habt, müssen diese Zeilen hier entsprechend angepasst werden.

Schritt 3: Konfiguration der Domains

Als erstes legen wir für die Schlüssel, die verwendet werden sollen, im Verzeichnis "/etc/dkim/" pro Domain einen Ordner an. Das ist deswegen nötig, da die Schlüssel für jede verwendete Domain immer exakt gleich benannt sein müssen wie der Selektor in der Konfiguration. Im Beispiel muss also der verwendete Schlüssel immer "mail" heißen.
mkdir -p /etc/dkim/example.com/
In diesem Ordner wird jetzt der Schlüssel für die Domain erzeugt:
# cd /etc/dkim/example.com/
# openssl genrsa -out mail 1024
# openssl rsa -in mail -out public.key -pubout -outform PEM
Damit ist die Erstellung der Keys abgeschlossen und wir können uns der Datei "/etc/dkim-keys.conf" zuwenden:

In dieser Datei wird pro Zeile ein Key der entsprechenden Domain zugeordnet, deren Mails mit diesem Key signiert werden sollen:

*@example.com:example.com:/etc/dkim/example.com/mail
Dabei ist schon zu sehen: Im ersten Feld werden die Absender-Adressen festgelegt, auf welche die Signierung angewandt werden soll. Im Normalfall dürften das alle Adressen sein. Das zweite Feld enthält die Signatur-Domain. Im dritten Feld steht der private Schlüssel der Domain zum Erzeugen der Signatur.

Nachdem diese Schritte abgeschlossen sind, geht es an die Konfiguration des DNS um den fremden Mailservern mitzuteilen, welchen Schlüssel wir verwenden und wie er mit den E-Mails verfahren soll. Dazu werden zwei TXT-DNS-Records angelegt:

1. Der DKIM-Eintrag:

mail._domainkey.example.com. IN TXT "v=DKIM1; g=*; k=rsa; p=[...];"
Hier muss das [...] durch den Public-Key in der Datei "/etc/dkim/example.com/public.key" ersetzt werden. Wenn also der Inhalt der "public.key"-Datei wie folgt aussieht:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgSDdeKxkVvr9myBLP66cMgLqb
0zy7kbV2UzuRVj99t2LiNEQg/l6P9Cgj1BWrVrkbMnKjCTNQbBnY8ASUFMx37EDc
Y1tpLshTMWcJ0piMNOPWyhpqe1QxbQYI2jLunxcgfHF4KjBAAZxI2Y0QHFCvlMdm
MYtpdq0G0MzBfqTTYwIDAQAB
-----END PUBLIC KEY-----
Dann muss der DNS-Eintrag etwa wie folgt aussehen:
mail._domainkey.example.com. IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA...DAQAB;"
(Natürlich muss der komplette Key in den DNS-Eintrag eingetragen werden. Ich habe ihn nur der Übersichtlichkeit halber gekürzt.)

2. Der Policy-Eintrag:

_adsp._domainkey.example.com. IN TXT "dkim=all"
An dieser Stelle sind die Werte "unknown","all" und "discardable" möglich. "unknown" bedeutet, dass nicht bekannt ist welche E-Mails signiert werden. Damit ist das auch die niedrigste Sicherheitsstufe. Bei "all" müssen alle E-Mails signiert sein, werden aber bei einem Fehlen der Signatur nicht abgelehnt sondern einfach nur als suspekt eingestuft. Der Wert "discardable" sagt aus, dass eine nicht signierte E-Mail abgewiesen werden darf.

Abschluss der Einrichtung

Zum Abschluss der Einrichtung werden auf dem Mailserver noch die Dienste "postfix" und "dkim-filter" neu gestartet, damit alle Änderungen übernommen werden:
# /etc/init.d/postfix restart
# /etc/init.d/dkim-filter restart
Damit ist die Einrichtung abgeschlossen und der folgende Test sollte erfolgreich verlaufen:

Zum Testen der Einrichtung kann eine E-Mail an den Autoresponder "autorespond+dkim@dk.elandsys.com" geschickt werden. Die Antwort auf diese E-Mail sollte dann folgenden Text enthalten:

DKIM Signature validation: pass (1048-bit key)
DKIM Author Domain Signing Practices: "dkim=all"
Wobei bei euch natürlich die ADSP-Anweisung anders aussehen kann. Sollten diese Informationen nicht zurück kommen, kann es sein, dass die DNS-Änderung noch nicht bekannt ist. Dann muss entsprechend der TTL der Zone gewartet werden, bis der Key und die ADSP bereit stehen. Ansonsten gibt der Autoresponder auch Informationen darüber aus, warum die Validierung nicht funktioniert hat.