Signer ses emails sortants avec DKIM

Comme l’explique si bien Wikipedia, DKIM (DomainKeys Identified Mail) est une norme d’authentification du nom de domaine de l’expéditeur d’un courrier électronique. En signant les messages, DKIM vérifie l’authenticité du domaine qui les expédie et garantit leur intégrité.

Ce billet est la suite logique de celui sur l’ajout d’un enregistrement SPF, il va en effet permettre de réduire encore plus les risques d’être déclaré comme spammeur car tous les messages sortants du serveur de messagerie seront signés et donc authentifiés.

Installation et configuration

Les commandes et chemins décris ci-dessous sont ceux d’un serveur Fedora, il suffira de les adapter pour une autre distribution. Sous Fedora l’installation se fait avec dnf désormais :

$ sudo dnf install opendkim

TODO : voir ici pour mettre les domaines gérés par DKIM dans des tables : https://www.linuxbabe.com/redhat/set-up-spf-dkim-postfix-centos

Il faut maintenant éditer le fichier de configuration d’OpenDKIM /etc/opendkim.conf  avec les valeurs ci-dessous (bien entendu il faut remplacer rholala.net par votre nom de domaine).

Mode        s
Domain        rholala.net
KeyFile       /etc/postfix/dkim.rholala.net.key
Selector      mail

En principe le paramètre Mode est à v (vérifier) par défaut, on le passe à s (signer) pour lui dire de signer les messages sortants. Selector quand à lui est un identifiant, je le mets à mail, mais libre à vous de choisir autre chose.

Lorsque ceci est fait, mettre à jour la configuration de Postfix (sous /etc/postfix/main.cf) pour prendre en compte OpenDKIM :

milter_default_action     = accept
milter_protocol         = 2
smtpd_milters             = inet:localhost:8891
non_smtpd_milters         = inet:localhost:8891

Générer les clés DKIM

Il faut maintenant générer les clés qui serviront à la signature cryptographique des entêtes des messages :

$ opendkim-genkey -t -s mail -d rholala.net

Cette commande va créer 2 fichiers mail.private et mail.txt. Le premier est la clé privée qui sera utilisée par OpenDKIM pour signer les messages, on peut copier celle-ci sous /etc/postfix en la renommant en dkim.rholala.net.key comme dans le fichier de configuration d’OpenDKIM que nous avons modifié au début de ce billet. Le second fichier est l’enregistrement DNS à ajouter, il ressemble à ceci :

mail._domainkey IN      TXT     ( "v=DKIM1; k=rsa; t=y; " "p=MGIfMA0GCD5BouQIDAQAB" ); ----- DKIM key mail for rholala.net

(J’ai volontairement tronqué la chaine commencant par "p=MGI" car elle est très longue.)

Ajout du DNS record

Il faut donc ajouter cet enregistrement dans votre zone, je ne l’explique pas ici car cela dépend du type de gestion DNS que vous utilisez.

Lorsque ceci est fait et après un temps de propagation, vous pouvez tester votre DNS record :

$ dig TXT mail._domainkey.rholala.net

Fin et test de la mise en place de DKIM

Il est temps de démarrer le service DKIM et de l’activer par défaut au démarrage de la machine :

$ sudo systemctl start opendkim
$ sudo systemctl enable opendkim
$ sudo systemctl reload postfix

Lorsque ceci est fait, on peut tester si les messages sortants sont bien signés. Pour ce faire, il suffit de regarder les entêtes des emails envoyés depuis le serveur, par exemple :

Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of postmaster@rholala.net designates 5.196.74.38 as permitted sender) smtp.mailfrom=postmaster@rholala.net;
       dkim=pass (test mode) header.i=@rholala.net
DKIM-Filter: OpenDKIM Filter v2.10.3 erebor.rholala.net 3C6E7112B4FD
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rholala.net; s=mail;

Mais il existe bon nombre d’outils en ligne pour tester ce genre de choses :

Faîtes votre choix!

Résultat Mail Tester
Résultat Mail Tester

Ajouter un enregistrement DNS SPF afin de réduire le risque d’être pris pour un spammer

La norme de vérification Sender Policy Framework (SPF) permet de vérifier qu’un email est bien envoyé d’un serveur gérant le nom de domaine en question. Ce mémo aide à la mise en place d’un enregistrement DNS de type TXT pour le SPF.

SPF est un enregistrement DNS de type TXT qui liste les IP autorisées à envoyer du courrier électronique, ceci afin de réduire les risques de spam liés à une usurpation de l’adresse d’expéditeur.

SPF est donc très simple à mettre en place, il suffit d’avoir accès au paramétrage DNS de votre domaine. Voici par exemple mon enregistrement TXT sur le domaine rholala.net. La messagerie de ce domaine est gérée par Google Apps, mais j’utilise également ce domaine sur mon serveur pour l’envoi de logs et ce genre de choses, donc des courriels en @rholala.net sont envoyés par Postfix.

v=spf1 ip4:5.196.74.38 include:_spf.google.com ~all

 

Que dit-il?

  • v=spf1 : On commence par préciser la version, ici SPF version 1.
  • ip4:5.196.74.38 : Le(s) IP(s) autorisées à envoyer des emails pour le compte du domaine rholala.net, ici en IPv4. A noter qu’il suffit d’ajouter d’autres ip4:xxx.xxx.xxx.xxx séparés par des espaces pour ajouter d’autres machines.
  • include:_spf.google.com : La messagerie du domaine rholala.net est gérée par Google Apps, on indique ici que tout ce qui vient de chez Google est légitime.
  • ~all : Cette dernière partie représente un qualifieur, ici on indique qu’en cas d’échec (si un email envoyé par @rholala.net provient d’une autre source par dans le SPF), le message est accepté, mais estampillé comme sans SPF valide. En général il est reçu mais tombe dans le dossier spam.

Une fois tout ceci mis en place, il est possible de tester son enregistrement SPF grace à des outils comme ceux de mxtoolbox.com ou directement en ligne de commande avec dig :

dig rholala.net txt
rholala.net.            21599   IN      TXT     "v=spf1 ip4:5.196.74.38 include:_spf.google.com ~all"

Ou host :

host -t txt rholala.net
rholala.net descriptive text "v=spf1 ip4:5.196.74.38 include:_spf.google.com ~all"

Les messages qui auparavent tombaient dans le dossier spam arrivent bien en boîte de réception, comme en témoignent les entêtes SMTP :

Received-SPF: pass (google.com: domain of root@rholala.net designates 5.196.74.38 as permitted sender) client-ip=5.196.74.38;

SPF est très simple et rapide à mettre en place et c’est la première étape incontournable si on ne veut pas que le courrier envoyés tombe dans le dossier pourriel de vos destinataires.

Utiliser DNS pour faire une recherche Wikipedia

Découverte du jour originale et intéressante. Mon titre parait loufoque à première vue mais il est possible de faire une recherche sur Wikipedia en ligne de commande via DNS. Plutot cocasse non?

Ceci est un vieux projet de David Leadbeater, celui-ci a mise en place un petit serveur DNS qui retourne le résultat d’une recherche Wikipedia dans un enregistrement de type TXT. A noter que vu la limitation d’UDP on n’obtient qu’un résumé de l’article, mais c’est bien sympatique il faut avouer.

La syntaxe est la suivante en utilisant dig :

dig +short txt <mot-clé>.wp.dg.cx

Avec host c’est la même chose :

host -t txt .wp.dg.cx

On peut mettre cela dans un petit script (que je nomme cwiki) pour faire plus joli :

#!/bin/sh

COLUMNS=`tput cols`
dig +short txt "${1}".wp.dg.cx | sed -e 's/" "//g' -e 's/^"//g' -e 's/"$//g' -e 's/ http:/\n\nhttp:/' | fmt -w $COLUMNS

On interroge :

./cwiki linux

Résultat :

$ ./cwiki.sh linux
Linux ( or ) is a Unix-like computer operating system assembled under the model of free and open source software development and
distribution. The defining component of Linux is the Linux kernel, an operating system kernel first released 5 October 1991 by
Linus Torvalds.

http://en.wikipedia.org/wiki/Linux

DIG par l’exemple

Interrogeons les serveurs DNS

dig est un outil en ligne de commande d’interrogation de serveurs DNS. Il permet d’avoir des renseignements sur tout les types d’enregistrements (NS, A, CNAME, etc) et plus encore. Il n’est pas aisé de trouver des infos sur son fonctionnement et la page de manuel ne comporte aucun exemple. Voici quelques utilisations classiques, mais bien utiles.

Utilisation

L’utilisation de la commande dig est la suivante :

dig @serveur nom type

@serveur : le serveur DNS utilisé pour la requête. nom : le nom du serveur DNS à interroger. type : le type d’enregistrement à vérifier. Mais la forme la plus simple est l’appel de la commande suivi du nom d’hôte à vérifier :

$ dig feub.net

Continue reading « DIG par l’exemple »