E-Mails signieren mit DKIM

Seite 6: Signatur

Inhaltsverzeichnis

Mit dem Milter-Protokoll von Sendmail lassen sich on the fly sowohl Header als auch Body einer E-Mail modifizieren. Wietse Venema, geistiger Vater von Postfix, empfand alle Ansätze für ein eigenes Protokoll als "poor use of human and system resources " und brachte seinem Server daher ebenfalls Milter bei. Die Postfix-Implementierung verfügt zwar aufgrund der anderen internen Struktur nicht über dieselben Milter-Makros wie Sendmail. Aber seit Version 2.4 reicht der Funktionsumfang für die DKIM-Signierung aus.

Weil der Standard recht neu ist, ändert sich die Software derzeit noch häufig und die Distributionen hinken hinterher. Daher ist es meist nötig, die DKIM-Applikation selbst zu kompilieren, in diesem Fall dkim-milter. Wer sich dazu gezwungen sieht, muss dann auch regelmäßig nachsehen, ob dkim-milter ein Sicherheitsupdate braucht. Es empfiehlt sich, auf das Paket der Distribution umzusteigen, sobald das alle Funktionen unterstützt, damit dann wieder automatische Sicherheitsupdates greifen.

Voraussetzung sind die "Milter Development-Libraries ". Diese erhalten Postfix-Anwender indem sie über einen Paketmanager entweder das sendmail-devel- oder libmilterdev-Paket installieren; da die Milter-Schnittstelle sich nicht mehr ändert, genügt hier das Paket der Distribution. Danach kompilieren und installieren die etwas ungewöhnlichen Befehle

sh ./Build
sh ./Build install

das Programm dkim-filter. Es ist ratsam, für den Filter einen nicht privilegierten Benutzer anzulegen, zum Beispiel mit dem Namen "dkim ". Er sollte in keinem Zusammenhang mit dem Mailsystem stehen, insbesondere nicht zu derselben Unix-Gruppe gehören. Seine Einstellungen entnimmt dkim-filter den Kommandozeilenoptionen und einer Konfigurationsdatei, die man dem Programm über den Kommandozeilenschalter -x mitgibt. Das Listing unten auf dieser Seite zeigt eine einfache Konfiguration. Achtung Postfix-Admins! Die Notation sieht ähnlich wie Postfix-Syntax aus, ist es aber nicht. Mit diesen Einstellungen signiert dkim-filter alle ausgehenden Mails der Domain example.com, aber keine ihrer Subdomains (SubDomains-Parameter). Das Programm läuft ausschließlich im Signier-Modus (Mode), weil das Verifizieren im hier vorgestellten Mailsystem SpamAssassin übernimmt.

Nach dem Start mit root-Rechten läuft das Programm unter dem nicht-privilegierten Account dkim weiter. Damit es trotzdem den Signier-Schlüssel aus der mit KeyFile angegebenen Datei verwenden kann, muss der Admin die Zugriffsrechte anpassen:

chown dkim mail200801.private
chmod 0400 mail200801.private

Nach dem Start wartet dkim-filter auf dem mit Socket spezifizierten Kanal auf eingehende Verbindungen. Der Canonicalization-Parameter legt für Header und Body fest, wie Umbrüche und Leerzeichen behandelt werden. Im Beispiel erlaubt relaxed/simple, dass die signierten Header beim Prüfen mehr Whitespace enthalten als beim Signieren, während der Body exakt so ankommen muss, wie er signiert wurde. Das ist sinnvoll, weil eventuell Server auf dem Weg der Mail die Header "optimieren ", indem sie lange Einträge umbrechen und anschließend mit Leerzeichen einrücken.

Manche Header sind für die Authentizität der Mail nicht wichtig und werden unterwegs besonders häufig geändert oder entfernt. Damit das nicht jedes Mal die Signatur zerstört, kann der Postmaster sie von Anfang an mit dem Parameter OmitHeaders von der Signatur ausnehmen (siehe S. 124). Der Selector-Parameter sagt dkim-filter, welchen Namen er für den öffentlichen Schlüssel in die Signatur eintragen soll. Er muss dem zuvor erzeugten DNS-Eintrag entsprechen, damit der Verifizierer sich später den passenden TXT-Record besorgen kann. Für den Testbetrieb veranlassen die zusätzlichen Optionen Syslog Yes und SyslogSuccess Yes dkim-filter, Fehler- und Erfolgsmeldungen ins Systemlog zu schreiben. Der Befehl dkim-filter -x /etc/mail/dkim-filter.conf startet das Programm mit der richtigen Konfigurationsdatei. Es verzieht sich in den Hintergrund (Background-Parameter) und wartet auf Aufträge. Mit dem Kommando lsof -i | grep 8891 prüft root schnell, ob dkim-filter wie gewünscht auf Port 8891 lauscht. Dann ist es Zeit, Postfix und den neuen Helfer miteinander ins Gespräch zu bringen. Das soll wie eingangs erklärt möglichst spät passieren, in der skizzierten Systemarchitektur also erst, wenn amavisd-new eine Nachricht wieder an das Postfix-Mailsystem zurückgibt. Ein dedizierter SMTP-Server nimmt die Nachricht entgegen. Auch er holt sich seine Konfiguration aus der Datei master.cf.

Domain example.com
SubDomains No
Mode s
UserID dkim
KeyFile /etc/mail/mail200801.private
Socket inet:8891@127.0.0.1
Canonicalization relaxed/simple
OmitHeaders Return-Path,Received,Comments,Keywords,Bcc,Resent-Bcc
Selector mail200801
Background Yes

Aus der Datei dkim-filter.conf holt sich das Signier-Programm seine Einstellungen.

Die Zeile -o smtpd_milters=inet:localhost:8891 am Ende dieses Abschnitts genügt. Postfix übergibt die Mail nun an den Milter und versendet das Ergebnis, sobald es von dkim-filter zurückkommt. Nach einem postfix reload ist der dkim-filter in den Postfix-E-Mail-Transport eingebaut und kann getestet werden.

Wer noch feilen möchte, kann sich unter anderem den KeyList-Parameter von dkim-filter ansehen. Dieser Parameter liest eine Tabelle ein, in der Domain- und sogar User-spezifisch Signier-Schlüssel zugewiesen werden können.