Table des matières

Signature mail avec DKIM pour ses (sous)domaines

DKIM (DomainKeys Identified Mail) ajoute une signature aux mails sortants de vos serveurs mail, et permet ainsi aux serveurs destinataires de vérifier cette signature. Pour ce faire il lui suffit d'interroger votre DNS ou vous devez stocker votre clef publique.

On va voir ici comment mettre en place DKIM pour un ensemble de domaines/sous domaines et un ensemble de serveurs mails. Tous les serveurs sont sous debian stable (wheezy) mais ces procédures sont transposables facilement sur votre distrib.

Prérequis

Installation des dépendances :

# apt-get install opendkim opendkim-tools
opendkim-tools sert par exemple pour générer les clefs, il n'est pas forcément nécessaire sur tous vos serveurs

Configuration de DKIM

Génération de nos clefs

Concernant la génération de clefs je suggère de choisir pour le selector une forme type SERVEUR-DATE où SERVEUR est le nom du serveur utilisant la clef et DATE est la date format US (YYYYMMDD) de génération de la clef : cela permet d'ajouter facilement de nouvelles clefs, de nouveaux serveurs et de publier tout ça dans nos DNS sans risquer de problèmes avec les différents niveaux de cache (certains client peuvent continuer à demander une ancienne clef le temps de la propagation DNS).

Les requetes DNS associées seront donc selector._domainkey.example.com“

Dans ce cas les selector sont donc mx1-20150403 pour domaine1.com et mx1-20150402 pour sous.domaine2.net. Ces commandes génèrent chacun 2 fichiers : un fichier selector.private et selector.txt contenant respectivement la clef privée et la clef publique qu'il faudra ensuite ajouter à la configuration DNS de votre domaine.

Intégration postfix-opendkim

Ajouter les clefs publiques aux zones DNS

Il faut ajouter le contenu du fichier selector.txt a la bonne zone DNS. Pour se faire si vous utilisez bind et qu'il tourne sur la même machine (fichiers de zone /etc/bind/domaine :

# cat /etc/opendkim/keys/domaine1.com/mx1-20150403.txt >> /etc/bind/domaine1.com
Pour un sous domaine, il faut légèrement modifier le contenu du fichier .txt en l'ajoutant : SERVEUR-DATE._domainkey devient SERVEUR-DATE._domainkey.sousdomaine, donc dans notre exemple de sous.domaine2.net : “mx1-20150402._domainkey.sous”
Dans le cas ou vous avez utilisé une longueur de clef supérieur a 1024, cette ligne dépassera 255 caractères, ce qu'on ne peut faire : il faut donc découper cette ligne en plusieurs, cf http://razzed.com/2009/03/05/dkim-txt-records-in-dns-exceeding-255-characters/ : notre ajout sera de la forme :
mx1-20150403._domainkey IN TXT ( "v=DKIM1; k=rsa; p=LeDebutde MaClefPubliqueQuiEstTellementLongueQuIlFautEnFaitLaSeparer............................................................"
"EtLaMettreSurUneDeuxiemeLigne..................................................
"VoireMemeUneTroisiemeVuQuOnEstDesOUFS" )

Il va sans dire que chacune des lignes ainsi obtenues doit faire moins de 255 caractères.

Une fois ces modifications intégrées dans vos zones, il faudra comme d'habitude incrémenter le numéro de série de vos zones et les recharger : rndc reload peut vous aider

Paramétrage de nos domaines dans DKIM

Ne pas oublier que seuls les mails provenant des noms DNS/adresses IPs contenues dans ce fichier seront effectivement signés (sans authentification préalable) : il peut donc êre utile de faire coïncider le contenu de ce fichier avec le mynetworks de votre postfix
L'utilisateur averti aura remarqué que chaque ligne est de la forme :
nom_donne_a_la_clef domaine:selector:/chemin/complet/vers/clef.private

Paramétrage postfix pour utiliser DKIM

$ dig +short -t TXT mx1-20150403._domainkey.domaine1.com @::1

et

$ dig +short -t TXT mx1-20150402._domainkey.sous.domaine2.net
Les lignes milters ci dessus sont valables si vous n'aviez pas déja de milter défini : si c'était le cas il suffit de les chaîner, comme par exemple :
smtpd_milters = unix:/spamass/spamass.sock, unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:/spamass/spamass.sock, unix:/var/run/opendkim/opendkim.sock
Si vous utilisez amavis quelques options sont à avoir absolument sans quoi vous allez passer deux fois dans opendkim : Dans le process de reinjection (en general 127.0.0.1:10025) dans le fichier /etc/postfix/master.cf :
  • s'assurer que l'option receive_override_options contient bien no_milters
  • s'assurer que l'option smtpd_milters est presente avec une valeur vide

Tout ceci nous donne quelque chose comme :

127.0.0.1:10025 inet n    -       n       -       -     smtpd
     -o content_filter=
...
     -o receive_override_options=...,...,...,no_milters
...
     -o smtpd_milters=
...

Vérification du fonctionnement

Pour vérifier le fonctionnement :

Et bien sur une fois que tout fonctionne pensez à diminuer les logs opendkim (voir plus haut)

Aller plus loin

Vous voudrez peut être jeter un coup d’œil a cette page sur l'utilisation de mailman avec DKIM

Références