DKIM – Domain Keys

DomainKeys

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

421 4.7.0 [TS01] Messages from 81.94.97.82 temporarily deferred due to user complaints - 4.16.55.1; 
see http://postmaster.yahoo.com/421-ts01.html

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

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:

cd  /usr/ports/mail/opendkim
make install clean
   lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
   x Options for opendkim 2.5.2                                         x
   x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
   x x [*] ARLIB        Asynchronous thread-safe DNS library          x x
   x x [*] FILTER       OpenDKIM filter, requires libmilter/Sendmail  x x
   x x [ ] GNUTLS       Use GnuTLS instead of OpenSSL                 x x
   x x [ ] LUA          Describe filter policy with lua               x x
   x x [ ] MEMCACHED    Use memcached as a data set                   x x
   x x [ ] OPENDBX      Store filter policies via OpenDBX             x x
   x x [ ] OPENLDAP     Store filter policies in LDAP                 x x
   x x [ ] POPAUTH      Use POP authentication DB                     x x
   x x [ ] QUERY_CACHE  Cache DNS query results locally               x x
   x x [ ] UNBOUND      Use unbound DNS library                       x x
   x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
   tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
   x                   <  OK  >          <Cancel>                       x
   mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

Output:

************************************************************************
===>   Compressing manual pages for opendkim-2.5.2
===>   Running ldconfig
/sbin/ldconfig -m /usr/local/lib
===>   Registering installation for opendkim-2.5.2
===> SECURITY REPORT: 
      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/lib/libar.so.2

      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
/usr/local/etc/rc.d/milter-opendkim

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage: 
http://opendkim.org/
===>  Cleaning for opendkim-2.5.2

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/bin/opendkim-genkey

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

   opendkim-genkey -s mail -d domain1.com -t

Dieses Script hat jetzt im aktuellen Verzeichnis zwei Files generiert

mail.private
mail.txt

Der Inhalt von mail.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"
mail._domainkey IN TXT "v=DKIM1; g=*; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmh7+NMQ/ElclBMBJXJ5NKs66DcBohAf+Q1N8vI6kB9On7FjW10JoSUOH1sEXtQeQrIkolLr+olvA+lrtilmZJcEGpcGczrWIoVDr1VN7ZNljOvNdJ8pIGJKFtSa5OxNDtX3RCvGvNw6dJVkPb5b0QMU+2slhqiUiwE9BG9OrexwIDAQAB" ; ----- DKIM mail 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

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:

mail.private

Diese sollten nun in ein geeignetes Verzeichnis verschoben werden:

mkdir /var/db/dkim/keys/
cp mail.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
mail._domainkey.domain1.com domain1.com:mail:/var/db/dkim/keys/domain1.com.key
mail._domainkey.domain2.com domain2.com:mail:/var/db/dkim/keys/domain2.com.key
SigningTable

Das File öffnen und die entsprechenden Domain Daten eintragen:

vi /var/db/dkim/signingtable
*@domain1.com mail._domainkey.domain1.com
*@domain2.com mail._domainkey.domain2.com
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_selector="mail" 
milteropendkim_flags="-b s -c relaxed/simple -D -S rsa-sha1"
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

INPUT_MAIL_FILTER(`dkim-filter', `S=unix:/var/run/milteropendkim/filter, F=T, T=R:2m')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

Testen via Command Line

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: autorespond+dkim@dk.elandsys.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

 

Testing simple/simple

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=mail;
	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 autorespond+dkim@dk.elandsys.com sollte bei einem success in etwa so aussehen:

DKIM Test: pass (1024-bit key)
DKIM Author Signing Practice: "t=y; dkim=all"

Testing relaxed/simple

A DKIM test for canonicalization relaxed can be performed by sending an email to autorespond+dkim-relaxed@dk.elandsys.com. Send an email to autorespond+dkim-simple@dk.elandsys.com to test simple canonicalization.

Der Reply vom Testmail sollte etwa so aussehen:

DKIM Signature validation: pass
DKIM Author Domain Signing Practices: "dkim=unknown"

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