DKIM – Domain Keys

Damit die Mails auch bei Yahoo durchgehen und nicht wegen Spam drankommen…

421 4.7.0 [TS01] Messages from xx.xx.xx.xx temporarily deferred due to user complaints - 4.16.55.1; 
see https://help.yahoo.com/kb/postmaster/SLN3326.html

gibt es verschiedene Methoden, wie man sich besser absichern kann.

SPF Record

Das ist sehr schnell eingerichtet. Über einen Generator, z.B.

Den Record generieren und im DNS Record der entsprechenden Domain eintragen.

DMARC Record

Yahoo prüft auch auf einen DMRAC Record. DMRAC geht weiter als SPF und DomainKeys, indem wir als Domain Inhaber von den Mailempfängern über Missbrauch informiert werden können. Eine ausführliche Anleitung dazu findest du hier.

Grundsätzlich ist es auch hier nur ein zusätzlicher DNS Eintrag.

Beispiel Record für example.com:

_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@emaildomain.com; ruf=mailto:dmarc@emaildomain.com; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; sp=none"

Da ich eine andere Email Domain für die Mails verwende, muss im DNS Record der Maildomain auch noch eine Anpassung gemacht werden:

Beispiel Record für emaildomain.com für DMRAC Email Empfang für example.com:

example.com._report._dmarc.emaildomain.com. IN TXT "v=DMARC1;"

Einfach mal ausprobieren und mit der Zeit bei Bedarf ein Finetuning machen.

Testen kann man ansonsten auch gleich auf dem eigenen DNS server per Konsole:

dig TXT _dmarc.example @localhost

Oder natürlich auch Extern z.B. mit dem MX Toolbox DMARC Check sowie den DKIM CORE keycheck

DomainKeys

DomainKeys ist eine Entwicklung von Yahoo, welche über SPF (einfacher Eintrag im DNS, welche IPs berechtigt sind Mails zu senden) hinausgeht.

Es gibt zwei Milter. Der eine ist dk-milter, der andere dkim-milter. dk-milter ist die alte bzw. erste Verison von DomainKeys. DKIM ist die Weiterentwicklung. Viele Provider (u.a. auch Google) benutzen nur noch DKIM. Daher sollten wir das auch machen 🙂

Installation

Ich lasse es einfach ben den Grundeinstellungen:

pkg install opendkim

Output:

************************************************************************

In order to run this port, write your opendkim.conf and:

if you use sendmail, add the milter socket `socketspec' in
/etc/mail/<your_configuration>.mc:

INPUT_MAIL_FILTER(`dkim-filter', `S=_YOUR_SOCKET_SPEC_, F=T, T=R:2m')

or if you use postfix write your milter socket `socketspec' in
/usr/local/etc/postfix/main.cf:

smtpd_milters = _YOUR_SOCKET_SPEC_


And to run the milter from startup, add milteropendkim_enable="YES" in
your /etc/rc.conf.
Extra options can be found in startup script.

Note: milter sockets must be accessible from postfix/smtpd;
using inet sockets might be preferred.

************************************************************************

Konfiguration für mehrere Domains (multiple domains)

Jetzt generieren wird den Text String für den DNS Record. Dafür gibt es ein Script, das sich hier befindet:

/usr/local/sbin/opendkim-genkey 

Der Selector ist die Bezeichnung womit danach der entsprechende Key gefunden werden kann. Wir machen das einfach mal mit dem selector meinservername

opendkim-genkey -s meinservername -d domain1.com -t
# per default wurde 1024 key generiert. wir wollen aber 2048 sha256 keys:
# entweder im TESTMODUS (-t):
opendkim-genkey -s meinservername -d domain1.com -t -b 2048 -hsha256
# oder gleich scharf:
opendkim-genkey -s meinservername -d domain1.com -b 2048 -hsha256

Dieses Script hat jetzt im aktuellen Verzeichnis zwei Files generiert

meinservername.private
meinservername.txt

Der Inhalt von meinservername.txt kommt in den DNS Record von domain1.com rein: Dieser Output kommt nun in den DNS Entry von domain1.com rein.

DNS Record

Folgende drei Zeilen kommen rein: (der dritte wurde vom Script generiert, die ersten beiden müssen wir selber einfügen.

_domainkey.domain1.com.            IN      TXT     "t=y; o=-;"
_adsp._domainkey.domain1.com.      IN      TXT     "dkim=unknown"
_asp._domainkey                 IN      TXT     "t=y; dkim=all"
meinservername._domainkey IN TXT "v=DKIM1; g=*; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmh7+NMQ/ElclBMBJXJ5NKs66DcBohAf+Q1N8vI6kB9On7FjW10JoSUOH1sEXtQeQrIkolLr+olvA+lrtilmZJcEGpcGczrWIoVDr1VN7ZNljOvNdJ8pIGJKFtSa5OxNDtX3RCvGvNw6dJVkPb5b0QMU+2slhqiUiwE9BG9OrexwIDAQAB" ; ----- DKIM meinservername for domain1.com

_adsp._domainkey.domain1.com. Dies ist zur Zeit noch optional, da noch nicht ausgereift. Weitere Infos dazu: http://www.elandsys.com/resources/sendmail/dkim.html

t=y (Testlauf)

Mit dem Flag t=y signalisieren wir, dass wir noch am Testen sind. Mit diesem Flag darf die Signatur zwar geprüft werden, aber das Ergebnis darf nicht in die Bewertung des Emails einfliessen. Sobald das DKIM Setup erfolgreich geprüft wurde, muss dieser Flag entfernt werden um das System scharf zu stellen.

Möglicher Fehler

Es könnte sein, dass beim Selector Record Tester ein Fehler auftritt wegen dem V Flag. Dann einfach v=DKIM1; vom DNS Record entfernen und reloaden.

Danach DNS reloaden und Records testen. Das kann man mit diesen Tools machen:

Sendmail Config

Das dkim-genkey.sh Script hat auch noch dieses Key Files erstellt:

meinservername.private

Diese sollten nun in ein geeignetes Verzeichnis verschoben werden:

mkdir /var/db/dkim/keys/
cp meinservername.private /var/db/dkim/keys/domain1.com.key
chmod 600 /var/db/dkim/keys/domain1.com.key 
chown -R mailnull:mailnull /var/db/dkim/*

Das CHOWN ist sehr wichtig! Ansonsten gibt es solche Fehlermeldungen:

May 15 14:40:09 corky dk-filter[40436]: m4FCe9rO040481: no signature data

Nun KeyFile & SigningTable erstellen:

touch /var/db/dkim/keyfile
touch /var/db/dkim/signingtable
KeyFile

Das keyfile öffnen und die entsprechenden Domain Daten eintragen:

vi /var/db/dkim/keyfile
meinservername._domainkey.domain1.com domain1.com:meinservername:/var/db/dkim/keys/domain1.com.key
meinservername._domainkey.domain2.com domain2.com:meinservername:/var/db/dkim/keys/domain2.com.key
SigningTable

Das File öffnen und die entsprechenden Domain Daten eintragen:

vi /var/db/dkim/signingtable
*@domain1.com meinservername._domainkey.domain1.com
*@domain2.com meinservername._domainkey.domain2.com
*@subdomain.domain2.com meinservername._domainkey.domain2.com

Wichtig! in der Signingtables müssen auch allfällige Subdomains angegeben werden, falls solche für den Versand verwendet werden.

TrustedHosts

Und jetzt noch die TrustedHosts erstellen. Mails von diesen IP’s / Domains werden von DKIM signiert.

vi /var/db/dkim/TrustedHosts

Paste:

localhost.domain.com
localhost
corky.domain.com
domain.com
xxx.xx.xx.xx
127.0.0.1
.domain.com
chown mailnull:mailnull /var/db/dkim/TrustedHosts
opendkim.conf

Jetzt noch die beiden Files im Config aktivieren:

vi /usr/local/etc/mail/opendkim.conf
KeyTable                refile:/var/db/dkim/keyfile
SigningTable            refile:/var/db/dkim/signingtable
ExternalIgnoreList      refile:/var/db/dkim/TrustedHosts
InternalHosts           refile:/var/db/dkim/TrustedHosts

Startup Script

vi /etc/rc.conf

Folgendes Eintragen

#-----------------------------------------------#
#       DomainKeys                              #
#-----------------------------------------------#
milteropendkim_enable="YES"
milteropendkim_socket="inet:18891@localhost"
#nicht mehr sha1: ist veraltet! milteropendkim_flags="-b s -c relaxed/simple -D -S rsa-sha1"
milteropendkim_flags="-b s -c relaxed/simple -D" ## selector wird per config übergeben
##milteropendkim_selector="meinservername"
##milteropendkim_socket="local:/var/run/milterdkim/filter"

Beschreibung:

-b s  = nur signer (sv wäre signer und verifier, wir machen aber keinen domainkey spamcheck)
-c    = möglich ist simple/simple (default) oder relaxed/simple. relaxed/simple lässt mehr 
        modifications zu als simple/simple. die wahrscheinlichkeit, dass die message so
        akzeptiert wird ist höher als bei simple/simple
        http://www.dkim.org/specs/rfc4871-dkimbase.html
-D    = dass er auch sub-domains signed
-S    = damit wir keine RSA fehlermeldung erhalten.
-i    = in diesem file werden alle hosts gespeichert, die senden dürfen. ansonsten
        würden mails von localhost aus nicht versendet werden, da es dann corky.shoe.org
        heisst und nicht localhost oder so...
May 22 18:51:58 corky dkim-filter[65174]: m4MGoZZC066376 external host corky.domain.com attempted to send as domain1.com

 

 

das cfgfile brauchen wir eigentlich nicht. aber so könnte es aussehen:

vi /etc/mail/dkim-filter.conf

Paste

AlwaysAddARHeader       Y
Domain                  domain1.com
LogWhy                  Y
MilterDebug             99
SubDomains              Y
Syslog                  Y
chown mailnull:mailnull /etc/mail/dkim-filter.conf

Weitere Details auf der Offizielle DKIM Site

Liste aller möglichen Flags:

       -a peerlist file containing list of hosts to ignore
       -A              auto-restart
       -b modes        select operating modes
       -c canon        canonicalization to use when signing
       -C config action configuration info (see man page)
       -d domlist      domains to sign
       -D              also sign subdomains
       -f              don't fork-and-exit
       -F time         fixed timestamp to use when signing (test mode only)
       -h append identifying header -i ilist file containing list of internal (signing) hosts -I elist file containing list of external domain clients
       -k keyfile      location of secret key file
       -K load a key set instead of a single key
       -l              log activity to system log
       -L limit        signature limit requirements
       -m mtalist MTA daemon names for which to sign -M macrolist MTA macros which enable signing
       -o hdrlist      list of headers to omit from signing
       -P pidfile      file to which to write pid
       -q              quarantine messages that fail to verify
       -Q              query test mode
       -r              require basic RFC5322 header compliance
       -R generate verification failure reports
       -s selector     selector to use when signing
       -S signalg      signature algorithm to use when signing
       -t testfile     evaluate RFC2822 message in "testfile"
       -T timeout      DNS timeout (seconds)
       -u userid       change to specified userid
       -v              increase verbosity during testing
       -V              print version number and terminate
       -W              "why?!" mode (log sign/verify decision logic)
       -x conffile     read configuration from conffile

Eine Genaue Description von allen Flag Modes gibt es hier Offizielle DKIM Site

Milter starten

/usr/local/etc/rc.d/milter-opendkim start

Sollte die Fehlermeldung

verify mode requires rsa-sha256 support

auftauchen, darauf achten, dass im rsa-sha1 mode gestartet wurde (-S rsa-sha1)

Sendmail Konfigurieren

vi  /etc/mail/my_prefs/corky.mc

Folgende Line hinzufügen

dnl ##INPUT_MAIL_FILTER(`dkim-filter', `S=unix:/var/run/milteropendkim/filter, F=T, T=R:2m')dnl 
INPUT_MAIL_FILTER(`dkim-filter', `S=inet:18891@localhost')dnl

Wichtig! Der DomainKeys Milter muss der LETZTE in der Liste sein! Alle anderen Milter müssen vorher ausgeführt werden. Neu Builden

cd /etc/mail
make

Sendmail neu starten

rcsendmail stop
rcsendmail start

Testen

Key lokal testen:

opendkim-testkey -d domain.com -s selektor -vvv

Möglicher Output:

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'selektor._domainkey.domain.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK

-> Wenn die Meldung „Key not secure“ auftaucht, ist dies nicht weiter tragisch. Das bedeutet lediglich, dass kein DNSSEC verwendet wird – was jedoch nichts mit DKIM zu tun hat. Diese Nachricht kann also einfach ignoriert werden.

Checke DNS Record:

dig selektor._domainkey.domain.com TXT

Testen via Command Line

Einfach Email per Command Line an eine der folgenden Emails senden:

  • Sehr übersichtlich: Der DKIM Validator. Sende das Email einfach an eine random Adresse und check das Resultat auf https://dkimvalidator.com/
  • check-auth@verifier.port25.com

 

sendmail -f absender@domain.com -i -t <<EOF
From: absender@domain.com
Sender: absender@domain.com
To: empfaenger@domain.com
Subject: Test

Test
EOF

Oder direkt über die Commandline an dkim Tester senden:

sendmail -f absender@domain.com -i -t <<EOF
From: absender@domain.com
Sender: absender@domain.com
To: check-auth@verifier.port25.com
Subject: Test

Test
EOF

Debuggen

Bei Problemen debugging Option aktivieren:

vi /usr/local/etc/mail/opendkim.conf
LogWhy          yes

und Milter restarten

/usr/local/etc/rc.d/milter-opendkim restart             

Danach Logfile prüfen

tail -f /var/log/maillog

alternativ kann man es zum Testen auch so starten:

opendkim -vvv -x /usr/local/etc/mail/opendkim.conf -p inet:18891@localhost -u mailnull

Testing

Wenn ich mir jetzt selber eine Mail sende (von meinem Server aus an meinen Server) sollte folgendes im Header drin stehen:

DKIM-Signature: v=1; a=rsa-sha1; c=simple/simple; d=shoe.org; s=meinservername;
	t=1211388855; bh=uoq1oCgLlTqpdDX/iUbLy7J1Wic=; h=Message-Id:Date:To:
	 From:Subject:Mime-Version:Content-Type; b=kmFVkoW2rEyKnARei2eFON3v
	e5NlF2prWWDkfu207z3SqeQJLelneSzw9zreYXJ24I/9nrjpU0iCgW1FbC5x8T6611c
	k8Uno0p1lJRKQ3N34riKEPpb1USx/d+SJ0heox7xYrwdc5i3KhjCHQj0l46vFX0Xiua
	rj8Hc7u44Fo+0=

Der Reply vom Testmail an check-auth@verifier.port25.com sollte bei einem success in etwa so aussehen:

==========================================================
Summary of Results
==========================================================
SPF check:          pass
"iprev" check:      pass
DKIM check:         pass

Weitere Infos

 

Fehlermeldungen / Probleme

Mails per PHP Mail(), sendmail -t etc. werden nicht mit DKIM signiert

Mail wird über Email Client normal verschickt & mit DKIM signiert, jedoch nicht, wenn man per Telnet/PHP Mailer/sendmail -t etc. verschickt. Wenn das passiert, als erstes das Debugging von DKIM aktivieren (LogWhy – siehe Debugging)  und maillog checken.  In meinem Fall war dies das Problem:

Sep  9 13:19:07 corky opendkim[51485]: t89BJ7Wh051487: corky.domain.com [xxx.xx.xx.xx] not internal
Sep  9 13:19:07 corky opendkim[51485]: t89BJ7Wh051487: not authenticated

 Problem war, dass TrustedHosts nicht korrekt konfiguriert waren.

Mail enthält mehrere identische DKIM Signaturen

Das kann passieren, wenn die Mails über mehrere Server verschickt werden, die alle als TrustedHosts signieren dürfen. Also: Server 1 signiert & verschickt die Mail. Empfangen wird sie auf Server 2, der ebenfalls zu meinem Netzwerk & TrustedHosts gehört. Hier wird die Mail noch einmal signiert. Daher kann es sein, dass es 2 Signaturen hat. Ist also nicht weiter tragisch & kann ignoriert werden.

 

  • *

    Du kannst diese HTML tags verwenden: <a> <abbr> <acronym> <b> <blockquote> <cite> <code> <del> <em> <i> <q> <s> <strike> <strong>

  • Kommentar-Feed für diesen Beitrag
nach oben