Änderungen am jetzigen Ablauf

Wie auch bei der Validierung schauen wir uns kurz an, wie der Email-Versand heute abläuft, da wir diesen um die Signierung ergänzen und somit verändern. Heute verbindet sich unser Mail User Agent (MUA) auf Port 25 mit unserem SMTP-Server Postfix, meldet sich mit den Zugangsdaten an und übermittelt die Email.

Wir werden unsere Konfiguration nun so anpassen, dass sich unsere MUAs ab sofort auf Port 587 verbinden können. Nur dann werden die ausgehenden Nachrichten auch signiert. Würden wir Nachrichten, die via Port 25 verschickt werden auch signieren, so würden wir auch eingehende Emails signieren.

Der neue Ablauf sieht vor, dass Nachrichten auf Port 587 über eine verschlüsselte Verbindung an Postfix eingeliefert, von DKIMproxy signiert und anschliessend von Postfix an das Zielsystem übergeben werden.

DKIM Proxy konfigurieren

Im Validierungstutorial, in dem ich dir gezeigt habe, wie wir Postfix dazu bringen, die DKIM-Signatur von Emails zu validieren, haben wir DKIMproxy, DSPAM und Postfix bereits so konfiguriert, dass sie auf den Ports 25 und 10025 bis 10027 lauschen. Für die Signierung ausgehender Nachrichten werden wir DKIMproxy zusätzlich auf Port 10028 und Postfix zusätzlich auf Port 587 lauschen lassen.

DKIMproxy konfigurieren wir in der Datei /usr/local/etc/dkimproxy_out.conf, indem wir folgende Zeilen eintragen, die der Validierungs-Konfiguration sehr ähnlich sind:

listen   10.0.0.3:10028
relay   10.0.0.3:10027

sender_map /usr/local/etc/dkim/dkim_sender_map

In der Datei dkim_sender_map werden wir später definieren, wie unsere ausgehenden Emails signiert werden sollen. Das schauen wir uns aber erst nach der Konfiguration von Postfix an.

Um die Signierung zu aktivieren, müssen wir noch folgende Zeile in die /etc/rc.conf eintragen, so wie wir es bereits für den Validierungsteil getan haben:

dkimproxy_out_enable="YES"

Wir starten DKIMproxy allerdings noch nicht neu, da wir noch Anpassungen an der Postfix-Konfiguration vornehmen müssen.

Postfix-Konfiguration anpassen

In Postfix müssen wir den so genannten Submission-Dienst aktivieren. Dieser nimmt nur Emails von Clients auf Port 587 entgegen. Die Aktivierung erfolgt mit Hilfe der folgenden Zeilen in der master.cf:

submission   inet   n   -   -   -   -   smtpd
   -o receive_override_options=no_address_mappings
   -o content_filter=dkim-out:[10.0.0.3]:10028
   -o smtpd_tls_security_level=may
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_client_restrictions=permit_sasl_authenticated,permit_mynetworks,reject

In der dritten Zeile geben wir einen Content-Filter an. Diesen habe ich als dkim-out bezeichnet. Hierbei handelt es sich um den DKIMproxy-Signierserice. In der master.cf müssen wir allerdings dkim-out noch definieren. Dies tun wir mit folgenden Zeilen:

dkim-out   unix   -   -   n   -   4   smtp
   -o smtp_send_xforward_command=yes
   -o smtp_discard_ehlo_keywords=8bitmime,starttls

Wenn wir gleich Postfix neustarten, wird es in der Lage sein auf Port 587 Emails entgegen zu nehmen, diese an DKIMproxy auf Port 10028 weiterzureichen und anschliessend zu versenden.

Private- und PublicKey generieren

In der Sender-Map haben wir definiert, dass der PrivateKey für die Domain example.com in der Datei /usr/local/etc/dkim/example.com/private.key zu finden ist. Das Verzeichnis und den Schlüssel müssen wir noch anlegen bzw. generieren. Die Berechtigungen passen wir direkt mit an.

# mkdir -p /usr/local/etc/dkim/example.com/
# chmod 500 /usr/local/etc/dkim/example.com/
# openssl genrsa -out /usr/local/etc/dkim/example.com/private.key 1024

Anschliessend erstellen wir noch den zugehörigen PublicKey, den wir später via DNS veröffentlichen werden. Den PublicKey erstellen wir mit folgendem Befehl:

# openssl rsa -in /usr/local/etc/dkim/example.com/private.key \
   -pubout -out /usr/local/etc/dkim/example.com/public.key
# chmod 400 /usr/local/etc/dkim/example.com/*.key
# chown -R dkimproxy /usr/local/etc/dkim/

DKIM Sender Map anlegen

In der Datei dkim_sender_map, deren Pfad wir bereits in der DKIMproxy-Konfiguration angegeben haben, definieren wir, welche Emails wie signiert werden sollen. Eine solche Konfigurationszeile sieht dabei wie folgt aus:

example.com \
   dkim(s=dkim-2012,d=example.com,c=relaxed,a=rsa-sha256, \
      key=/usr/local/etc/dkim/example.com/private.key), \
   domainkeys(s=dkim-2012,c=nofws,a=rsa-sha1, \
      key=/usr/local/etc/dkim/example.com/private.key)

Diese Zeile enthält einige Parameter, die im Einzelnen folgendes bedeuten:

  • s: Der Name (Selector), mit dem der entsprechende PublicKey bestimmt wird.
  • d: Die zu signierende Domain.
  • c: DKIM kennt einen strengen ('strict') und einen lockeren ('relaxed') Modus. "Streng" bedeutet, dass keinerlei Veränderungen an der Original-Email vorgenommen werden dürfen. Der "lockere" Modus ist da etwas toleranter.
  • a: Der Signaturmodus, RSA-SHA1 oder RSA-SHA256, wobei ich RSA-SHA256 empfehle.
  • key: Der Pfad zum PrivateKey, der für die Signierung verwendet werden soll.

In der zweiten Klammer, die die Domainkeys-Signierung konfiguriert, ist ein rsa-sha1 korrekt, da hier rsa-sha256 nicht unterstützt wird. Falls du hier einen falschen Wert einträgst, wird DKIMproxy nicht starten.

Wenn wir die Konfiguration nun vorgenommen haben, können wir alle beteiligten Dienste neustarten. Jetzt ist wichtig die Log-Dateien zu inspizieren. Für Postfix bspw. die /var/log/maillog und wie immer die /var/log/messages. Wenn du dich jetzt über deinen Client auf Port 587 mit Postfix verbindest und eine Email an eine weitere Email-Adresse von dir verschickst, solltest du einen Header nach folgendem Muster darin finden:

X-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=example.com; s=dkim-2012;
   bh=XXXXXXXXXXXXXXXXXXX=;
   b=a68X977KswmW7Iew0cRWoswOcAMAAaRh/JJ0sC86kZ4W1cRV0BsiX+D86xBvMD+BwM
      g+DgB6z4juTBS60nCYgJGlU2jwSq4kWYdszX4fBsnNzAlVoXfVw6HlG/KF0h2cvOe8Xv
      MivMmPCoreN0KoshhNsmFPfux8fI0CYSFnk2onYq7KPT81hioaNZYM9nakCgRxPSaOs+
      7oRzukBb1vky7EyKsiz4Znb4a2esNZBy5kqKtxULCTOH66rRn7Fomb4sWYCu4SbLY9n0
      tRmTRU8V67T51sLiB3aiVYDgB0qLu1RrckEfpjUSWHIbrkItIf40rbHd16/jA/HbZ810
      qZ+A==

DNS-Eintrag erstellen

Der PublicKey wird über einen speziellen DNS-Eintrag veröffentlicht, sodass der validierenden Email-Server diesen beziehen und mit der in der Nachricht enthaltenen Signatur abgleichen kann.

Ein solcher DNS-Eintrag ist wie folgt aufgebaut:

dkim-2012._domainkey.example.com IN TXT "v=DKIM1; h=sha256; \
p=<PublicKey>; s=email; o=~; t=n"

Dieser DNS-Eintrag vom Typ TXT beginnt mit dem Selektor. Wir haben diesen in unserem Beispiel hier dkim-2012 genannt. Wie in den anderen Tutorials auch, ist example.com die Domain, für die wir den Schlüssel angeben. Den Parameter p musst du mit deinem PublicKey (nicht PrivateKey!) befüllen. Mit "s=email" geben wir an, dass wir lediglich Emails signieren und "t=n" bedeutet, dass es sich nicht um eine DKIM-Testinstallation handelt. Während deinen Tests solltest du diesen Wert eher auf "t=y" abändern.

Der Parameter o am Ende kann folgende Werte annehmen:

  • o=~: Das bedeutet, dass einige Emails von dieser Domain signiert sind, nicht alle.
  • o=-: Alle Emails sind signiert, unsignierte sollten vom Empfänger aber auch angenommen werden.
  • o=!: Alle Emails sind signiert, der Empfänger soll keine unsignierten Emails annehmen.

Mit dem Parameter r können wir zudem eine Postmaster-Adresse angeben, an die sich gewandt werden kann, sollte es Probleme mit der DKIM-Validierung geben. Das sähe dann so aus:

(...) r=postmaster@example.com;

Noch ein Tipp: Es gibt einen webbasierten DNS-Record Generator unter http://www.dnswatch.info/dkim/create-dns-record.