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.
Installation des dépendances :
# apt-get install opendkim opendkim-tools
# mkdir /etc/opendkim
# LogWhy est utile en phase de debug/tests, période où le mettre à yes est utile. # Idem pour X-Header qui sert juste à savoir si on est bien passé dans opendkim. LogWhy Yes SyslogSuccess yes X-Header yes # on remplacera ces valeurs par les suivantes une fois la mise en place validée : #LogWhy no #SyslogSuccess no #X-Header no # Methode(s) a utiliser pour signer les messages (simple ou relaxed) : par defaut simple # on peut mettre 2 valeurs séparées par un / auquel cas la premiere sera utilisee pour l'entete et la seconde pour le corps du mail Canonicalization relaxed/simple # Integration postfix/dkim : on se souvient que sous debian/ubuntu postfix tourne en environnement chroot : Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock UserID opendkim:opendkim # Et enfin le lien vers la configuration de nos domaines et notre infra : ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable
# mkdir -p /etc/opendkim/keys/domaine1.com/ # mkdir -p /etc/opendkim/keys/domaine2.net/sous/
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“
# opendkim-genkey -b 2048 -D /etc/opendkim/keys/domaine1.com/ -s mx1-20150403 -d domaine1.com # opendkim-genkey -D /etc/opendkim/keys/domaine2.net/sous/ -s mx1-20150402 -d sous.domaine2.net
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.
# chgrp opendkim /etc/opendkim/keys/domaine1.com/* # chmod g+r /etc/opendkim/keys/domaine1.com/* # chgrp opendkim /etc/opendkim/keys/domaine2.net/sous/* # chmod g+r /etc/opendkim/keys/domaine2.net/sous/*
# chown opendkim:opendkim /etc/opendkim/keys/domaine1.com/*private # chmod 400 /etc/opendkim/keys/domaine1.com/*private # chown opendkim:opendkim /etc/opendkim/keys/domaine2.net/sous/*private # chmod 400 /etc/opendkim/keys/domaine2.net/sous/*private
# mkdir -p /var/spool/postfix/var/run/opendkim/ # chgrp opendkim /var/spool/postfix/var/run/opendkim/ # chmod g+w /var/spool/postfix/var/run/opendkim/
puis ajouter l'utilisateur postfix au groupe opendkim :
# adduser postfix opendkim
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
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
# cat << EOF > /etc/opendkim/TrustedHosts 127.0.0.1 localhost ::1 EOF
key.for.domaine1.com domaine1.com:mx1-20150403:/etc/opendkim/keys/domaine1.com/mx1-20150403.private key.for.sous.domaine2.net sous.domaine2.net:mx1-20150402:/etc/opendkim/keys/domaine2.net/sous/mx1-20150402.private
nom_donne_a_la_clef domaine:selector:/chemin/complet/vers/clef.private
*@domaine1.com key.for.domaine1.com *@sous.domaine2.net key.for.sous.domaine2.net
# service opendkim restart
ls -l /var/spool/postfix/var/run/opendkim/
$ dig +short -t TXT mx1-20150403._domainkey.domaine1.com @::1
et
$ dig +short -t TXT mx1-20150402._domainkey.sous.domaine2.net
# dire a postfix de ne pas jeter le mail meme en cas d'erreur de milter milter_default_action = accept # dire a postfix de parler a opendkim en utilisant son socket (relatif au chroot s'il y a) smtpd_milters = unix:/var/run/opendkim/opendkim.sock non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock
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
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= ...
Pour vérifier le fonctionnement :
Et bien sur une fois que tout fonctionne pensez à diminuer les logs opendkim (voir plus haut)
Vous voudrez peut être jeter un coup d’œil a cette page sur l'utilisation de mailman avec DKIM