Inhaltsverzeichnis

DKIM - Domain Key Identified Mail

DKIM Logo Zur Sicherstellung der Authentizität von E-Mail-Absendern wurde in 2004 von Yahoo ein Identifikationsprotokoll entwickelt, mit welchem die Authentizität von E-Mail-Absendern sichergestellt werden kann. Dies wurde vor allem mit dem Wunsch zur Eindämmung unerwünschter eMail wie Phishing und/oder Spam konzipiert. Ursprünglich wurde DomainKeys unter dem Titel Domain-Based Email Authentication Using Public Keys Advertised in the DNS (DomainKeys) im RFC 4870 veröffentlicht. Im RFC 4871 wurde dies unter dem Titel DomainKeys Identified Mail (DKIM) Signatures weitergeführt.

DKIM basiert auf asymmetrischer Verschlüsselung, bei der eMails mit einer digitalen Signatur versehen werden. Der empfangende Mail-Server ist nun in der Lage, an Hand des öffentlichen Schlüssels diese Daten, der im TXT-Record des Domain Name System (DNS) der Domäne abrufbar ist, die Daten zu verifizieren. Bei einem negativen Ergebnis hat nun der empfangende MTA1) die Möglichkeit, die Annahme der eMail zu verweigern bzw. die empfangene Nachricht auszusortieren. Dies ist möglich, da der sendende MTA jede versendete E-Mail im sogenannten „DomainKey-Signature-Header“ mit einer digitalen Signatur des Inhaltes der E-Mail versieht.

Für die Erzeugung des Hashwertes für diese Signatur unterstützt DKIM die Hashfunktionen SHA-1 und SHA-256. Die Verschlüsselung des Hashwertes, welche letztendlich die digitale Signatur zum Ergebnis hat, wird dabei mit dem Verschlüsselungsverfahren RSA realisiert. Damit die Signatur mit dem beim eMail-Versand verwendeten ASCII-Zeichensatz angezeigt werden kann, wird sie abschließend mit Base64 kodiert. Auf der Empfängerseite wird nun die erhaltene digitale Signatur im ersten Schritt Base64 decodieren, und den Inhalt mit Hilfe des in dem TXT-Record des Absenders enthaltenem publickey decodieren. Diesen Hashwert vergleicht nun der empfangene MTA mit dem selbst errechneten Hashwert der Nachricht. Stimmen diese überein, kann zweifelsfrei die Absendedomäne ausgemacht werden. Eine mit Hilfe von DKIM signierte eMail bietet also eine Möglichkeit, sicher nachzuprüfen, ob die in der eMail-Absenderadresse enthaltene Domäne korrekt ist und ob die Nachricht auf dem Zustellungsweg nicht manipuliert wurde.

Installation

Zur Signierung und Überprüfung der empfangenen Daten nutzen wir bei unserem Mailserver-Postfix die Möglichkeiten von AMaViS. Die Grundinstallation von AMaViS ist im Kapitel Virenschutz mit AMaViS beschrieben. In unserer Postofficeumgebung nutzen wir AMaVis in der Version amavisd-new-2.6.4. Neben diesem Perl-Programm benötigen wir noch das Paket perl-Mail-DKIM welches bei der Installation von amavisd-new automatisch mitinstalliert wurde.

Bei der nachfolgenden Konfigurationsbeschreibung gehen wir davon aus, dass bereits ein funktionierender Mailserver wie auch der Viren- und SPAM-Schutz mit Hilfe von AMaViS zur Verfügung steht.

Konfiguration

Als erstes legen wir das Zielverzeichnis für unseren privaten Schlüssel an und passen die Berechtigung so an, dass dieses Verzeichnis unserem User amavis „gehört“:

 # mkdir /var/amavis/dkim
 # chown amavis:amavis /var/amavis/dkim

Keyerstellung

Im nächsten Schritt erstellen wir uns nun unser Schlüsselpaar:

 # amavisd genrsa /var/amavis/dkim/dkim-key.pem
 Private RSA key successfully written to file "/var/amavis/dkim/dkim-key.pem" (1024 bits, PEM format)

Alternativ können wir auch openssl zum Erstellen des Schlüssel verwenden.

 # openssl genrsa -out dkim-key.pem 1024
 Generating RSA private key, 1024 bit long modulus
 ..........++++++
 .............++++++
 e is 65537 (0x10001)

Anschließend passen wir die Dateiberechtigungen unseres erstellen keys an.

 # chmod 600 dkim-key.pem

In unserem zuvor erstellten Verzeichnis befindet sich nun der erstellte private Schlüssel.

 # ll /var/amavis/dkim/
 -rw------- 1 root root 887 15. Jul 22:13 dkim-key.pem

Damit später der User amavis auf diese Datei auch lesend zugreifen kann, berichtigen wir nun die Dateirechte.

 # chown amavis:amavis dkim-key.pem 

In dieser Datei befindet sich nun der private key.

# cat /var/amavis/dkim/dkim-key.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDWypzomx/COZmYML/9j/MRNH9Chw652qzbHjM4RdzpeWzainKC
+kyYP+VuoJWMtUX2KSo+kTuWaH4AUgwWSxKq4IBq34MgWsDi3h/mFekOqtnIHTZM
16CLtzQUHAEwCUZqouQkDzQUHAEwCUZq2F9qbRFRB4WWJyuCF6GNQLX9jQIDAQAB
AoGAFgSC/R0ZrlE1O3KT26wr4HGfMfSiP874tSVtXrFaqdw2mlhi0KZTv6+dFzAC
5H+YgllJ6Uv97bccY3AFqStc6FMuEnbZBzQUHAEwCUZqMUvln1Hm+pt9nKmc2T1d
4NZFpm9wdghEolGgdQUJtqaKiClSJGAW28qne4TxQ/4s8skCQQDx07HAUveFk7dN
zHdO+LYDyXGW/Z4/Hd/+N1ckD1eFAULeSAU+/Gyi8P8TTpIIeCFhao+72DlPbl0D
/R0euJY/AkEA42FJITBi3W8D4i1ifVZUnCFdBUHiZx2wpWNmkFHbMBGSddmLq1SD
o0FkSK2yUUSyJil44mE68knnZ3JoE1IxMwJAGz0zKmyuANfQr+y2C6ksJ2ULbGyI
5Kcimm3a1RXTenwsD1lvVM46tmfa83vIKzgM2oI8SnZijjXqOEbMfudf1QJBAIG8
E261XeN8IRoezRA4fsQqoRmL0vME1LI4+d8kZUyS6h8FxhQ2f3lZqS9ys8h8yqzN
guSfl3OAyWCTvWAwyFMCQFb0t7soo/mHoS5EP+Q7/TRyjdzUzRrVZO5sO0HUMyhL
SPfoF9go3M+8jZ2ac/kbs6iUlQT/zS4/T4DVScoPgCs=
-----END RSA PRIVATE KEY-----

AMaViS

In unserer AMaViS-Konfiguration hinterlegen wir nun die sowohl die Möglichkeiten der Signierung wie auch Überprüfung der DKIM-Funktionalitäten. Am Anfang unserer Konfigurationsdatei hinterlegen wir demnach folgende Definitionen.

# vim /etc/amavisd.conf
amavisd.conf
$enable_dkim_verification = 1;  # enable DKIM signatures verification
$enable_dkim_signing = 0;    # load DKIM signing code, keys defined by dkim_key
dkim_key('nausch.org', 'main', '/var/amavis/dkim/dkim-key.pem'); # Nausch.org's Mailserver key
@dkim_signature_options_bysender_maps = (
    { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );
 

Bei diesem Beispiel gehen wir davon aus, dass wir nur eine Domäne auf unserem Mailserver haben und diese Nachrichten signieren wollen.

Haben wir noch weitere virtuelle Mailserver am laufen, können wir durch nachfolgende exeplarische Zeilen erreichen, dass auch diese Nachrichten mit unserem DKIM-Signatur versehen werden können.

amavisd.conf
dkim_key('nausch.org', 'main', '/var/amavis/dkim/dkim-key.pem'); # Nausch.org's Mailserver key
dkim_key('lists.nausch.org', 'main', '/var/amavis/dkim/dkim-key.pem'); # Nausch.org's Mailserver key
dkim_key('ebersberger-liedersammlung.de', 'main', '/var/amavis/dkim/dkim-key.pem'); # Nausch.org's Mailserver key    

Im ersten Schritt aktivieren wir nur die DKIM-Verifizierung, noch nicht die DKIM-Signierung! Solange wir unseren öffentlichen Schlüssel noch nicht via DNS-TXT-Record veröffentlich haben, verhindern wir so, dass von uns signierte Nachrichten am Zielserver abgewiesen werden, weil ohne dem öffentlichen Schlüssel, die Signierten Daten nicht decodiert werden können.

Damit AMaVis nun Kenntnis von unseren Änderungen erfährt, starten wir diesen einmal durch.

 # service amavisd restart

öffentlichen Schlüssel

Damit wir den unseren öffentlichen Schlüssel via DNS veröffentlichen können, geben wir den Key am Bildschirm aus.

# amavisd showkeys
; key#1, domain nausch.org, /var/amavis/dkim/dkim-key.pem
main._domainkey.nausch.org.     3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWypzomx/COZmYML/9j/MRNH9C"
  "hw652qzbHjM4RdzpeWzainKC+kyYP+VuoJWMtUX2KSo+kTuWaH4AUgwWSxKq4IBq"
  "34MgWsDi3h/mFekOqtnIHTZM16CLtouQDlkUYdatXLcMTlhIO/AH9eNB2F9qbRFR"
  "B4WWJyuCF6GNQLX9jQIDAQAB")

Auch hier können wir mittels openssl den public-key erstellen und auf die Platte schreiben lassen.

 #  openssl rsa -in dkim-key.pem -out public.pem -pubout -outform PEM
 writing RSA key

Die Dateiberechtigung passen wir entsprechend an:

 # chmod 600 /var/amavis/dkim/public.pem

Die Schlüsseldatei enthält nun den public-key für unsere DKIM-Konfiguration.

 # cat /var/amavis/dkim/public.pem
 -----BEGIN PUBLIC KEY-----
 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWypzomx/COZmYML/9j/MRNH9C
 hw652qzbHjM4RdzpeWzainKC+kyYP+VuoJWMtUX2KSo+kTuWaH4AUgwWSxKq4IBq
 34MgWsDi3h/mFekOqtnIHTZM16CLtouQDlkUYdatXLcMTlhIO/AH9eNB2F9qbRFR
 B4WWJyuCF6GNQLX9jQIDAQAB
 -----END PUBLIC KEY-----

Diesen Schlüssel stellen wir nun als TXT über die Subdomain main._domainkey.nausch.org zur Verfügung.

 v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWypzomx/COZmYML/9j/MRNH9Chw652qzbHjM4RdzpeWzainKC+kyYP+VuoJWMtUX2KSo+kTuWaH4AUgwWSxKq4IBq34MgWsDi3h/mFekOqtnIHTZM16CLtouQDlkUYdatXLcMTlhIO/AH9eNB2F9qbRFRB4WWJyuCF6GNQLX9jQIDAQAB

Nachdem der TXT zur Verfügung steht, können wir mit hilfe von amavisd diesen Überprüfen.

 # amavisd testkeys
 TESTING#1: main._domainkey.nausch.org        => pass

Wir können natürlich auch direkt den TXT-Record eines Hosts abfragen:

 # host -t TXT main._domainkey.nausch.org
 main._domainkey.nausch.org descriptive text "v=DKIM1\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWypzomx/COZmYML/9j/MRNH9Chw652qzbHjM4RdzpeWzainKC+kyYP+VuoJWMtUX2KSo+kTuWaH4AUgwWSxKq4IBq34MgWsDi3h/mFekOqtnIHTZM16CLtouQDlkUYdatXLcMTlhIO/AH9eNB2F9qbRFRB4WWJyuCF6GNQLX9jQIDAQAB"

Tests

local

Für die abschließenden Test aktivieren wir nun in der AMaViS-Konfigurationsdatei /etc/amavisd.conf die anfänglich gesperrte Option enable_dkim_signing.

 # vim /etc/amavisd.conf
 $enable_dkim_signing = 1;    # load DKIM signing code, keys defined by dkim_key

Zur Aktivierung der DKIM-Signaturfunktion starten wir den AMaViS-Dämon 1x durch.

 # service amavisd restart

Schicken wir nun eine Test-eMail so finden wir im Mailheader die DKIM-Signatur:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nausch.org; h=
        user-agent:content-transfer-encoding:content-type:content-type
        :mime-version:subject:subject:from:from:date:date:message-id
        :received:received:received; s=foo; t=1247694227; bh=KEYMIaIFKBI
        HqS7XrfqnIm115svsJ2CtdB4E8zpd83M=; b=Jow5mHH1v15sWw8RcjQuCXKtYPx
        mp8TGdon5FvR0RaDqkzPxmRBRaQ3oNL9/hdPurbudaWa7f1/LLpDS6qC8+7/cfuk
        jY2ogmZO9xNmY1ZNdqf286X72P2RvsKFngX7CwVIF3Ofd0hZy7YlTRPe+CHQ/JgW
        hEhhBGWr+aoZv1pU=

WEB-online

Eine sehr gute und einfache Möglichkeit die DKIM-Konfiguration zu testen, stellt die DomainKeys, DKIM, SPF, SpamAssassin Email Validator von Brandon Checketts dar. Die angegebene temporäre eMailadresse kopieren wir uns und schicken an diese eine Testnachricht.

eMail Testseite

Über die Schaltfläche [View Results] erhalten wir dann die Prüfungsergebnisse unserer Testnachricht präsentiert.

Original Message:

Return-Path: <michael@nausch.org>
X-Original-To: zSQ3lX8C5X@www.brandonchecketts.com
Delivered-To: spamapp@www.brandonchecketts.com
Received: from mx1.nausch.org (mx1.nausch.org [88.217.187.21])
	by www.brandonchecketts.com (Postfix) with ESMTP id 2AB933091E
	for <zSQ3lX8C5X@www.brandonchecketts.com>; Sat, 18 Jul 2009 06:49:59 -0400 (EDT)
Received: from localhost (localhost.localdomain [127.0.0.1])
	by mx1.nausch.org (Postfix) with ESMTP id 392E71158615
	for <zSQ3lX8C5X@www.brandonchecketts.com>; Sat, 18 Jul 2009 12:49:58 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nausch.org; h=
	x-mailer:mime-version:message-id:date:date:organization
	:content-transfer-encoding:content-type:content-type:reply-to
	:from:from:subject:subject:received:received:received; s=main;
	 t=1247914197; x=1249728597; bh=E1isxuEic/sUmYbroqFvuC/23yyUX53a
	HS/Xwkrnr3I=; b=EEIoq4COIkREvU+Oil+f0Qg0yrwdYX0mZFEtnlqRR06ck6HV
	Oap6CURctdOqHqlFhkG4TXJtgDKNNhaAbDqG8wXlYFxhbQ+s1dY+TIBQDhVy445z
	D4NWWQ1UtbHocHrCHl0j1yPHVCSgWNIlRR7w4By1LsuNhTbY/sqnULNldJk=
X-Virus-Scanned: amavisd-new at nausch.org
Received: from mx1.nausch.org ([127.0.0.1])
	by localhost (amavis.nausch.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id zUoWGqr6KT3G for <zSQ3lX8C5X@www.brandonchecketts.com>;
	Sat, 18 Jul 2009 12:49:57 +0200 (CEST)
Received: from buero.nausch.org (office.nausch.org [192.168.10.20])
	by mx1.nausch.org (Postfix) with ESMTP
	for <zSQ3lX8C5X@www.brandonchecketts.com>; Sat, 18 Jul 2009 12:49:57 +0200 (CEST)
Received: by buero.nausch.org (Postfix, from userid 500)
	id 5F1722DC040E; Sat, 18 Jul 2009 12:49:57 +0200 (CEST)
Subject: Testmessage
From: Michael Nausch <michael@nausch.org>
Reply-To: michael@nausch.org
To: zSQ3lX8C5X@www.brandonchecketts.com
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Organization: nausch.org
Date: Sat, 18 Jul 2009 12:49:57 +0200
Message-Id: <1247914197.4249.2.camel@office.nausch.org>
Mime-Version: 1.0
X-Mailer: Evolution 2.12.3 (2.12.3-8.el5_2.3) 

HI,

ist nur ein Test f=C3=BCr's Dokuwiki

ttyl,
     Django

DKIM Information:

DKIM Signature

Message contains this DKIM Signature:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nausch.org; h=
	x-mailer:mime-version:message-id:date:date:organization
	:content-transfer-encoding:content-type:content-type:reply-to
	:from:from:subject:subject:received:received:received; s=main;
	 t=1247914197; x=1249728597; bh=E1isxuEic/sUmYbroqFvuC/23yyUX53a
	HS/Xwkrnr3I=; b=EEIoq4COIkREvU+Oil+f0Qg0yrwdYX0mZFEtnlqRR06ck6HV
	Oap6CURctdOqHqlFhkG4TXJtgDKNNhaAbDqG8wXlYFxhbQ+s1dY+TIBQDhVy445z
	D4NWWQ1UtbHocHrCHl0j1yPHVCSgWNIlRR7w4By1LsuNhTbY/sqnULNldJk=


Signature Information:
v= Version:         1
a= Algorithm:       rsa-sha256
c= Method:          relaxed/simple
d= Domain:          nausch.org
s= Selector:        main
q= Protocol:        
bh=                 E1isxuEic/sUmYbroqFvuC/23yyUX53a
	HS/Xwkrnr3I=
h= Signed Headers:  x-mailer:mime-version:message-id:date:date:organization
	:content-transfer-encoding:content-type:content-type:reply-to
	:from:from:subject:subject:received:received:received
b= Data:            EEIoq4COIkREvU+Oil+f0Qg0yrwdYX0mZFEtnlqRR06ck6HV
	Oap6CURctdOqHqlFhkG4TXJtgDKNNhaAbDqG8wXlYFxhbQ+s1dY+TIBQDhVy445z
	D4NWWQ1UtbHocHrCHl0j1yPHVCSgWNIlRR7w4By1LsuNhTbY/sqnULNldJk=
Public Key DNS Lookup

Building DNS Query for main._domainkey.nausch.org
Retrieved this publickey from DNS: v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWypzomx/COZmYML/9j/MRNH9Chw652qzbHjM4RdzpeWzainKC+kyYP+VuoJWMtUX2KSo+kTuWaH4AUgwWSxKq4IBq34MgWsDi3h/mFekOqtnIHTZM16CLtouQDlkUYdatXLcMTlhIO/AH9eNB2F9qbRFRB4WWJyuCF6GNQLX9jQIDAQAB
Validating Signature

result = pass
Details: 

SPF Information:

Using this information that I obtained from the headers

Helo Address = mx1.nausch.org
From Address = michael@nausch.org
From IP      = 88.217.187.21
SPF Record Lookup

Looking up TXT SPF record for nausch.org
Found the following namesevers for nausch.org: ns2.m-online.net ns1.m-online.net
Retrieved this SPF Record: v=spf1 ip4:88.217.187.21/32 a mx include:nausch.org ?all (TTL = 7200)
Result: Pass (Mechanism 'ip4:88.217.187.21' matched)

Result code: pass
Local Explanation: nausch.org: 88.217.187.21 is authorized to use 'michael@nausch.org' in 'mfrom' identity (mechanism 'ip4:88.217.187.21' matched)
spf_header = Received-SPF: pass (nausch.org: 88.217.187.21 is authorized to use 'michael@nausch.org' in 'mfrom' identity (mechanism 'ip4:88.217.187.21' matched)) receiver=xpgrinders.com; identity=mfrom; envelope-from="michael@nausch.org"; helo=mx1.nausch.org; client-ip=88.217.187.21
1)
Mail Transfer Agent