Installer DKIMproxy

Placez-vous dans /usr/src et téléchargez DKIMproxy

cd /usr/src
wget http://kent.dl.sourceforge.net/sourceforge/dkimproxy/dkimproxy-1.0.1.tar.gz

Décompressez l'archive et placez-vous dans le nouveau répertoire

tar zxvf dkimproxy-1.0.1.tar.gz
cd dkimproxy-1.0.1

Si vous n'avez pas encore le module perl Mail::Dkim, il faut l'installer via CPAN pour disposer d'une version suffisamment récente la version Debian Etch est trop ancienne).

perl -MCPAN -e shell
install Mail::DKIM
exit

Préparez l'installation de dkimproxy dans /usr/local/dkimproxy

mkdir /usr/local/dkimproxy
./configure --prefix=/usr/local/dkimproxy

Compilez et installez

make install

Déplacez-vous dans le répertoire dkimproxy et renommez les fichiers de configuration des daemons

cd /usr/local/dkimproxy
mv etc/dkimproxy_in.conf.example etc/dkimproxy_in.conf
mv etc/dkimproxy_out.conf.example etc/dkimproxy_out.conf

Créer l'utilisateur et le groupe dkim

adduser dkim --no-create-home --disabled-password --disabled-login

Installer le script de démarrage de dkimproxy

Copiez le script de démarrage proposé dans les sources de dkimproxy dans /etc/init.d/

cp /usr/src/dkimproxy-1.0.1/sample-dkim-init-script.sh /etc/init.d/dkimproxy

Editez-le. Normalement, il n'y a rien a changer dans ce fichier si on utilise les paramètres « standards »

vi /etc/init.d/dkimproxy

Créer une clé publique/privée

Chaque domaine possèdera sa propre clé. On crée un dossier dans lequel on stockera les clés.

mkdir /usr/local/dkimproxy/keys
cd /usr/local/dkimproxy/keys

On suppose que vous avez le paquet OpenSSL installé et que votre domaine est exemple.tld

La clé privée

openssl genrsa -out exempletld.key 1024

La clé publique

openssl rsa -in exempletld.key -pubout -out exempletld_pub.key

Changer les droits sur la clé privée pour la rendre uniquement accessible à l'utilisateur dkim

chown dkim:dkim exempletld.key
chmod 640 exempletld.key

Ajouter l'enregistrement TXT à la zone DNS

Une fois la clé générée, il va falloir ajouter un enregistrement TXT à la zone de chaque domaine. Prenons encore l'exemple du domaine exemple.tld

On édite le fichier de zone /var/cache/bind/exemple.tld.hosts et on ajoute l'enregistrement TXT suivant. La valeur de "p=" correspond à la clé publique sur une seule ligne. Notez également le nom exempletld qui sera utile pour la suite (nous l'appellerons "sélecteur"). Le t=y; signifie que votre installation est en test. Vous pourrez retirer cette information quand tout sera opérationnel

; DKIM
_domainkey.exemple.tld.                  IN TXT  "t=y; o=-;"
exempletld._domainkey.exemple.tld.    IN TXT "k=rsa; t=s; p=ici_la_cle_publique_hyper_longue"

N'oubliez pas d'incrémenter le numéro de série de votre zone pour que les changements soient pris en compte et relancer bind :

/etc/init.d/bind9 restart

Créer le fichier de configuration de DKIM

Il faut maintenant créer le fichier de configuration qu'utilisera DKIMproxy au lancement du service. Celui ci contient les différentes informations pour chacun des domaines signés.

vi /usr/local/dkimproxy/sender_map

Toujours l'exemple avec exemple.tld. Ici, on demande la signature DKIM et la signature DomainKeys. Il est possible de choisir l'un ou l'autre uniquement. Je vous renvois sur les spécifications de DKIM pour les autres paramètres ! Sachez simplement que le paramètre « s » correspond au nom du sélecteur utilisé dans votre fichier de zone.

exemple.tld dkim(c=simple,s=exempletld,a=rsa-sha1,key=/usr/local/dkimproxy/keys/exemple.tld.key), domainkeys(c=nofws,s=exempletld,key=/usr/local/dkimproxy/keys/exempletld.key) 

A lire avant de continuer : un « problème » subsiste dans mon howto. En effet, je lance toujours dkimproxy.in qui s'occupe de l'analyse de messages entrants alors que ce travail est déjà effectué par SpamAssasin via Amavis comme je le précise au début de ce billet. Je n'ai simplement pas pris le temps de modifier le script de démarrage et mon implémentation dans Postfix. Je modifierais ce billet dés que j'aurais nettoyé tout ça ! Ami lecteur, si tu l'as fais pour ta configuration, n'hésites pas à me le signaler ;)

Ceci étant, la signature fonctionne tout de même... alors on continue !

Lancer DKIMproxy

Avant d'envisager la configuration de Postfix, il faut vérifier que DKIMproxy se lance correctement :

/etc/init.d/dkimproxy start

Si il n'y a pas d'erreur on vérifie que le service est fonctionnel :

ps aux | grep dkim

Il doit y avoir des lignes avec dkimproxy.in et des lignes avec dkimproxy.out.

Maintenant que la zone est modifié, DKIMproxy installé et fonctionnel, passons enfin à la configuration de Postfix.

Configurer de Postfix

La configuration n'est pas différente de celle pour dkfilter. Je colle ici le contenu de mon précédent billet.

Dans ma configuration, avant l'installation de DKIM et DomainKeys, j'utilise déjà Amavisd-new pour le filtrage antivirus (clamav) et antispam (spamassassin et dspam). J'ajoute donc DKIMproxy dans le process avant l'analyse par Amavis.

Dans le main.cf, je remplace :

content_filter = amavis:[127.0.0.1]:10024

par :

content_filter = dksign:[127.0.0.1]:12027

[Je ne sais pas pourquoi mais si je ne précise pas le content_filter dans le main.cf, les mails envoyés par des processus locaux (par exemple, la fonction mail de PHP) ne passe pas par amavis et dksign]

Dans le master.cf, voici la configuration :

Au début du fichier

# relayer sur dksign sur le port 10028
smtp      inet  n       -       -       -       200     smtpd
        -o receive_override_options=no_address_mappings
        -o content_filter=dksign:[127.0.0.1]:12027

# Le smtp securise SSL
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o content_filter=dksign:[127.0.0.1]:12027
  -o receive_override_options=no_address_mappings
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

# envoyer directement a dksign
submission  inet  n     -       n       -       -       smtpd
    -o smtpd_etrn_restrictions=reject
    -o smtpd_sasl_auth_enable=yes
    -o content_filter=dksign:[127.0.0.1]:12027
    -o receive_override_options=no_address_mappings
    -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
    #-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject

A la fin

# Pour amavis
amavis  unix    -   -   -   -   20  smtp
        -o smtp_helo_timeout=300 
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
127.0.0.1:10025 inet n - - - - smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_bind_address=127.0.0.1
    -o disable_dns_lookups=yes

#
# signature dkim/domainkeys
#
dksign    unix  -       -       n       -       10      smtp
    -o smtp_send_xforward_command=yes
    -o smtp_discard_ehlo_keywords=8bitmime

#
# signature dkim/domainkeys
#
127.0.0.1:12028 inet  n  -      n       -       10      smtpd
    -o content_filter=amavis:[127.0.0.1]:10024
    -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

Vous pouvez ensuite relancer postfix

/etc/init.d/postfix restart

Vérifier la signature

Envoyez un mail et regardez dans les logs :

tail -f /var/log/mail.info

Vous devez avoir pour un message envoyé par une adresse de exemple.tld :

... DKIM signing - signed; message-id=<47D7961B.6060505@exemple.tld>, signer=<yves@exemple.tld>, from=<yves@exemple.tld> 

Pour les autres :

... DKIM signing - skipped; from=<test@autredomain.tld

Vous pouvez également vérifier votre configuration en envoyant un mail à l'adresse : check-auth ici_le_chez verifier.port25.com. Cette adresse vous renvoi les informations sur l'installation des différents protocoles d'authentification des mails sur votre domaine. Ainsi, si vous avez également configuré correctement SPF vous devez avoir tout bon :

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DomainKeys check:   pass
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

Vous devez aussi avoir les informations sur DKIM et DomainKeys dans l'entête du message signé :

DKIM-Signature: v=1; a=rsa-sha1; c=simple; d=exemple.tld; h=
	message-id:date:from:mime-version:to:subject:content-type:
	content-transfer-encoding; q=dns/txt; s=exempletld; bh=clepublique=
DomainKey-Signature: a=rsa-sha1; c=nofws; d=exemple.tld; h=message-id:
	date:from:mime-version:to:subject:content-type:
	content-transfer-encoding; q=dns; s=exemple.tld; b=clepublique=

Il me reste encore à comprendre complètement les différentes options de la spécification DKIM mais c'est un bon début :)