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.
- SPF Wizard von mxtoolbox
- SPF Generator (deutsch)
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.
- KTS DMARC Assistant
- DMRAC.org – Liste diverser Tools
- DMARC Wizard
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
- /var/log/maillog nach dkim durchsuchen und schauen ob es errors gibt
- sende eine testnachricht an
check-auth@verifier.port25.com
- Oder nutze den DKIM / SPF Validator
- DNS Records Testen
- MX Toolbox (für DKIM und SPF und vieles mehr!)
- Policy Record Tester
- Selector Record Tester
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.