Dies ist eine alte Version des Dokuments!
aktuell in Bearbeitung!
DKIM - Domain Key Identified Mail unter CentOS 7.x
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 über- und in der aktuellen Version RFC 6376 weitergeführt.
DKIM basiert auf asymmetrischer Verschlüsselung, bei der eMails mit zwei Signaturen versehen werden, die erste über ein paar Header-Zeilen der Nachricht und die zweite über den Mail-Body, also dem Inhalt einer eMail. Die zugehörigen Prüfsummen werden in standardisierten DKIM-Signature-Headern in der eMail eingetragen. Weitere Informationen hierzu findet man im RFC 4871 oder in der Dokumentation von DKIM.org.
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. Ist diese Signatur gültig, ist der Absendeserver der eMail zweifelsfrei festgestellt. Bei einem negativen Ergebnis hat nun der empfangende MTA1) die Möglichkeit, die Annahme der eMail zu verweigern bzw. die empfangene Nachricht auszusortieren. Wie bereits erwähnt ist dies 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. Der Domaininhaber (Sender) kann mit Hilfe von ADSP2) festlegen, was der Empfänger beim Eingang einer eMail tun soll, sofern die DKIM-Signatur gebrochen wurde. Diese Policy wird, wie der öffentliche DKIM-Schlüssel auch, über den DNS publiziert. Weitere Informationen hierzu findet man im RFC 4871
Installation von AMaVIS
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 Grundinstallation von AMaViS unter CentOS 7.x beschrieben. In unserer Postofficeumgebung nutzen wir den AMaVis-Daemon in der Version amavisd-new-2.9.x. Neben diesem Perl-Programm benötigen wir noch die beiden Pakete perl-Mail-DKIM und perl-Crypt-OpenSSL-RSA welche bei der Installation von amavisd-new automatisch mitinstalliert wurden.
Bei der nachfolgenden Konfigurationsbeschreibung gehen wir davon aus, dass bereits ein funktionierender Postfix-Mailserver wie auch der Viren- und SPAM-Schutz mit Hilfe von AMaViS zur Verfügung steht.
Wertvolle Hinweise zur Konfiguration und Nutzung von DKIM entnimmt man am besten der original AMaViS-Dokumentation Setting up DKIM mail signing and verification.
Überprüfung von DKIM-Signaturen
Damit unsere AMaViS-installation die Überprüfung von DKIM-Signaturen im Mailheader vornimmt bedarf es keiner großen Konfiguration. Wie in der Originaldoku von Marc Martinec zu entnehmen ist, müssen wir lediglich die Variable $enable_dkim_verification setzen, in dem wir ihr den Wert 1 zuweisen. Diese Variable findet sich in der Sektion DKIM - Domain Key Identified Mail wieder.
# vim /etc/amavisd.conf
################################################################################ ## DKIM - Domain Key Identified Mail # # DKIM-Signaturen verifizieren $enable_dkim_verification = 1; ...
Signieren von eMails
Generierung der Schlüssel
Wie Eingangs bereits erwähnt, wird bei den DKIM-Signaturen auf asymmetrischer Verschlüsselung zurück gegriffen. Wir benötigen also ein Schlüsselpaar aus public- und private-key. Bevor wir diese erzeugen, legen wir uns 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/spool/amavisd/dkim
# chown amavis:amavis /var/spool/amavisd/dkim/
Im nächsten Schritt erstellen wir uns nun unser Schlüsselpaar. Dazu benutzen wir die Option genrsa des Befehls amavisd # amavisd genrsa file_name [nbits]
.
Beim Dateinamen vermerken wir dabei am einfachsten das Erstellungsdatum YYMMDD (Jahr+Monat+Tag, z.B. 141126 für 26. November 2014). So haben wir es später einfacher, die einzelnen Schlüssel auseinander zu halten, wenn wir mehrere benötigen, oder einzelne Schlüssel für ungültig erklären (revoke'n). Diesen Datums-Stempel verwenden wir dann auch als selector bei der nachfolgenden AMaViS-Konfiguration.
# amavisd genrsa /var/spool/amavisd/dkim/dkim-key-141126.pem 4096
Private RSA key successfully written to file "/var/spool/amavisd/dkim/dkim-key-141126.pem" (4096 bits, PEM format)
Alternativ können wir auch openssl zum Erstellen des Schlüssel verwenden.
# openssl genrsa -out /var/spool/amavisd/dkim/dkim-key-141126.pem 4096
Generating RSA private key, 4096 bit long modulus ........................++ ............++ e is 65537 (0x10001)
Haben wir unseren Schlüssel mit Hilfe von openssl erzeugt, passen wir die Dateiberechtigungen und Rechte unseres erstellen Schlüssels an.
# chmod 600 /var/spool/amavisd/dkim/* # chown amavis:amavis /var/spool/amavisd/dkim/*
In unserem zuvor Schlüssel-Verzeichnis befindet sich nun der erstellte private Schlüssel.
# ll /var/spool/amavisd/dkim
<code>-rw-------. 1 amavis amavis 3247 Nov 26 12:50 dkim-key-141126.pem</code>
In dieser Datei befindet sich nun der private key.
# cat /var/spool/amavisd/dkim/dkim-key-141126.pem
-----BEGIN RSA PRIVATE KEY----- MIIJKQIBAAKCAgEAuJ3/CruOs3fCU0ujOStcNN85TJh+5HvMa9m99C5XuRBlxOr+ fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/i2ObpRkzKRUXmAa0qVezUZwQIbKei uKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9WamFUUaHeN3+pVGtMyjYekRaAoRlV+ a1gD111kXMPhiaFTMIncoRBS/gYN8FjfekH+ezqbLHLB8DLJQBZEGUILvJjAHX07 22XyqYtkn1qfv63nPRGw/qqAW1072Gchq4ZS4ZPQ89SrK4KcHt/XptSlztXMWtmR FQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6/1GujQiMD6po81NpYbrjnfd+QF4s Ubus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnImJhVDnzZODQy0nSafedlr5g4VR36 vgm0YPWjSyRNnC/APHyw0DtHIrzTqfKuDeGv80uMPbEdujrw9gLbK3H8ow42iTic mgPgT3J5j70ZOo4o4FMtpZ/AEQw+VnWpSfw7bkMjufLc29XHbtp22wfgq2Lmarr3 +psaHokFaQrImkMbzdSL9CdabkLptanAilLScvq8UaKVC+G1+vHDgaweq3BhXD5+ YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFbNJSH5NJuS7GuzplNg+f20ysCAwEA AQKCAgAY4qM4TSPlKSV2mOF9mUyqi9RrcLraDZ32g7lJKt4EQiOVsZ9wbeChX7hF l6Qp65Eoxgb//s5E3iZoGWcbhMrNNgMHyN4TDGL+otrsDiprYG3KR6Z1gNHzaVx5 06ld3n7Q/mN8JPqxZ98RRjvxXt+h3QYNNuBW6H1kSkesMDaCdB45rNiHm6uY4ivf HUBPjwFpr4uf4lVtjF9goHovPqoQ7ktwaF+gAxiBnP688NwoJebvkqv43Psiw3li yZJzAfwDjVjwWwdGSYEBoJU3S7nsUkJ+O5J/IPHub3ngMRXQlZ0gOeeGkJr+L16f FQBM9VicLU2mCtwOu+zy4Rck07/u4/Xkqnq5cNLbc0a1AYU6UDikB3yrG1QeupGg /0M11D/4qDJ8hVK8Sl72SEWMnbkLh5YZEOoKE83C4uQ79yMnbSADXHJfUHmnO6O8 aDlCaMoRKw+Dj4n90/d3R-m4i153rV3R-gURu+p8UXtpz19zXK9nxsBsI1bl/63M 4y0VMba8UjgtSz2rzrjO2BkN4g/p3k1wmgyxAorJeyZRcNpG+HdBf4jMo5j8f+Jd BlZgjFx0d69v3hToHfWd6Un4yc1+KDsyB1uNwuA1zs5lVX5QGba5LgYhNPUWmhQ/ 3Vj2hG7Pp4FpK1UcnwoyX8YqK0/NJICqkwu+kDUDLHapgnVawQKCAQEA2YR/pVc4 CXEyxwwCfV5Q6qtHdgHGXwKfMikQl86YmDy2DLGTSojQW8BZmlCAxDqmaWit0DN8 TEGoM+hkVenz5ebG+SVFGGdQEh+urrRCHkrBIAGiNMHhh0ecKud2z7Pc+nxSDdKS 8QPko+wnAzG/WKNkl73Wvx06UqnbBqMSiG6SKjdtH2Kh2wXb5KT5PQYY112W4JIi 53PVQMbgwFdRaJyy1WmCro0OaIs/6bJPWIKuKdSw35fC6/lgQsC7elD5p0XrdcpN MuYJJOg0L8GYvIqO5+AIR5tCkutbd5yAEmLoHN6/IwDrt69YV1yLg27N09a/RJbI uTkQmtpaJBgzcQKCAQEA2UdrNeaoz9jaRxm6HJgGtIbO8RJM/9bGYMxgSP+KAGIY nQIEF/rxySdzIrkBuewIiWgKdjFiP+1DCi7M6IDu3YNxYik6f1Pp2HlZ7MUmT3XF 3Tm2RjnR33eCknoicohzEj5tSKFzshCqDDlv1sm9e32+eO5xjgx59EpxvjqQnP/4 PR3gxSIOGfYwAaHJnV3n/YAKKhM52f09+IMouk0javOYDg96Se6acnZszcLOv8vQ FiwtRTAWiV6wbY1H7SFwWb2fMINsmh9E4eOz17cmwVHDSjxOnCvwUpFsAAqqWRBa jqFxumSApErGEW97E1ucAdeZemqtki0yY3mnu6wqWwKCAQEAwjVNCsDu5W9OWO3e IzVcpcm7ih9XkGj03oJPsFrjX7mFCZxa2AeDkQgSeHc8IPgEsMSnu+bcKfHNTltF infSLgh4yuZ95KYJlcT34EBNcGJqQDt1KgmZZYGIa74yFIyQ1oy9bl3+mHZTZBBr XKzEHU31eI4k+IoOEtRZHHnpCCtBEbRfF9CmlrmKdYDej5+r+k4zcdrIk0KWurlW 3iSYKQEPowALj/GdVbZOoEd2FJ7JBcxDB7+mZ65GRhNy0GkQHkuNSaQQfUtqCqvQ PHtr9Zr4sQsUGWsEa8z747W1m7T3bR9sJMKjs2M5Svb0EauS1ns8Vu8R1F6g9sHS DbwV4QKCAQEAiMguFOOdOCNy3jmy8Rc/eVw4YIi90n05q2xd3PaJwM4AYq8HNrVy ish78cr37DxL73yAwYE7MbVCc+Gce23XcbmyojIEMm34E5/pXWWLRZCFvEv9lF4H 4h8RIvcidB3qglse0N6IQ/9gUrCHywypsGOV5DRvZhYym/hVfITPzxZRBuCNRGy4 5d0WwaBBFQEt72cwfuZVkAadgZnIBOhUuJqbCZbyzCIaNp6Yxjux/gnneF3dLeYk +duTQ5QiSIS5frUhxt+leazfpzi6Wb1h92dqgoxOjIAYrVIA5FHShXkHGS1HNCja 1xJ/eDBvEXOlVX+NjgQkOpabVwYZ8spiawKCAQAI30WzWHPLcFHOhaIIRr7VlUv5 IR96T95H+c0a5JzNFhSOwxnqCWOtTmUnlaJcFwbREYl2mrImjht44Tz3bNjQlGqr 04WUf1VExh1WRfRGlT8LWuSLgVDHrI6M5yl5sefzILqogHaiEAvKbaTlIowD8hbR MJGE0QdJKZNU/+dPO5w/0Rnq2kY54OJhSWZE0Z6zWqMQa3komnqQAXnlvHaUshjy 0M8oJ2zG8LEvqJllsjIU3orVPPfkuenWkn3cGQhx1xZIEEaLo1YC8eyAGW2OkKMP OMrxmovD66O4MuPCnnPfcftE1e80Gi/UgxiVrdGOqx8BZ/AmChdWFZx5ZrVF -----END RSA PRIVATE KEY-----
Konfiguration (single domain)
Den ersten Teil unserer Konfiguration haben wir schon erledigt. Nun weisen wir unseren AMaViS-Daemon an unsere ausgehenden Nachrichten mit einer DKIM-Signatur zu versehen. Hierzu tragen wir in der Section DKIM - Domain Key Identified Mail folgende Zeilen ein.
# vim /etc/amavisd/amavisd.conf
################################################################################ ## DKIM - Domain Key Identified Mail # # DKIM-Signaturen verifizieren $enable_dkim_verification = 1; # DKIM-Signaturen erstellen $enable_dkim_signing = 0; # Private Keys und Selectors # # signing domain selector private key options # ------------- -------- ---------------------- ---------- dkim_key('nausch.org', '141126', '/var/spool/amavisd/dkim/dkim-key-141126.pem', h=>'sha256'); # DKIM Signing Policies @dkim_signature_options_bysender_maps = ( { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );
Die Variable $enable_dkim_signing setzen wir erst noch auf den Wert 0, da wir unseren public-key erst noch auf dem für uns zuständigen Nameserver einen entsprechenden DNS-Eintrag hinterlegen müssen, sprich wie müssen den public-key veröffentlichen. Anderenfalls würde AMaViS- bereits jetzt schon Nachrichten Signieren, die dann aber vom Empfänger nicht geprüft werden können. Schlimmstenfalls würde das zu bounces oder rejects führen!
Die Angaben der Schlüsselparameter im obigen Beispiel haben folgende Bedeutungen:
- nausch.org = Maildomäne, bei die der Schlüssel verwendet werden soll
- 141126 = Selector: Der Selector wird zusammen mit der Kennung _domainkey und dem Maildomänen-Namen vom empfangenen Mailserver benutzt, um über einen TXT-Abfrage des DNS-Records den verwendeten public-key zu erfragen. Bei obigen Beispiel wäre das demnach 141126._domainkey.nausch.org
- /var/amavis/dkim/dkim-key-141126.pem = Name und Pfad unseres privatekey .
Über das Array @dkim_signature_options_bysender_maps können ferner Standardwerte für Signatur-Tags überschrieben werden. Dies kann per Sender(Domäne) erfolgen, oder wie im obigen Beispielals „catch all“ für alle Absender. Über den Parameter ttl kann defniert werden, wie lange eine Signatur nach Erstellung als gültig erachtet werden soll - in unserem Beispiel also 3 Wochen. Der Parameter c definiert, wie Amavis die zur Signierung herangezogenen Daten ggf. umeschrieben werden sollen. Detailierte erklärungen hierzu entnimmt man dem Kapitel 3.5 The DKIM-Signature Header Field bzw. dem Kapitel 3.4. Canonicalization.
Konfiguration (multiple domain)
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.
# vim /etc/amavisd/amavisd.conf
################################################################################ ## DKIM - Domain Key Identified Mail # # DKIM-Signaturen verifizieren $enable_dkim_verification = 1; # DKIM-Signaturen erstellen $enable_dkim_signing = 1; # Private Keys und Selectors # # signing domain selector private key options # ------------- -------- ---------------------- ---------- dkim_key('nausch.org', '141126', '/var/spool/amavisd/dkim/dkim-key-141126.pem'); dkim_key('omni128.de', '141126', '/var/spool/amavisd/dkim/dkim-key-141126.pem', h=>'sha256'); dkim_key('ebersberger-liedersammlung.de', '141126', '/var/spool/amavis/dkim/dkim-key-141126.pem', h=>'sha256');
Betreiben wir einen Mailserver für sehr viele virtuellen Domänen und hat auch noch mehrere Mail-Administratoren, die sich um die Neuanlage von Domänen und deren Nutzerkonten sowie deren Pflege kümmern, so kann selbst das händische Pflegen der Domänen in den verschiedenen Konfigurationsdateien zum nervigen und fehleranfälligem Zeitvertreib werden. Abhilfe schafft hier eine zentrale Datei, in der alle lokalen Maildomänen enthalten sind und hier machen wir uns es so einfach wie nur möglich.
Bei der Grundkonfiguration von AMaViS haben wir bereits in der Section DESTINATIONS alle localen Domains definiert.
# vim /etc/amavisd/amavisd.conf
################################################################################ ## DESTINATIONS # # Definition der Verkehrsrichtungen: # Das ist nach intern. Alle anderen Destinationen sind im Umkehrschluss extern. @local_domains_maps = ( [".$mydomain"], read_hash("/etc/postfix/all_local_domains_map"), ); ...
Hier haben wir ja bereits eine Aufstellung aller bekannten lokalen (virtuellen) Domains. Mit Hilfe dieser Tabelle generieren wir uns nun die Liste mit den DKIM-Schlüsseln. Anstatt jede Domain einzeln in der amavisd.conf aufzuführen, binden wir einfach die liste aller Domains /etc/postfix/all_local_domains_map in die /etc/amavisd/amavis.conf ein.
# vim /etc/amavisd/amavisd.conf
################################################################################ ## DKIM - Domain Key Identified Mail # # DKIM-Signaturen verifizieren $enable_dkim_verification = 1; # DKIM-Signaturen erstellen $enable_dkim_signing = 0; # Private Keys und Selectors # # signing domain selector private key options # ------------- -------- ---------------------- ---------- # dkim_key('nausch.org', '201411', '/var/spool/amavis/dkim/201411_nausch.org'); # Django : 2014-02-19 # DKIM-Keys für automatisch generierte Domainliste definieren open(filehandle,'/etc/postfix/all_local_domains_map') or die "Can't open domain-list-file: $!"; while (<filehandle>) { chomp; s/\s*#.*$//; next if $_ eq ''; dkim_key($_, '140224', '/var/spool/amavisd/dkim/dkim-key-141126.pem', h=>'sha256'); } close(filehandle) or die "Can't close domain-list-file: $!"; # DKIM Signing Policies @dkim_signature_options_bysender_maps = ( { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } ); ...
DKIM & DNS
public key
Wie Eingangs bereits erwähnt, kann der Empfänger eine DKIM-signierte eMail mit Hilfe des public keys auf Echtheit hin überprüfen. Damit der Empfänger den public key abfragen kann, müssen wir diesen im DNS hinterlegen. Hierzu lassen wir uns den public-key unseres DKIM-keys am besten mit Hilfe des Befehls amavisd ausgeben.
# amavisd -c /etc/amavisd/amavisd.conf showkey nausch.org
; key#2, domain nausch.org, /var/spool/amavisd/dkim/dkim-key-141126.pem 140224._domainkey.nausch.org. 3600 TXT ( "v=DKIM1; h=sha256; p=" "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAojGXwA9zJFJ4wpa2PB51" "amh5s2amqyBpUJR07or9SeqZlGV0193VGGuVM72w7ry8AzTKGZKRf2oPtjgx2zAF" "FQDoewOQVDdkQG9g+VGLW/NWGc/fKhOe1i0Q+O4GMoPcJ6rNerw5mVpnPpejc8LZ" "0SE4EN6hcJ0lkgNK8wqzkWvrA5xwouuj1WfXTHm6Ov4I7HRsmHvPyOaK+jpMBBYj" "o9qRtZiU48x+DOp3ti3r/dxaS8kKCDI+ohXoruUyMUU7U5/RISCGxahO7c5fm2pC" "OdwxnmEMdb4QLgtPV1S3atyq4JFNt2Qc6C06fDzN3ylyH+orrCjBBSa75ZdVxOun" "my5Iv7GbFUqX8QAGH1l0KyZWBdlx3YRME2ZpThOjwhG9cl66cc8w7dxlIFM1XZb/" "Z8SlFHFelhaqSovYPAd30pbooU4gL+sGOqqvdc18yXB7jIjUmiBNsO7HTXiI/fly" "dl+wWylh202hlTdl1VG3Gskup8I2gpuRK7SAsbNRzr2KN05T0B/zgr0bNjiBCDNm" "CiPf+z9/22MlCVczjL0G8o11bB5E2/IBMEpBAfw48cmSzmEqGXZhluhRcfkr7oiy" "DQMObGLgidf2+pY7YoxUHigq5ptF8/Ny8hXv5FJb5DuoQTyB8atUrhYDrMcZldDD" "4sUZajSC04shzSmob+gimAMCAwEAAQ==")
Möchte man sich alle Schlüssel anzeigen lassen, nutzt man einfach die Option showkeys beim Aufruf von amavisd.
# amavisd -c /etc/amavisd/amavisd.conf showkeys
; key#1, domain omni128.de, /var/spool/amavisd/dkim/dkim-key-141126.pem 140224._domainkey.omni128.de. 3600 TXT ( "v=DKIM1; h=sha256; p=" "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAojGXwA9zJFJ4wpa2PB51" "amh5s2amqyBpUJR07or9SeqZlGV0193VGGuVM72w7ry8AzTKGZKRf2oPtjgx2zAF" "FQDoewOQVDdkQG9g+VGLW/NWGc/fKhOe1i0Q+O4GMoPcJ6rNerw5mVpnPpejc8LZ" "0SE4EN6hcJ0lkgNK8wqzkWvrA5xwouuj1WfXTHm6Ov4I7HRsmHvPyOaK+jpMBBYj" "o9qRtZiU48x+DOp3ti3r/dxaS8kKCDI+ohXoruUyMUU7U5/RISCGxahO7c5fm2pC" "OdwxnmEMdb4QLgtPV1S3atyq4JFNt2Qc6C06fDzN3ylyH+orrCjBBSa75ZdVxOun" "my5Iv7GbFUqX8QAGH1l0KyZWBdlx3YRME2ZpThOjwhG9cl66cc8w7dxlIFM1XZb/" "Z8SlFHFelhaqSovYPAd30pbooU4gL+sGOqqvdc18yXB7jIjUmiBNsO7HTXiI/fly" "dl+wWylh202hlTdl1VG3Gskup8I2gpuRK7SAsbNRzr2KN05T0B/zgr0bNjiBCDNm" "CiPf+z9/22MlCVczjL0G8o11bB5E2/IBMEpBAfw48cmSzmEqGXZhluhRcfkr7oiy" "DQMObGLgidf2+pY7YoxUHigq5ptF8/Ny8hXv5FJb5DuoQTyB8atUrhYDrMcZldDD" "4sUZajSC04shzSmob+gimAMCAwEAAQ==") ... ... ; key#16, domain c3n705.guru, /var/spool/amavisd/dkim/dkim-key-141126.pem 140224._domainkey.c3n705.guru. 3600 TXT ( "v=DKIM1; h=sha256; p=" "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAojGXwA9zJFJ4wpa2PB51" "amh5s2amqyBpUJR07or9SeqZlGV0193VGGuVM72w7ry8AzTKGZKRf2oPtjgx2zAF" "FQDoewOQVDdkQG9g+VGLW/NWGc/fKhOe1i0Q+O4GMoPcJ6rNerw5mVpnPpejc8LZ" "0SE4EN6hcJ0lkgNK8wqzkWvrA5xwouuj1WfXTHm6Ov4I7HRsmHvPyOaK+jpMBBYj" "o9qRtZiU48x+DOp3ti3r/dxaS8kKCDI+ohXoruUyMUU7U5/RISCGxahO7c5fm2pC" "OdwxnmEMdb4QLgtPV1S3atyq4JFNt2Qc6C06fDzN3ylyH+orrCjBBSa75ZdVxOun" "my5Iv7GbFUqX8QAGH1l0KyZWBdlx3YRME2ZpThOjwhG9cl66cc8w7dxlIFM1XZb/" "Z8SlFHFelhaqSovYPAd30pbooU4gL+sGOqqvdc18yXB7jIjUmiBNsO7HTXiI/fly" "dl+wWylh202hlTdl1VG3Gskup8I2gpuRK7SAsbNRzr2KN05T0B/zgr0bNjiBCDNm" "CiPf+z9/22MlCVczjL0G8o11bB5E2/IBMEpBAfw48cmSzmEqGXZhluhRcfkr7oiy" "DQMObGLgidf2+pY7YoxUHigq5ptF8/Ny8hXv5FJb5DuoQTyB8atUrhYDrMcZldDD" "4sUZajSC04shzSmob+gimAMCAwEAAQ==")
Natürlich kann man auch openssl dazu verwenden, sich den public-key ausgeben zu lassen.
# openssl rsa -in /var/spool/amavisd/dkim/dkim-key-141126.pem -out /var/spool/amavisd/dkim/dkim-key_141126_public.pem -pubout -outform PEM
writing RSA key
Die Dateiberechtigung passen wir entsprechend an.
# chmod 600 /var/spool/amavisd/dkim/dkim-key_141126_public.pem
Die Schlüsseldatei enthält nun den public-key für unsere DKIM-Konfiguration.
# less /var/spool/amavisd/dkim/dkim-key_141126_public.pem
-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAojGXwA9zJFJ4wpa2PB51 amh5s2amqyBpUJR07or9SeqZlGV0193VGGuVM72w7ry8AzTKGZKRf2oPtjgx2zAF FQDoewOQVDdkQG9g+VGLW/NWGc/fKhOe1i0Q+O4GMoPcJ6rNerw5mVpnPpejc8LZ 0SE4EN6hcJ0lkgNK8wqzkWvrA5xwouuj1WfXTHm6Ov4I7HRsmHvPyOaK+jpMBBYj o9qRtZiU48x+DOp3ti3r/dxaS8kKCDI+ohXoruUyMUU7U5/RISCGxahO7c5fm2pC OdwxnmEMdb4QLgtPV1S3atyq4JFNt2Qc6C06fDzN3ylyH+orrCjBBSa75ZdVxOun my5Iv7GbFUqX8QAGH1l0KyZWBdlx3YRME2ZpThOjwhG9cl66cc8w7dxlIFM1XZb/ Z8SlFHFelhaqSovYPAd30pbooU4gL+sGOqqvdc18yXB7jIjUmiBNsO7HTXiI/fly dl+wWylh202hlTdl1VG3Gskup8I2gpuRK7SAsbNRzr2KN05T0B/zgr0bNjiBCDNm CiPf+z9/22MlCVczjL0G8o11bB5E2/IBMEpBAfw48cmSzmEqGXZhluhRcfkr7oiy DQMObGLgidf2+pY7YoxUHigq5ptF8/Ny8hXv5FJb5DuoQTyB8atUrhYDrMcZldDD 4sUZajSC04shzSmob+gimAMCAwEAAQ== -----END PUBLIC KEY-----
Den public-key lassen wir uns am besten mit Hilfe des Befehls amavisd ausgeben, denn so können wir einfach die Zeichenfolge direkt in die Zonendatei des Nameserver BIND ein. Somit können auch einfach größere Schlüssel, wie in unserem Beispiel 4096 bits hinterlegt werden, da der Schlüssel bereits in mehrere TXT-Häppchen aufgeteilt wurde!
Den, mit Hilfe von amavisd ausgegebenen, Public-key hinterlegen wir nun im zuständigen DNS-Server. Ist dies geschehen können wir den public key wie folgt abrufen.
# host -t TXT 140224._domainkey.sec-mail.guru
;; Truncated, retrying in TCP mode. 140224._domainkey.sec-mail.guru descriptive text "v=DKIM1\; p=" "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/CruOs3fCU0ujOStc" "NN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/i" "2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9Wa" "mFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/gYN8FjfekH+" "ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/qqAW1072Gchq4ZS" "4ZPQ89SrK4KcHt/XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6" "/1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnI" "mJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/APHyw0DtHIrzTqfKuDeGv" "80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/AEQw+VnWpSfw7" "bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLS" "cvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFb" "NJSH5NJuS7GuzplNg+f20ysCAwEAAQ=="
ADSP
Über ADSP3) kann ein (Mail)-Domaininhaber definieren, was ein Mailserver mit einer zu Annahme anstehenden eMail passieren soll, sofern dessen DKIM4)-Signatur nicht gültig ist. Für ADSP wird dazu ein eigener Qualifier _adsp benutzt. Am Beispiel der Domain sec-mail.guru ergibt sich der Name _adsp._domainkey.sec-mail.guru.
Der (TXT)-Datensatz hat dabei folgende Struktur „dkim=<WERT>“. Über den <WERT> kann der Domaininhaber folgendes festlegen:
- unknown Der Domaininhaber signiert einige oder alle Nachrichten.
- all Alle Nachrichten der Mail-Domäne werden mit einer DKIM-Signatur versehen.
- discardable Alle Nachrichten der Mail-Domäne werden mit einer DKIM-Signatur versehen. Darüber hinaus empfiehlt der Domain-Inhaber alle Nachrichten deren DKIM-Signatur gebrochen wurde, bei der die Nachricht also manipuliert wurde, zu verwerfen (REJECT).
Wurde nichts definiert oder ein anderer Wert als die oben angegeben wurde, wird der Default-Wert unknown gesetzt. Somit ergibt sich in unserem Anwendungsbeispiel, bei dem der Domaininhaber von sec-mail.guru selbst alle Nachrichten signiert und dem Empfänger bittet, Nachrichten mit schadhafter DKIM-Signatur zu rejecten, folgender TXT-Record:
_adsp._domainkey.sec-mail.guru. IN TXT "dkim=discardable;"
Diesen Record veröffentlichen wir nun über unseren DNS. Somit kann ein Empfänger niucht nur den DKIM-Schlüssel zum verifizieren der DKIM-Signatur abfragen, sondern auch den ADSP-TXT-Record und weiß damit, was er ggf machen sollte, sofern die DKIM-Signatur gebrochen wurde.
Tests