Archive for the ‘ dkim ’ Category

Amavisd-new E-Mails mit dkim signieren/prüfen

Nachdem die Schlüssel wie im Post 2487 erstellt wurden, kann die DKIM Signierung/Prüfung für Amavis aktiviert werden, dazu muss die Datei /etc/amavis/conf.d/50-user um folgende Zeile erweitert werden

$enable_dkim_verification = 1; # enable DKIM signatures verification
$enable_dkim_signing = 1; # load DKIM signing code,
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );
dkim_key('2nibbles4u.de', 'dkim_1', '/etc/postfix/dkim/dkim_1.private');
  • Zeile 1 aktiviert die DKIM Überprüfung von eingehenden E-Mails.
  • Zeile 2 aktiviert das Signieren von ausgehenden E-Mails
  • Zeile 3 & 4 legen fest, wie signiert wird
  • Zeile 5 gibt die Domain mit dem dazu gehörigen Schlüssel an.

Damit ausgehende E-Mails signiert werden, muss in der Datei /etc/amavis/conf.d/50-user in der Policy (wenn verwendet) originating auf 1 stehen.

originating => 1,                                     # 1 besagt, dass die E-Mails von unseren Clients kommen. Fuer DKIM notwendig!

Des weiteren muss darauf geachtet werden, dass die eigenen Domains auch als lokale Domains deklariert sind.

@local_domains_maps = ( read_hash("$MYHOME/localdomains"));

In der Datei localdomains können die Domains Zeilenweise aufgelistet werden.

.2nibbles4u.de

Nach einem Neustart von amavisd-new ist von jetzt an auch erkennbar, ob eine eigehende E-Mails mit DKIM signiert wurde.

Jun 16 10:50:09 lvps83-169-42-112 AMAVIS-O-O-S[28432]: (28432-01) Passed CLEAN, o-o-s.de [74.125.82.169] [74.125.82.169]
<sender@googlemail.com> -> <dkim@domain.tld>, Message-ID: <AANLkTin2kWjsiS3o1xb8kMkUI2pMvq2vJBH7ie4Xv2Z8@mail.gmail.com>,
mail_id: WAtUmEfcmLul, Hits: 3.793, size: 1872, queued_as: 268895CC8206, dkim_id=@googlemail.com,sender@googlemail.com, 1032 ms
$enable_dkim_signing = 1; # load DKIM signing code,

Probleme

Sollte es dennoch Probleme bei der Signierung geben, kann man sich mit amavisd showkeys die hinterlegten Schlüssel anzeigen lassen und mit amavisd testkeys prüfen, ob der Schlüssel per DNS korrekt veröffentlicht wird.

amavisd-new showkeys

dkim_1._domainkey.2nibbles4u.de.        3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7ZaO613cwhrxYJu63CG4yCxmh"
  "Ac3bt0F+rUoCFcBLGJ0/MjgW/z+ijOyn3Zw4uUjN1rbcI6DfyoGic8gjLbqKNBg9"
  "fU5uYU7FUealoGj3+TTg6K75vQss7kcyKMyEPvNEGq+gC8wVnV5ywOen6oLJewxb"
  "oSJYTa2iD2ggGdUTfwIDAQAB")

amavisd-new testkeys

TESTING: dkim_1._domainkey.2nibbles4u.de   => pass

DKIM/DomainKey Schlüssel erstellen und veröffentlichen

erstellen des Schlüssels

Es werden zwei Schlüssel benötigt. Einmal der private, mit dem die ausgehenden E-Mails signiert werden, und der öffentliche der per DNS veröffentlicht wird. Der Name unter dem der Schlüssel später im DNS veröffentlich wird heißt selector. Da in diesem Beispiel später der selector dkim_1 heißt, macht es Sinn die Schlüssel mit der gleichen Namensgebung zu erstellen. Eine englische Anleitung der Schritte finden Sie hier.

openssl genrsa -out dkim_1.private 1024
openssl rsa -in dkim_1.private -pubout -out dkim_1.public

Ja nachdem mit welchem Programm später die E-Mails signiert werden, können die Dateien in dem entsprechenden Ordner abgelegt werden.

  • Amavisd: /var/spool/amavis
  • dkim-proxy: /etc/dkimproxy
  • dkim-filter: hat keinen eigenen Konfigurationsordner

Ich bevorzuge allerdings, die Keys unter /etc/postfix/dkim/ zu speichern, da sie dort unabhänig vom verwendeten Sognierungstool abgelegt werden können.

öffentlichen Schlüssel per DNS veröffentlichen

Die einfachste Variante den Schlüssel per DNS zu veröffentlichen sieht für Bind wiefolgt aus.

dkim_1._domainkey.2nibbles4u.de        IN      TXT     "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7ZaO613cwhrxYJu63CG4yCxmhAc3bt0F+rUoCFcBLGJ0/MjgW/z+ijOyn3Zw4uUjN1rbcI6DfyoGic8gjLbqKNBg9fU5uYU7FUealoGj3+TTg6K75vQss7kcyKMyEPvNEGq+gC8wVnV5ywOen6oLJewxboSJYTa2iD2ggGdUTfwIDAQAB;"

Je nachdem ob man nun DKIM oder Domainkey oder beides zur Signierung verwendet, können zusätzliche Einstellungen vorgenommen werden.

Wie die Signierung E-Mail in das Spamerkennungsverfahren eingreift, kann hier nachgelesen werden.

Artikel, die auf diesem Aufbauen:

Links:

dkimproxy mit Dkim & Domainkey Signatur

dkimproxy mit Dkim & Domainkey Signatur

Nach unglaublich viel gefuckel hab ich es jetzt endlich geschafft, dass ausgehende E-Mails mit einer DKIM & DomainKey Signatur versehen werden.

Wer noch keine DKIM/DomainKey Schlüssel erstellt hat, lese bitte erst den Eintrag 2487.

Grundlage dafür war dkimproxy. Für Debian kann das Paket über aptitude oder apt-get bezogen werden.

Nach der Installation gibt es zwei Dateien die für die Konfiguration von dkimproxy maßgeblich sind.

Verifizierung eigehende E-mails -> /etc/dkimproxy/dkimproxy_in.conf

Signierung ausgehender E-Mails -> /etc/dkimproxy/dkimproxy_out.conf

Wer so wie ich nur E-Mails signieren möchte, kann in der /etc/init.d/dkimproxy die Zeile dafür auskommentieren

# DKIMPROXY_IN_ARGS=”–hostname=${DKIM_HOSTNAME} –conf_file /etc/dkimproxy/dkimproxy_in.conf –user=${DKIMPROXYUSER} –group=${DKIMPROXYGROUP}”

dkimproxy dem privaten Schlüssel mitgeben

Dkimproxy muss nun noch den privaten Schlüssel bekommen, mit dem es dann ausgehende E-Mails signieren kann.

keyfile  /etc/postfix/dkim/2nibbles4u.de/dkim_1

DKIM & DomainKey Signierung “erzwingen”

Jetzt kommt “mein Haken” an der Sache, Postfix muss zwar noch angepasst werden, aber dazu später….

In der bis jetzt erstellen Konfiguration signiert dkimproxy nur mit dkim und nicht mit domainkey wie ich es wollte. Nach einigem Suchen habe ich dann gesehen, dass dkimproxy einen Parameter sender_map unterstüzt. Dieser kann nicht über die /etc/dkimproxy/dkimproxy_out.conf angepasst werden und ermöglicht pro Domain zwei Signierungstypen zu aktivieren.

Also habe ich die Datei /etc/postfix/domainkeys/domainkeyfile mit folgendem Inhalt erstellt.

2nibbles4u.de domainkeys(a=rsa-sha1,c=nofws), dkim(a=rsa-sha256,c=relaxed)

Dieser muss dann als weiterer Aufrufparameter im Startscript /etc/init.d/dkimproxy hinterlegt werden.

DKIMPROXY_SENDERMAP="/etc/postfix/domainkeys/domainkeyfile"
[...]
DKIMPROXY_OUT_ARGS="--domain=${DOMAIN} --method=simple --conf_file /etc/dkimproxy/dkimproxy_out.conf --user=${DKIMPROXYUSER} --group=${DKIMPROXYGROUP}  --sender_map=${DKIMPROXY_SENDERMAP}"

Postfix Anpassung

Nun kommt die Postfix Anpassung.

/etc/postfix/master.cf:

#
# modify the default submission service to specify a content filter
# and restrict it to local clients and SASL authenticated clients only
#
submission  inet  n     -       n       -       -       smtpd
 -o smtpd_etrn_restrictions=reject
 -o smtpd_sasl_auth_enable=yes
 -o content_filter=dksign:[127.0.0.1]:10027
 -o receive_override_options=no_address_mappings
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject

#
# specify the location of the DKIM signing proxy
# Note: we allow "4" simultaneous deliveries here; high-volume sites may
#   want a number higher than 4.
# Note: the smtp_discard_ehlo_keywords option requires Postfix 2.2 or
#   better. Leave it off if your version does not support it.
#
dksign    unix  -       -       n       -       4       smtp
 -o smtp_send_xforward_command=yes
 -o smtp_discard_ehlo_keywords=8bitmime,starttls

#
# service for accepting messages FROM the DKIM signing proxy
#
127.0.0.1:10028 inet  n  -      n       -       10      smtpd
 -o content_filter=
 -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
 -o smtpd_helo_restrictions=
 -o smtpd_client_restrictions=
 -o smtpd_sender_restrictions=
 -o smtpd_recipient_restrictions=permit_mynetworks,reject
 -o mynetworks=127.0.0.0/8
 -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Nach einem Neustart aller Dienste sollten dann jetzt ausgehende E-Mails mit dkim & DomainKey signiert werden. Ich bin mir nicht mehr ganz sicher, aber ich glaube ich habe die Ports von dkimproxy in der Out Datei auf 10027 & 10028 umgestellt. Eingestellt war, wenn ich mich recht erinner 10028 & 10029 was zu einer Kollision mit der Postfix Konfiguration führte.

prüfen der Signierung

Über http://www.brandonchecketts.com/emailtest.phpkann die Signierung getestet werden, dazu muss lediglich vom enstprechenden System eine E-Mail an die zufällig generierte E-Mail Adresse geschickt werden.

in Kooperation mit amavisd-new (ohne Submission)

Wenn man in der Datei /etc/dkimproxy/dkimproxy_out.conf die signature Zeilen auskommentiert,

#signature dkim(c=relaxed)
#signature domainkeys(c=nofws)

kann man ohne Probleme in der /etc/postfix/master.cf  beim Wiedereintrittspunkt von amavisd-new den Parameter content_filter nutzen:

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
[...]
-o content_filter=dksign:[127.0.0.1]:10027

Eingehende E-Mails durchlaufen so nur amavisd-new. Ausgehende werden jedoch signiert, da hier die sender_map zuschlägt  … ergo, gehts auch ohne Submission-Port ;-)

Spamssassin: DKIM, DomainKey prüfen

Wie im Artikel Post-ID 1357 beschrieben können eMails per dkim signiert werden. Doch selber nur signieren und eingehende eMails nicht prüfen ist ja auch nicht so ganz im Sinne des Erfinders ;-)

Spamassassin kann genau diese Prüfung nun vornehmen. Dazu müssen noch Pakete installiert werden und in zwei Dateien die Plugins dafür auskommentiert werden.

apt-get install libssl-dev make autoconf gcc g++ libtool

cpan -i Mail::DomainKeys
cpan -i Mail::SpamAssassin::Plugin::DomainKeys
cpan -i Crypt::OpenSSL::RSA
cpan -i Mail::DKIM
cpan -i Net::Server

I.d.R. klappt die Installation über cpan ohne Probleme. Scheitert diese jedoch, kann man die Paket manuell installieren, indem man in das Setup Verzeichnis wechselt und das Paket manuell compiliert.

cd /root/.cpan/<Paketname>
perl makefile.pl
make
make install

Nun noch die Plugins durch auskommentieren aktivieren:

/etc/spamassassin/v310.pre
loadplugin Mail::SpamAssassin::Plugin::DomainKeys

/etc/spamassassin/v312.pre
loadplugin Mail::SpamAssassin::Plugin::DKIM

/etc/init.d/spamassassin restart

Wenn man anschließend jedoch Spamassassin die Konfiguration auf  Fehler prüfen lässt, erhält man folgende Meldung:

spamassassin --lint
[9595] warn: plugin: failed to parse plugin (from @INC): Can't locate Crypt/OpenSSL/Bignum.pm in @INC (@INC contains: lib /usr/share/perl5 /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl) at /usr/share/perl5/Mail/SpamAssassin/Plugin/DKIM.pm line 60.
[9595] warn: BEGIN failed--compilation aborted at /usr/share/perl5/Mail/SpamAssassin/Plugin/DKIM.pm line 60.
[9595] warn: Compilation failed in require at (eval 79) line 1.
[9595] warn: plugin: failed to create instance of plugin Mail::SpamAssassin::Plugin::DKIM: Can't locate object method "new" via package "Mail::SpamAssassin::Plugin::DKIM" at (eval 87) line 1.

Das Problem ist eine nicht erfüllte Abhängigkeit zum Paket libcrypt-openssl-bignum-per. Dies wurde jedoch bereits als Bug gemeldet (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=400437).

Daher muss dieses noch nachinstalliert werden.

apt-get install libcrypt-openssl-bignum-perl

Anschließend sollten bei spamassassin –lint keine Fehler mehr auftreten.

Die Spamassassin Berwertung der DKIM Signatur ist in der Datei 50_scores.cf enthalten.

SysCP: DKIM mit SysCP 1.4.2

Mit SysCP 1.4.2 wurde DKIM integriert, was es dem Absender ermöglicht, seine eMails beim versenden mit einer Signatur zu versehen, die der Empfangende Server prüfen kann um festzustellen ob die eMail tatsächlich von diesem Server Versand wurde. Weitere Informationen siehe Post-ID 1212.

So wie es aussieht, ist aber in der SysCP Version 1.4.2 ein Bug bezüglich der dkim Veröffentlichung mittels DNS enthalten, der aber bereits gemeldet wurde.

Schlüssel erstellen

siehe Post 2487

dkim-milter Installation

Da das Paket dkim-filter erst mit Debian Lenny ein fester Bestandteil von Debian wird, muss das Paket aus den Backports installiert werden.

wget http://www.backports.org/debian/pool/main/d/dkim-milter/dkim-filter_2.6.0.dfsg-1~bpo40+2_i386.deb
apt-get install libmilter0
dpkg -i dkim-filter_2.6.0.dfsg-1~bpo40+2_i386.deb

Coorperation mit amavisd-new

Da ich als Content-Filter jede eMail durch amavisd-new laufen lasse, musste die Signierung der eMails am Ort der Rückgabe der eMails nach der amavis Prüfung erfolgen. Dazu habe ich die master.cf wie folgt angepasst.

/etc/postfix/master.cf
127.0.0.1:10025 inet    n       -       -       -       -       smtpd
   [...]
  -o milter_default_action=accept
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_milters=inet:localhost:8891
  -o non_smtpd_milters=inet:localhost:8891
  -o content_filter=

anpassen der dkim-filter Konfiguration

Nun muss noch die Konfiguration angepasst werden. Dazu muss über die Datei /etc/default/dkim-filter der Port angegeben werden, über den der Filter erreichbar ist. Weiterlesen