SysFailure

Imprimer

DomainKeys, DKIM - DKIM et le DNS

.

Utilisation du DNS pour la diffusion des clés

Les serveurs de messagerie devant vérifier les signatures DK/DKIM doivent pouvoir trouver les clés publiques de signature (dont la clé privée est connue des seuls serveurs d'émission du domaine concerné). La méthode préférée de diffusion de ces clés est, aujourd'hui, le DNS. Cela n'exclut pas d'autres méthodes à l'avenir.

Un domaine décidant de signer les messages qu'il émet à l'aide de DK/DKIM doit ajouter des informations dans sa zone DNS, sous la forme d'un ou plusieurs enregistrements de type TXT. Il est important de comprendre comment les messages sont signés, et donc ce que le serveur de réception va chercher dans le DNS.

La signature DKIM est ajoutée au message, dans un en-tête spécifique :

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=gamma;
h=domainkey-signature:received:received:message-id:date:from:to
:subject:mime-version:content-type:content-transfer-encoding
:content-disposition;
bh=60eiBOZBcZ9GHQqczvh+/sKgg7vU3F2W0i4exrSEIxk=;
b=M0fV6KNncg6fZjZPZxej7wnRwgcmyACn7nPLcLi+Cujo+J+G67mx5at9WrO1Fw/ZqO
1mNFpVCrsNtVPAdnt1ZZtxfAl8ZXyzPTcEmBh/S4EBLe5s+jkePrj2uYnvFMNDEyATrb
g4fGHf0bqdPkBqZTCDONHBOXiIX52xay2Lje4=

Nous détaillons plus loin la signification des différents champs de cet en-tête. Dans l'exemple ci-dessus, et par rapport à la distribution des clés, deux champs (en gras) sont importants :

  • le champ d, qui permet de déterminer le domaine à interroger, et
  • le champ s, qui indique le sélecteur utilisé pour la signature.

Le serveur de réception du message doit chercher l'enregistrement TXT nommé selecteur._domainkey.domaine. Pour l'exemple ci-dessus, ce sera gamma._domainkey.gmail.com :

$ dig +short gamma._domainkey.gmail.com txt
"k=rsa\; t=y\; p=MIGfMA0GCSqGSIb3 [...] YA+OwSMWQIDAQAB"

Nous avons abrégé le champ p pour améliorer la mise en page.

Diffusion des clés publiques

Le sélecteur est simplement l'identifiant d'une bi-clé. La clé privée est gardée soigneusement par les serveurs d'émission du domaine. La clé publique est diffusée dans le DNS et associée à une ressource portant le nom du sélecteur.

La clé publique associée à un sélecteur doit être placée dans un enregistrement TXT du domaine signataire, dans le sous-domaine nommé _domainkey. Comme nous l'avons indiqué ci-dessus, l'enregistrement doit être nommé sélecteur._domainkey.domaine-signataire. Il n'y a aucune restriction sur le nombre de sélecteurs que l'on peut utiliser, au-delà de la règle un sélecteur = un enregistrement TXT. Par exemple, Google utilise au moins deux sélecteurs différents (béta et gamma) :

$ dig +short alpha._domainkey.gmail.com txt
$ dig +short beta._domainkey.gmail.com txt
"t=y\; k=rsa\; p=MIGfMA0G [...] 8uQIDAQAB"
$ dig +short gamma._domainkey.gmail.com txt
"k=rsa\; t=y\; p=MIGfMA0G [...] MWQIDAQAB"
$ dig +short delta._domainkey.gmail.com txt

Sur l'un de nos domaine, nous n'en n'utilisons qu'un seul :

$ dig +short testdk._domainkey.ba-cst.net txt
"v=DKIM1\; t=y\; g=*\; k=rsa\; p=MIGfMA [...] bkQIDAQAB"

Les différents champs utilisables, et leur signification, sont (par ordre alphabétique) :

  • g : la granularité de la clé. Définit l'applicabilité de la clé par rapport au nom local de l'émetteur (partie avant le caractère @ de l'adresse électronique de l'émetteur).
  • h : les algorithmes de hachage utilisables, séparés par un caractère : (sha1:sha256:md5:mon-algorithme). Actuellement, seuls sha1 et sha256 sont reconnus et utilisables. Par défaut (absence de ce champ), tous les algorithmes de hachage reconnus sont inclus.
  • k : le type de la clé. Actuellement, seul rsa est utilisable.
  • n : un commentaire libre. Du fait des restrictions liées à la taille d'un enregistrement DNS sur UDP, ce champ (s'il est utilisé) doit être particulièrement concis. Il n'est pas destiné aux utilisateurs mais aux administrateurs de messagerie.
  • p : la clé publique associée au sélecteur, codée en Base64. Ce champ est obligatoire, pour une raison évidente.
  • s : le type de service associé à ce sélecteur. Une liste de mots-clés séparés par le caractère :. Actuellement, seuls les mots-clés email et * (tous les services) sont définis.
  • t : un ensemble d'indicateurs d'état, séparés par le caractère : (deux points), pour l'utilisation de DKIM par le signataire. L'indicateur y signifie que DKIM est en test par le signataire. L'indicateur s signifie que le domaine du signataire et le domaine de l'émetteur doivent être strictement identique (pas de sous-domaines).
  • v : la version de DKIM utilisée. Champ optionnel. S'il est présent, il doit être le premier dans la liste des champs, et il doit valoir DKIM1.

Granularité d'une clé (g=XXX)

La granularité d'une clé de signature permet de définir qui peut utiliser cette clé pour signer ses messages. Par défaut, la granularité est nulle : n'importe quelle adresse d'émetteur du domaine concerné peut voir ses messages signés avec la clé en question. Mais il est possible de restreindre l'utilisation de la clé à certains utilisateurs seulement.

Imaginons par exemple qu'une société a mis en place un service de support pour ses clients. Tous les collaborateur de ce service ont des adresses électroniques de la forme support-prenom AT societe.fr. La société peut alors créer une clé DKIM spécifique au service support (avec un sélecteur particulier, par exemple support) et en plus indiquer que cette clé ne s'applique qu'aux adresses électroniques de la forme support-xxxx AT societe.fr. Cela se fera simplement :

$ dig +short support._domainkey.societe.fr txt
"v=DKIM1\; t=y\; g=support-*\; k=rsa\; p=a[...]k"

A la réception, la signature ne pourra être validée qu'à la condition que l'adresse d'émetteur du message soit de la forme support-* AT societe.fr. Ce contrôle est réalisé sur le champ i de la signature DKIM insérée dans le message.

Type de service (s=xxx)

Ce champ est une anticipation d'une éventuelle extension de DKIM pour signer d'autres éléments que des messages électroniques. Il n'est pas utile actuellement. Toutefois, s'il est utilisé, le destinataire doit s'assurer que l'élément pour lequel il vérifie la signature correspond bien au service indiqué par le champ s.

DKIM n'étant aujourd'hui utilisé que pour signer des messages électroniques, les valeurs s=* ou s=email sont théoriquement équivalentes. Pour éviter les écueils toujours possibles avec certaines mises en oeuvre, nous vous conseillons de ne pas utiliser ce champ.