DKIM - Domain Key Identified Mail
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.
Ü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