Inhaltsverzeichnis
Postfix AMaViS DKIM einsetzen
DKIM - DomainKeys ist ein Identifikationsprotokoll zur Sicherstellung der Authentizität von E-Mail-Absendern, das von Yahoo entwickelt wurde und seit Ende 2004 in Erprobung ist. Es wurde konzipiert, um bei der Eindämmung von unerwünschter E-Mail wie Spam oder Phishing zu helfen.
Genauere und Detailliertere Informationen können unter folgendem Link nachgelesen werden - DomainKeys.
Voraussetzungen
Als Voraussetzung für den Einsatz von DKIM sind folgende Komponenten erforderlich:
- Ein lauffähiger Version von AMaViS ab Version 2.6.4 - siehe auch –> Postfix Amavis installieren
HINWEIS - Wenn die oben genannten Komponenten installiert sind, ist keine zusätzliche Installation von Software mehr nötig!
Konfiguration
DANKSAGUNG - Dieser DokuWiki ist mit außerordentlicher Unterstützung von Michael Nausch entstanden - siehe DokuWiki @ nausch.org!
Schlüsselverzeichnis erstellen
Wie auch in anderen Bereichen, wenn es um Verschlüsselung und Signierung geht z.B. (ssh, gnupg, s_mime) ist es auch logischerweise beim Einsatz von DKIM erforderlich, ein Schlüsselpaar, bestehend aus einem
- öffentlichen Schlüssel
- privaten Schlüssel
zu erstellen.
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root
zu werden geben Sie bitte folgenden Befehl ein:
$ su - Password:
Vor der eigentlichen Erstellung des Schlüsselpaares, ist es jedoch zwingend erforderlich ein Verzeichnis und ein Unterverzeichnis zu erstellen, in dem AMaViS später den privaten Schlüssel finden kann. Dies könnte z.B. im Verzeichnis
/etc/pki/
mit nachfolgenden Befehlen durchgeführt werden:
Erstellung des Verzeichnises /etc/pki/amavis
# mkdir /etc/pki/amavis
Erstellung des Unterverzeichnises /etc/pki/amavis/dkim
# mkdir /etc/pki/amavis/dkim
Schlüssel erstellen
Mit nachfolgendem Befehl wird das Schlüsselpaar jetzt
- im Verzeichnis
/etc/pki/amavis/dkim
- als
key.pem
-Datei im PEM-Dateiformat
erstellt:
# amavisd genrsa /etc/pki/amavis/dkim/key.pem Private RSA key successfully written to file "/etc/pki/amavis/dkim/key.pem" (1024 bits, PEM format)
WICHTIG - Damit AMaViS auf die private Schlüssel-Datei auch Zugriff hat, ist es erforderlich die Besitzrechte wie folgt mit nachfolgendem Befehl anzupassen:
# chown amavis.amavis /etc/pki/amavis/dkim/key.pem
Die Verzeichnisstruktur und deren Inhalt sollte danach in etwa wie folgt aussehen und kann mit nachfolgenden Befehlen angezeigt werden (nur relevanter Ausschnitt):
# ll /etc/pki/ total 44 drwxr-xr-x 3 root root 4096 Jul 17 10:29 amavis ... # ll /etc/pki/amavis/ total 4 drwxr-xr-x 2 root root 4096 Jul 17 10:41 dkim # ll /etc/pki/amavis/* total 4 -rw------- 1 amavis amavis 887 Jul 17 10:41 key.pem
Der Inhalt der privaten Schlüssel-Datei kann mit nachfolgendem Befehl angezeigt werden und sollte in etwa wie folgt aussehen:
# cat /etc/pki/amavis/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/+N1ckI$twIRkl1chNeFAULeSAU+/Gyi8P8TTpIIeCFhao /R0euJY/AkEA42FJITBi3W8D4i1ifVZUnCFdBUHiZx2wpWNmkFHbMBGSddmLq1SD o0FkSK2yUUSQr+y2C6ksJ2ULbGyI+imndrRwmd63qPdmvd+84GD5dfsddDfgg7dx 5Kcimm3a1RXTenwsD1lvVM46tmfa83vIKzgM2oI8SnZijjXqOEbMfudf1QJBAIG8 E261XeN8IRoezRA4fsQqoRmL0vME1LI4+d8kZUyS6h8FxhQ2f3lZqS9ys8h8yqzN guSfl3OAyWCTvWXwyFMCQFb0t7soo/mHoS5EP+Q7/TRyjdzUzRrVZO5sO0HUMyhL SPfoF9go3M+8jZ2ac/kbs6iUlQT/zS4/T4DVScoPgCs= -----END RSA PRIVATE KEY-----
WICHTIG - Dieser Schlüssel ist sehr wichtig, da damit der e-Mail-Verkehr signiert wird und muss auf jeden Fall geheim gehalten werden !!!
Einbindung in AMaViS
Der erstellte private Schlüssel muss nun noch mit nachfolgenden Anpassungen der Konfigurationsdatei /etc/amavisd.conf
in AMaViS eingebunden werden (nur relevanter Ausschnitt):
... # Tachtler # default: $enable_dkim_verification = 1; # enable DKIM signatures verification $enable_dkim_verification = 0; # enable DKIM signatures verification # Tachtler # default: $enable_dkim_signing = 1; # load DKIM signing code, keys defined by dkim_key $enable_dkim_signing = 0; # load DKIM signing code, keys defined by dkim_key # Tachtler dkim_key('tachtler.net', 'main', '/etc/pki/amavis/dkim/key.pem'); @dkim_signature_options_bysender_maps = ( { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } ); ...
Erklärung:
Variablenname | Wert | Erklärung |
---|---|---|
$enable_dkim_signing | 1 | Aktivieren der DKIM-Signierung |
dkim_key | 'tachtler.net' | Domainname zum DKIM-Schlüssel |
'main' | Selector der mit der Kennung _domainkey und dem Domainnamen benutzt wird, um über eine TXT-Record Abfrage an den DNS-Server den verwendeten öffentlichen Schlüssel zu erfragen. Hier: main._domainkey.tachtler.net | |
'/etc/pki/amavis/dkim/key.pem' | Privater Schlüssel, mit Pfadangabe und Dateinamen | |
@dkim_signature_options_bysender_maps | '.' | Sender abhängige Angabe, auf die die nachfolgenden Parameter angewandt werden sollen. Hier: alle |
ttl ⇒ 21*24*3600 | TTL (Time To Live) | |
c ⇒ 'relaxed/simple' | Message canonicalization (plain-text; OPTIONAL, Standard ist „simple/simple“). |
Um weitere Informationen zu den oben genannten Parameter zu erhalten, können nachfolgende externe Links genutzt werden:
Jetzt ist der richtige Zeitpunkt gekommen, um AMaViS zum ersten mal neu zu starten, was mit folgendem Befehl erfolgen kann:
# service amavisd restart Shutting down Mail Virus Scanner (amavisd): [ OK ] Starting Mail Virus Scanner (amavisd): [ OK ]
HINWEIS - Zum jetzigen Zeitpunkt, wäre es möglich die „Verifizierung“ von e-Mails bereits zu aktivieren, OHNE selbst bereits e-Mails zu signieren!
Die notwendigen Einstellungen dafür können mit folgender Anpassung der Konfigurationsdatei /etc/amavisd.conf
durchgeführt werden (nur relevanter Ausschnitt):
... $enable_dkim_verification = 1; # enable DKIM signatures verification ...
DNS-Eintrag
WICHTIG - Um selbst e-Mails signieren zu können, ist es erforderlich, dass der öffentliche Schlüssel via DNS abfragbar ist, was durchaus die Mithilfe des Providers erfordern kann!
Dazu ist es erforderlich erst einmal den öffentlichen Schlüssel mit der Hilfe von AMaViS aus der Schlüsseldatei /etc/pki/amavis/dkim/key.pem
zu erhalten, was mit nachfolgendem Befehl erreicht werden kann:
# amavisd showkeys ; key#1, domain tachtler.net, /etc/pki/amavis/dkim/key.pem main._domainkey.tachtler.net. 3600 TXT ( "v=DKIM1; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJR" "RxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+ln" "Sp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkY" "iJw8V1oSoafME1WklQIDAQAB")
Welcher aber in nachfolgender Form in den DNS-Record eingetragen werden muss (ohne „-Zeichen und <leer>-Zeichen):
v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJRRxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+lnSp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkYiJw8V1oSoafME1WklQIDAQAB
Nachfolgende DNS-Einträge müssen zum DNS hinzugefügt werden, um den öffentlichen Schlüssel via DNS abfragbar zu machen (nur relevanter Ausschnitt):
... main._domainkey.tachtler.net. IN TXT "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJRRxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+lnSp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkYiJw8V1oSoafME1WklQIDAQAB" ...
HINWEIS - Es ist nicht erforderlich, dass die neue Sub-Domain - main._domainkey.tachtler.net
auf eine gültige IP-Adresse auflöst, noch irgendwelche MX-Einträge besitzt!
WICHTIG - Nach dieser Änderung am DNS, ist ein restart des jeweiligen DNS-Servers notwendig!
Zum testen, ob AMaViS den öffentlichen Schlüssel richtig erreichen und abfragen kann, sind z.B. nachfolgende Befehle hilfreich:
AMaViS-Test
# amavisd testkeys TESTING#1: main._domainkey.tachtler.net => pass
DNS-Abfrage (beim eigenen DNS-Server)
# dig main._domainkey.tachtler.net TXT ; <<>> DiG 9.3.4-P1 <<>> main._domainkey.tachtler.net TXT ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7422 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;main._domainkey.tachtler.net. IN TXT ;; ANSWER SECTION: main._domainkey.tachtler.net. 86400 IN TXT "v=DKIM1\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJRRxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+lnSp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkYiJw8V1oSoafME1WklQIDAQAB" ;; AUTHORITY SECTION: tachtler.net. 86400 IN NS ns.tachtler.net. ;; ADDITIONAL SECTION: ns.tachtler.net. 86400 IN A 192.168.0.1 ;; Query time: 6 msec ;; SERVER: 192.168.0.1#53(192.168.0.1) ;; WHEN: Fri Jul 17 11:57:07 2009 ;; MSG SIZE rcvd: 319
DNS-Abfrage (beim fremder DNS-Server)
$ dig @62.146.28.82 main._domainkey.tachtler.net TXT ; <<>> DiG 9.2.4 <<>> @62.146.28.82 main._domainkey.tachtler.net TXT ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31744 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;main._domainkey.tachtler.net. IN TXT ;; ANSWER SECTION: main._domainkey.tachtler.net. 1048576 IN TXT "v=DKIM1\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJRRxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+lnSp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkYiJw8V1oSoafME1WklQIDAQAB" ;; Query time: 6 msec ;; SERVER: 62.146.28.82#53(62.146.28.82) ;; WHEN: Fri Jul 17 12:04:36 2009 ;; MSG SIZE rcvd: 286
DKIM aktivieren
Jetzt ist der Zeitpunkt für die Aktivierung von DKIM mit AMaViS gekommen.
Folgende abschließende Anpassungen müssen an der Konfigurationsdatei /etc/amavisd.conf
vorgenommen werden (nur relevanter Ausschnitt):
... $enable_dkim_verification = 1; # enable DKIM signatures verification $enable_dkim_signing = 1; # load DKIM signing code, keys defined by dkim_key # Tachtler dkim_key('tachtler.net', 'main', '/etc/pki/amavis/dkim/key.pem'); @dkim_signature_options_bysender_maps = ( { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } ); ...
Abschließend ist AMaViS zum zweiten mal neu zu starten, was wie schon erwähnt mit folgendem Befehl erfolgen kann:
# service amavisd restart Shutting down Mail Virus Scanner (amavisd): [ OK ] Starting Mail Virus Scanner (amavisd): [ OK ]
Konfiguration DKIM
Received-Zeilen ausnehmen
Laut RFC 4871 können auch die
Received: from
-Zeilen
zur Signierung der e-Mail mit herangezogen werden.
Dies hat jedoch den Nachteil, dass bei einer Veränderung der Received: from
-Zeilen im Nachhinein, wie es z.B. bei der Einlieferung durch Postfix via smtpd_proxy_filter
(Pre-Queue) bei AMaViS der Fall sein könnte, die DKIM-Sigantur sprichwörtlich „kaputt“ geht. Siehe nachfolgenden Auszug aus den Header-Zeilen (nur relevanter Ausschnitt):
... Authentication-Results: viruswall.dmz.tachtler.net (amavisd-new); dkim=fail (1024-bit key) reason="fail (message has been altered)" header.d=tachtler.net ...
Dies kann durch hinzufügen von nachfolgender Konfigurationszeile in die
/etc/amavisd.conf
$signed_header_fields{'received'} = 0; # turn off signing of Received
verhindert werden, indem die Received: from
-Zeilen nicht mehr mit in die Berechnung der DKIM-Signatur mit einfließen.
Test DKIM
AMaViS-Test
Mit nachfolgendem Befehl, kann eine Test des Gültigkeit der DKIM-Signatur unter Zuhilfenahme von AMaViS durchgeführt werden:
# amavisd testkeys TESTING#1: main._domainkey.tachtler.net => pass
DNS-Test
Mit nachfolgenden Befehlen, kann eine entsprechende DNS-Abfrage durchgeführt werden, um zu testen, ob der entsprechende Schlüssel im DNS korrekt eingebunden ist:
# host -t TXT main._domainkey.tachtler.net main._domainkey.tachtler.net descriptive text "v=DKIM1\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJRRxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+lnSp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkYiJw8V1oSoafME1WklQIDAQAB"
oder
# dig @8.8.8.8 main._domainkey.tachtler.net TXT ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> @8.8.8.8 main._domainkey.tachtler.net TXT ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51364 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;main._domainkey.tachtler.net. IN TXT ;; ANSWER SECTION: main._domainkey.tachtler.net. 21599 IN TXT "v=DKIM1\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCW697RxGpSmHUxXFMgirRcDKJRRxoDuuIxlH/69QsHeee+hBC0Uwg72tcQ8dkmQfJwpcHAIt8nP/0VQnRc2uyRr+lnSp89Diahd3frfgnPnyKjhoNglJNlsinEksKnsQ40G6rki1kH3Sf0mq+Hn0RYozkYiJw8V1oSoafME1WklQIDAQAB" ;; Query time: 118 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sun Mar 9 08:48:07 2014 ;; MSG SIZE rcvd: 286
* Anfrage z.B. an den Google DNS-Servers !
Folgender Text-Auszug sollte nun beim e-Mail-Verkehr im Quelltext im Header einer e-Mail erscheinen (nur relevanter Ausschnitt):
... DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tachtler.net; h= user-agent:content-transfer-encoding:content-disposition :content-type:content-type:mime-version:subject:subject:from :from:date:date:message-id:received:received:received; s=main; t=1247825666; x=1249640066; bh=zkfBNgBkKqRSYHugI+0qnNCPdrpy1OCX 05xaRMuDqHM=; b=k6+oUVv686bTSWNp+3MDpJRKWzf9oEipgx6z8TGgG/KlET0X NiydYWN+PMJSEobjAPta9GpUvG5k+VCLyT26mrk5/I9ApBHGQpmdb0cB/j6kXqAA KenY0BIV4rLgWIjqkdCFeW40IgxNj3ur5WNxHPxJWGdpLGtP+SPJYBRM/EM= ...
Der empfangende Mailserver ist mit Hilfe des Authentication-Results:-Header in der Lage festzustellen, ob die eMail unverändert angekommen und somit nicht manipuliert wurde:
Authentication-Results: viruswall.dmz.tachtler.net (amavisd-new); dkim=pass (4096-bit key) header.d=nausch.org
Wurde die Nachricht hingegen verändert, so schlägt die Überprüfung fehl:
Authentication-Results: viruswall.dmz.tachtler.net (amavisd-new); dkim=fail (1024-bit key) reason="fail (message has been altered)" header.d=tachtler.net