« DKIM Proxy » : différence entre les versions

De NCad Wiki
Aller à la navigation Aller à la recherche
Ligne 418 : Ligne 418 :
     FREEMAIL_FROM=0.001, GTUBE=1000, HTML_MESSAGE=0.001,
     FREEMAIL_FROM=0.001, GTUBE=1000, HTML_MESSAGE=0.001,
     NML_ADSP_CUSTOM_MED=1.2, RCVD_IN_DNSWL_LOW=-0.7,
     NML_ADSP_CUSTOM_MED=1.2, RCVD_IN_DNSWL_LOW=-0.7,
     TVD_SPACE_RATIO=0.001, T_DKIM_INVALID=0.01] autolearn=no
     TVD_SPACE_RATIO=0.001, <span style="color:blue">T_DKIM_INVALID=0.01</span>] autolearn=no


[[Category:Serveur de Messagerie]]
[[Category:Serveur de Messagerie]]

Version du 6 juillet 2014 à 13:33

.:[ Serveur de Messagerie ]:.

Installation >> Postfix avec MySQL

Filtrage anti-spam : Anti-Spam SpamAssassin | Anti-Virus Clamav


Filtrage anti-virus : Plateforme de filtrage Amavis >> Amavis avec MySQL


Plus de fonctions : Ajouter un Disclaimer | Signature DKIM | Mailman | Maildrop


Clients de messagerie : Configurer Thundirbird | Configurer Roundcube


Pour aller plus loin : Commandes messagerie | DNSBL | MX Backup

Cet {{{1}}} est en cours de rédaction.

Présentation

Architecture

Installation

Dépendances

  • Les dépendances suivantes sont nécessaires pour la compilation du programme :

apt-get install libmail-dkim-perl build-essential gcc

  • Connexion au shell Perl pour l'installation des modules Perl Error, Net::Server et Mail::DKIM :

perl -MCPAN -e shell


Lors de la première connexion un assistance se lance automatiquement. Valider les réponses par défaut et le shell se mettra à jour (paquets, dépôts et dépendances). Relancez le shell perl une fois la mise à jour terminée.

  • Installation du module Perl Error :

install Error

  • Installation du module Perl Net::Server :

install Net::Server

  • Installation du module Perl Mail::DKIM :

install Mail::DKIM

Préparation

  • Le service sera installé sous le répertoire racine OPTionnel :

cd /opt

  • Dans ce répertoire on va créer le dossier dkimproxy qui contiendra le programme finale :

mkdir dkimproxy

  • On va également créer l'utilisateur UNIX dkim :

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

Compilation

  • Téléchargement des sources depuis le site du développeur dans la racine /opt/ :

wget http://downloads.sourceforge.net/dkimproxy/dkimproxy-1.4.1.tar.gz


Vérifiez la dernière version à disposition depuis le site du développeur à l'adresse http://dkimproxy.sourceforge.net/
  • Dépaquetage des sources précédement téléchargées :

tar -xzvf dkimproxy-1.4.1.tar.gz

  • On se place dans le répertoire des sources de DKIM Proxy :

cd dkimproxy-1.4.1

  • On lance le script de configuration. Si toutes les dépendances sont satisfaites, aucune erreur ne doit être retournée :

./configure --prefix /opt/dkimproxy


le paramètre --prefix est obligatoire et indique au script de configuration dans quel répertoire se situera le script final dkimproxy.
  • On procède à la compilation et à l'installation de dkimproxy :

make install

  • On place une copie du script de démarrage et d'arrêt fournit depuis les sources dans le répertoire d'exécution /etc/init.d/ :

cp /opt/dkimproxy-1.4.1/sample-dkim-init-script.sh /etc/init.d/dkimproxy

Génération des clés

  • On va créer le dossier keys dans le dossier /opt/dkimproxy/etc/. Ce dossier contiendra la clé privée et la clé publique pour signer / vérifier les messages soumis à dkim proxy :

mkdir /opt/dkimproxy/etc/keys

  • On se place dans ce nouveau dossier pour y générer nos clés privé et publique à l'aide d'OpenSSL :

cd /opt/dkimproxy/etc/keys

  • On génère la clé privée :

openssl genrsa -out private.key 1024

  • Ainsi que la clé publique :

openssl rsa -in private.key -out public.key -pubout -outform PEM

  • On applique les droits et permissions en lecture/écriture pour l'utilisateur dkim :

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

Configuration des messages sortants

Fichier de configuration de base

  • Le fichier /opt/dkimproxy/etc/dkimproxy_out.conf permet de configurer la signature des messages sortants. On fait une copie du fichier de configuration fournit par défaut /opt/dkimproxy/etc/dkimproxy_out.conf.example en /opt/dkimproxy/etc/dkimproxy_out.conf :

cp /opt/dkimproxy/etc/dkimproxy_out.conf.example /opt/dkimproxy/etc/dkimproxy_out.conf

  • Ce fichier contient les paramètres du relayage SMTP (informations de connexion à Postfix) ainsi que les informations nécessaires à la signature des messages destinés à être envoyés :
# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10027

# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10028
  • D'après les lignes ci-dessus, Postfix soumettra les messages à signer à DKIM Proxy sur le port 10027 depuis son IP local (cas où Postfix et DKIM Proxy sont installé sur la même machine). Une fois signés, les messages seront retournés à Postfix sur le port 10028. Il faudra que Postfix écoute sur ce port.
  • Si on se connecte à dkimproxy depuis le port 10027 en local, la connexion est fermée au bout de quelques secondes :

telnet 127.0.0.1 10027
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
421 Internal error (Next hop is down)
Connection closed by foreign host.


La connexion est interrompue pour avec pour raison : Next hop is down. En d'autres termes, dkimproxy n'est pas parvenu à se connecter à Postfix. Dkimproxy est avant tout un proxy et à ce titre il renvoi les requêtes qui lui sont soumises à Postfix.

Configuration de Postfix

  • Avant toutes choses, dkimproxy dépend de Postfix. C'est donc pour cette raison qu'il faut éditer les règles de routage de Postfix pour qu'ils soumettent les messages à envoyer à dkimproxy afin qu'ils soient signés.
  • Le serveur Postfix dispose d'une connexion authentifiée pour les envois de courriels et écoute sur le port 587. C'est sur ce connecteur de sortie que vont être envoyés les messages à dkimproxy pour être signés. Pour cela, nous allons configurer le module submission qui est spécifique à cette tâche :
submission inet n - - - - smtpd
 -o receive_override_options=no_address_mappings
 -o content_filter=dksign:[127.0.0.1]:10027
 -o smtpd_tls_security_level=may
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,permit_mynetworks,reject
  • Dans la ligne content_filter on retrouve bien l'IP du service dkimproxy (ici localhost puisque installé sur la même machine que Postfix) ainsi que le port d'écoute. Il faut à présent renseigner le module dksign qui indique comment traiter le message dans la file :
dksign  unix     -       -       n       -       4       smtp
 -o smtp_send_xforward_command=yes
 -o smtp_discard_ehlo_keywords=8bitmime,starttls
  • Les informations sur le client pour les messages soumis à dkimproxy ne doivent pas être modifiées (nom et IP) ensuite on indique que les échanges doivent être chiffrés. Maintenant, il faut que Postfix écoute sur le port 10028 pour pouvoir récupérer les messages signés et les envoyer au destinataire :
127.0.0.1:10028 inet n - n - 10 smtpd
 -o content_filter=
 -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o mynetworks=127.0.0.0/8
  • Les règles smtpd_recipient_restrictions évitent que Postfix soit en relai ouvert sur le port 10028. Ici il écoute en local donc ce n'est pas obligatoire mais si Postfix est sur une machine différente de dkimproxy cela devient essentiel.
  • Pour appliquer les changements, il suffit de recharger Postfix :

service postfix reload

  • Cette fois-ci, si on se connecter à dkimproxy sur le port 10027, on doit recevoir le message de bienvenu du serveur Postfix :

telnet 127.0.0.1 10027
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 geocoucou.net.ncad.fr ESMTP Postfix

Signer tous les messages quelques soit le domaine

  • Dans ce premier cas de configuration, le serveur proxy dkimproxy devra signer tous les messages sans distinction du nom de domaine de messagerie. Dans notre exemple, notre serveur de messagerie gère les domaines de messagerie geocoucou.eu, ncad.fr et cachelou.fr.
  • Toujours dans le fichier /opt/dkimproxy/etc/dkimproxy_out.conf, on va indiquer le domaine de messagerie du serveur Postfix qui est dans notre cas geocoucou.eu :
domain    geocoucou.eu
  • On signe les messages avec DomainKeys et DKIM :
signature dkim(c=relaxed)
signature domainkeys(c=nofws)
  • On va indiquer l'emplacement de la clé privé pour procéder à la signature des messages :
keyfile   /opt/dkimproxy/etc/keys/private.key
  • On remarquera la valeur du paramètre selector à postfix qui sera important dans la configuration du DNS :
selector  postfix

  • On démarre dkimproxy :

service dkimproxy start

Pour mieux comprendre
  • Nous allons étudier le comportement de dkimproxy en effectuant deux tests d'envois. Le premier sera avec une adresse de messagerie se terminant par @geocoucou.eu et la seconde en @cachelou.fr.
  • On envoi un mail à partir de cacheln@geocoucou.eu et on observe dans /var/log/mail.log le comportement de dkimproxy :
Jul  5 01:20:01 coyotte dkimproxy.out[13438]: DKIM signing - signed; message-id= 
<be3cc1aa63343d7c1175bae8771cd24f@geocoucou.eu>, signer=<cacheln@geocoucou.eu>, from=
<cacheln@geocoucou.eu>
  • Le mail a été signé par dkimproxy. On peut également le constater dans les en-têtes mails :
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=geocoucou.eu; h=
  mime-version:content-type:date:from:to:subject:message-id; s=
  postfix; bh=DswaGNF6Ys163qqLTy/Rb1PgwQ4=; b=n6Gor/6CacHCwSAW1BlO
  oVoYZ+f3oGyiUPg7CME8pPlICGNtNb1kpL/3jYAdLHRe6bmNdHYRwZymo/uorECJ
  KU4zsoMw+yCWYoZsQuEwvBWEbP5Yg7SOTeL6nJIkHFjQLgN6eTyINJiRtikfr6qb
  gfnnsSlOGj/xtOcxZo9u2Qo=

DomainKey-Signature: a=rsa-sha1; c=nofws; d=geocoucou.eu; h=mime-version
  :content-type:date:from:to:subject:message-id; q=dns; s=postfix; b=
  lbTqsJ0aB+q6/3fhPI0KujK3jTKbVRRoVEW+ieqV2rbZ1I9b7fGl2a90dtKawcNZ
  OanlbroaVMlCRlUZZFF/LhqmFdoJHa0FszkC9Jf8akcNBlQ7oNBXgyRckpenzFmZ
  jlpHKFhgbSPCbdWy8hwehHo2I7SFEicseVdpCD6J3zY=
  • Maintenant, on va envoyer un mail à partir de nicolas@cachelou.fr et on observe dans /var/log/mail.log le comportement de dkimproxy :
Jul  5 01:25:48 coyotte dkimproxy.out[13439]: DKIM signing - signed; message-id=
<6b238567bb2bc1b0725bf4e86015c28b@geocoucou.eu>, signer=<@geocoucou.eu>, from=
<nicolas@cachelou.fr>
  • Le mail a été également signé par dkimproxy. On peut également le constater dans les en-têtes mails :
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=geocoucou.eu; h=
  mime-version:content-type:date:from:to:subject:message-id; s=
  postfix; bh=zyYAr5rgDCRi7dLRvfScsHfHqgU=; b=UdI/pTKvge07+gAuVybE
  Tn0CYL3v4un7QQ/BIZpCxLiVZ/dx3BEFgdlhRal1l5+Hvn2C7DOjdJvMS5VT+5Qi
  FUv0OhHAJfGdd3eFL3qBRXlcqYkI9PpnbpyjQffcgXmOXvL/uVUnsj88BGdtztfK
  JuGgRwoPzwomT6269WNsMLo=
On remarquera que dans ce cas de configuration, la signature du message envoyé depuis le domaine @cachelou.fr porte la signature du domaine geocoucou.eu.

Signer les messages pour les domaines sélectionnés

  • Cette fois-ci nous allons signer les messages des domaines de messagerie @geocoucou.eu et @cachelou.fr. Si des messages se présentent avec d'autres domaines, ils ne seront pas signés.
  • Il faudra tout d'abord déclarer les domaines à signer dans le paramètre domain du fichier de configuration /opt/dkimproxy/etc/dkimproxy_out.conf :
domain geocoucou.eu,cachelou.fr
  • Ensuite, il faudra commenter les lignes suivantes :
#signature dkim(c=relaxed)
#signature domainkeys(c=nofws)
#keyfile   /opt/dkimproxy/etc/keys/private.key
  • On remarquera la valeur du paramètre selector à postfix qui sera important dans la configuration du DNS :
selector  postfix
  • Nous allons mapper les paramètres de configuration de la signature DKIM en fonction du nom de domaine de messagerie. Pour cela, nous indiqueront le chemin du fichier ou se trouvera la table de correspondance nom de domaine et paramètres de signature :
sender_map /opt/dkimproxy/etc/sender_map
  • Nous allons donc créer le fichier /opt/dkimproxy/etc/sender_map et y inscrire les données suivantes :
geocoucou.eu dkim(s=postfix,d=geocoucou.eu,c=simple,a=rsa-sha256,key=/opt/dkimproxy/etc/keys/private.key), domainkeys(c=nofws,s=postfix,key=/opt/dkimproxy/etc/keys/private.key)
cachelou.fr dkim(s=postfix,d=cachelou.fr,c=relaxed,a=rsa-sha256,key=/opt/dkimproxy/etc/keys/private.key), domainkeys(c=nofws,s=postfix,key=/opt/dkimproxy/etc/keys/private.key)

Nous inscrivons les paramètres de signatures DKIM pour les deux noms de domaine geocoucou.eu et cachelou.fr. Un nom de domaine par ligne.

  • On redémarre dkimproxy pour appliquer les changements :

service dkimproxy restart

Pour mieux comprendre
  • Nous allons étudier le comportement de dkimproxy en effectuant trois tests d'envois. Le premier sera avec une adresse de messagerie se terminant par @geocoucou.eu, la seconde en @cachelou.fr et la dernière avec @ncad.fr.
  • On envoi un mail à partir de cacheln@geocoucou.eu et on observe dans /var/log/mail.log le comportement de dkimproxy :
Jul  5 01:46:49 coyotte dkimproxy.out[13494]: DKIM signing - signed; message-id=
<e4208652d46a7605ae5e0d2d52ec1807@geocoucou.eu>, signer=<@geocoucou.eu>, from=
<cacheln@geocoucou.eu>
  • Le mail a été signé par dkimproxy. On peut également le constater dans les en-têtes mails :
DKIM-Signature: v=1; a=rsa-sha256; c=simple;  d=geocoucou.eu; h=
  mime-version:content-type:date:from:to:subject:message-id; s=
  postfix; bh=GlSsmbMLgIxjZrrG2KTJ7//MOo4afRUxQ4LTIccq6mM=; b=jpRj
  tV+5gHoQsnnpuY22xaEYyYKCDLSvzylk/3hqTDc5TDlpmBQndj+SURnu4yy1syhh
  4aDSuyAljt6XvF8S/0iCxCtoT8VjosLygsFYOoe3+Uw//eJNwAD+42Jko9fegfqV
  ckz2kwt7Q5mXFw2p0kDQFAuiSau+UztYVsThiNs=
  • Maintenant, on va envoyer un mail à partir de nicolas@cachelou.fr et on observe dans /var/log/mail.log le comportement de dkimproxy :
Jul  5 01:51:41 coyotte dkimproxy.out[13495]: DKIM signing - signed; message-id= 
<f8f9e7d1b3724a1c9455aaabb39d9c7b@geocoucou.eu>, signer=<@cachelou.fr>, from=
<nicolas@cachelou.fr>
  • Le mail a été également signé par dkimproxy. On peut également le constater dans les en-têtes mails :
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=cachelou.fr; h=
  mime-version:content-type:date:from:to:subject:message-id; s=
  postfix; bh=t6ZXYeN8uK0dNkiNRU0tJOuHhnWkswDb3IIT3w3mZSc=; b=XK5X
  eK3naXGY24vpnkJCvn6U4qS+Pel7DOGuFDi2/MR2wUwlUysrmQcdyrEZFG57ZCv7
  XqPhIE+j3ld0FmgW3IV0wi6cUO3Pj/hytWkaZxoGx5KwUJ9fOvKiOO5Cl7xwtE2w
  si+iW+ZEJS8nOtRioioAjCkBaBiaqG5dSZxQRPA=
On remarquera que cette fois-ci le nom du domaine inscrit dans le paramètre d de la signature DKIM est bien respecté.
  • On effectue le troisième et dernier teste avec l'adresse tech@ncad.fr dont le domaine n'a pas été déclaré dans la configuration de dkimproxy :
Jul  5 02:03:29 coyotte dkimproxy.out[13498]: DKIM signing - skipped; message-id=
<f90f97a9d1f263d3a370a5a1de2796b8@geocoucou.eu>, from=<tech@ncad.fr>
Le message n'a pas été signé et dans le mail on ne remarque aucune en-tête DKIM-Signature.

Configuration DNS

  • Bien que les messages soient signés, il faut que le destinataire puisse vérifier cette signature. Pour cela, il va falloir ajouter des enregistrements DNS sur le nom de domaine et communiquer la clé publique par cet intermédiaire. Pour la configuration DNS on prendra pour exemple d'illustration le nom de domaine geocoucou.eu.
  • Dans la zone, il faudra créer deux enregistrements DNS de type TXT :
_domainkey     IN TXT "k=rsa; t=s; o=-;"
postfix._domainkey IN TXT "k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOoiiQ8nyId0Liww7goJZJyJoIn7ddCtNdQWSi2SeWDBzFZQQGQQ3Ub3ie2mJwUWuZQJwn409cfhENtICxLSA0UXxWCp5Rpzj+y4AJqvRqh85PIQo5YofauH1IH5+TNunhhCH5PE42Iqs5iNFvWYK+2hJ+n5CSXoNmAy2sxih8xQIDAQAB"
  • La chaîne de caractères en bleu correspond à la valeur affectée au paramètre selector dans /opt/dkimproxy/etc/dkimproxy_out.conf et la chaîne de caractères rouge correspond à la clé privée contenu dans le fichier /opt/dkimproxy/etc/keys/public.key.

Vérification des signatures

  • dkimproxy est passif : il ne prendra aucun décision en cas de signature absente, invalide ou valide. Il se contente juste de taguer l'état de la signature lorsque le mail lui est présenté.

Fichier de configuration de base

  • Le fichier /opt/dkimproxy/etc/dkimproxy_in.conf permet d'indiquer les options de configuration d'écoute et de relayage des mails entrant à vérifier. Pour cela, nous allons d'abord copier le fichier de configuration fournit par défaut /opt/dkimproxy/etc/dkimproxy_out.conf.example en /opt/dkimproxy/etc/dkimproxy_out.conf :

cp /opt/dkimproxy/etc/dkimproxy_in.conf.example /opt/dkimproxy/etc/dkimproxy_in.conf

  • Ce fichier contient uniquement les paramètres du relayage SMTP (informations de connexion à Postfix) :
# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10025

# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10026

Les messages reçus par Postfix sont relayés à dkimproxy via le port 10025. Après analyse, dkimproxy transmet le message avec le résultat de l'analyse à Postfix sur le port 10026.

  • Si on se connecte à dkimproxy depuis le port 10025 en local, la connexion est fermée au bout de quelques secondes :

telnet 127.0.0.1 10025
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
421 Internal error (Next hop is down)
Connection closed by foreign host.


La connexion est interrompue pour avec pour raison : Next hop is down. En d'autres termes, dkimproxy n'est pas parvenu à se connecter à Postfix. Dkimproxy est avant tout un proxy et à ce titre il renvoi les requêtes qui lui sont soumises à Postfix.

Configuration de Postfix

  • Postfix reçoit les messages en provenance d'Internet depuis le protocole SMTP sur le port 25 qui sont traités par le module smtpd. Dans le fichier /etc/postfix/master.cf nous allons définir un filtre sur le module smtpd pour rediriger les messages entrants vers dkimproxy sur le port 10025 :
smtp inet n - - - - smtpd
  -o smtpd_proxy_filter=127.0.0.1:10025
  • Il faut que Postfix puisse recevoir le résultat de l'analyse des messages par dkimproxy. dkimproxy transmet ce résultat à Postfix sur le port 10026. Il va donc falloir renseigner le port d'écoute 10026 sur Postfix toujours dans le fichier /etc/postfix/master.cf :
127.0.0.1:10026 inet n - n - 10 smtpd
  -o content_filter=
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -o receive_override_options=no_unknown_recipient_checks
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  • On recharge la configuration de Postfix pour appliquer les nouveaux paramètres :

service postfix reload

  • Cette fois-ci, si on se connecter à dkimproxy sur le port 10025, on doit recevoir le message de bienvenu du serveur Postfix :

telnet 127.0.0.1 10025
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 geocoucou.net.ncad.fr ESMTP Postfix

Vérification de la configuration

  • Si dkimproxy vérifie bien la présence de la signature DKIM et son intégrité, une en-tête mail est ajoutée avec l'état de la dite signature. Pour valider le fonctionnement nous allons nous envoyer un mail depuis une boîte mail publique et observer ce qui se passe dans le fichier de logs /var/log/mail.log :
Jul  6 12:33:35 coyotte dkimproxy.in[17191]: DKIM verify - none; message-id=<COL131-
W687267D8CB64DB9A750C31B4020@phx.gbl>, sender=<hotmail_decd1eb1c05fe690@live.com>
  • D'après la trace ci-dessus, le message provient d'une boîte Microsoft Outlook dont le message n'a pas été signé. Dans les en-têtes du mail on retrouve l'en-tête ajoutée par dkimproxy suite à son analyse :
X-DKIM-Authentication-Results: none

Brouillons

SpamAssassin

/etc/spamassassin/local.cf

loadplugin Mail::SpamAssassin::Plugin::DKIM

Amavis

/etc/amavis/conf.d/50-user

$enable_dkim_verification = 1;
X-Spam-Flag: YES
X-Spam-Score: 1000.614
X-Spam-Level: ****************************************************************
X-Spam-Status: Yes, score=1000.614 tagged_above=3 required=5
   tests=[DKIM_ADSP_CUSTOM_MED=0.001, DKIM_SIGNED=0.1,
   FREEMAIL_FROM=0.001, GTUBE=1000, HTML_MESSAGE=0.001,
   NML_ADSP_CUSTOM_MED=1.2, RCVD_IN_DNSWL_LOW=-0.7,
   TVD_SPACE_RATIO=0.001, T_DKIM_INVALID=0.01] autolearn=no

Liens