DKIM SPF Postfix

De Lea Linux
Aller à la navigation Aller à la recherche


Installation d'une politique de sécurité des emails avec OpenDKIM et SPF

Il devient de plus en plus difficile de délivrer des emails convenablement auprès de ses contacts sans passer par la boite de spam lorsqu'on gère son propre MX. Avant, nous avions une politique de filtre de spam avec des filtres et des listes privées ou publiques. Puis est apparu SPF (Sender Policy Framework) et par la suite DKIM (DomainKeys Identified Mail). D'autres vont venir par la suite, n'en doutant pas...

Nous allons définir les deux les plus connus: DKIM et SPF.

SPF est relativement simple à mettre en activité, il suffit d'une entrée dans le DNS; Pour DKIM, c'est un peu plus compliqué, il faut un service tiers pour le serveur de mail (postfix, sendmail, opensmtpd, etc..), une clef privée et publique et une entrée DNS.

Voyons cela étape par étape:


Installation et configuration d'OpenDKIM

Selon Wikipedia: « DKIM (DomainKeys Identified Mail) est une norme d'authentification fiable du nom de domaine de l'expéditeur d'un courrier électronique.

Elle constitue une protection efficace contre le spam et l'hameçonnage. En effet, DKIM fonctionne par signature cryptographique du corps du message et d'une partie de ses en-têtes.

Une signature DKIM vérifie donc l'authenticité du domaine expéditeur et garantit l'intégrité du message. »

DKIM est utilisé par plusieurs opérateurs de messagerie, comme Google. Elle permet de filtrer les emails valides (ou plutôt les serveurs de mails envoyeurs). Un peu plus complexe que SPF, elle se trouve facilité avec l'outil OpenDKIM.


Installation

Sous Debian/Ubuntu :

apt-get install opendkim

Si vous êtes sous RedHat ou CentOS, vous trouverez aussi le package. D'une manière générale, installez le paquet de votre distribution suivant la méthode habituelle.

En cas de doute, reportez-vous au site d'OpenDKIM : http://opendkim.org.

Génération des clefs publiques/privées

Nous allons préparer le répertoire opendkim. Par défaut, le package opendkim sous debian/ubuntu installe le fichier de configuration dans /etc.

mkdir -p /etc/opendkim/
mv /etc/opendkim.conf /etc/opendkim/
ln -s /etc/opendkim/opendkim.conf /etc/opendkim.conf

Nous allons maintenant générer les clefs qui va être utiliser pour OpenDKIM et votre serveur DNS:

openssl genrsa -out /etc/opendkim/opendkim.key 1024
openssl rsa -in /etc/opendkim/opendkim.key -pubout -out /etc/opendkim/opendkim.pub.key
chmod "u=rw,o=,g=" /etc/opendkim/opendkim.key
chown opendkim:opendkim /etc/opendkim/opendkim.key


Configuration d'OpenDKIM

Editez le fichier /etc/opendkim/opendkim.conf

# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.

# Log to syslog
Syslog                  yes
SyslogSuccess           yes
LogWhy                  yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask                   002

# Sign for example.com with key in /etc/mail/dkim.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
Domain                  lea-linux.org
KeyFile                 /etc/opendkim/opendkim.key
Selector                dkim

# Commonly-used options; the commented-out versions show the defaults.
Canonicalization        simple
Mode                    sv
#SubDomains             no
#ADSPDiscard            no

X-Header                yes

# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier.  From is oversigned by default in the Debian pacakge
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders         From

# List domains to use for RFC 6541 DKIM Authorized Third-Party Signatures
# (ATPS) (experimental)

#ATPSDomains            example.com

Socket                  inet:12345@localhost

# Our KeyTable and SigningTable
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable

# Trusted Hosts
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts

Informations:

L'option "Mode" permet de définir la vérification (v) et la signature des emails (s). Gardez cette option si vous voulez avoir une vérification et un ajout de header DKIM valide et utile pour les autres fournisseurs de messagerie.


Edition du fichier /etc/default/opendkim

Petite édition du fichier /etc/default/opendkim, nous allons définir la socket:

# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=""
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
#SOCKET="local:/var/run/opendkim/opendkim.sock" # default
#SOCKET="inet:54321" # listen on all interfaces on port 54321
SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345

Effectuons un point sur les fichiers présents (ou non) dans votre répertoire /etc/opendkim/:

  • opendkim.conf
  • opendkim.key
  • opendkim.pub.key
  • KeyTable
  • SigningTable
  • TrustedHosts

Les fichiers vous manquant doivent être *KeyTable*, *SigningTable* et *TrustedHosts*. Ne vous inquiétez pas, nous allons maintenant les créer:


KeyTable

Tips: Le selector est le nom défini à la variable "Selector" dans opendkim.conf

# nom de domaine        nom de domaine  selector   fichier clef priv
lea-linux.org                lea-linux.org:dkim:/etc/opendkim/opendkim.key
autre-domaine.fr         autre-domaine.fr:dkim:/etc/opendkim/opendkim.key


SigningTable

*@lea-linux.org              lea-linux.org
*@autre-domaine.fr       autre-domaine.fr


TrustedHosts

127.0.0.1
localhost
lea-linux.org
mail.lea-linux.org
mx.autre-domaine.fr
mail-sortie.autre-domaine.fr


Modification de Postfix

Nous allons rajouter maintenant les quelques lignes pour prendre en compte OpenDKIM lors de l'envoi et la réception des emails:

Dans /etc/postfix/main.cf :

milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12345
non_smtpd_milters = inet:localhost:12345


Modification des DNS

Pour finaliser l'installation d'OpenDKIM et de SPF, il faut maintenant se tourner vers nos DNS. Pour l'exemple ci-dessous, nous nous sommes basés sur l'interface Gandi. Avec un DNS, type Bind9, c'est pratiquement pareil.

N'oubliez pas que la référence à "dkim" dans "dkim._domainkey" est le nom défini dans le fichier de configuration "opendkim.conf" à la variable "Selector". Ne vous trompez pas.

Définissez l'adresse IP de votre MX de sortie à la place de "<MON-IPADDR-DE-SORTIE-MX>" (Attention, si vous avez plusieurs IP sur votre serveur, l'IP a définir ici est celle qui est sur la patte externe, ou dit plus directement: ce sera l'IP visible par les autres MX. Si vous n'avez qu'une adresse IP, oubliez ce message :)

Définissez "p=" avec votre clef publique qui se trouve dans /etc/opendkim/opendkim.pub.key. Ne prenez que le contenu entre "-----BEGIN PUBLIC KEY-----" et "-----END PUBLIC KEY-----" et mettez le tout sur une ligne. Puis intégrez-là dans votre entrée DNS dédiée.

Notez que vous pouvez utiliser l'outil "opendkim-genkey" (package opendkim-tools) pour générer la clef et un fichier comprenant le code DNS déjà tout intégré (opendkim-genkey -t -s dkim -d lea-linux.org)

Voici un extrait des entrées DNS :

mail 1000 IN A <MON-IPADDR-DE-SORTIE-MX>
@ 10800 IN MX 10 mail
@ 10800 IN SPF "v=spf1 a ip4:<MON-IPADDR-DE-SORTIE-MX> mx include:_spf.google.com ?all"
@ 10800 IN TXT "v=spf1 a ip4:<MON-IPADDR-DE-SORTIE-MX> mx include:_spf.google.com ?all"
dkim._domainkey 1000 IN TXT "v=DKIM1; k=rsa; t=y;  p=<VOTRE CLEF OPENDKIM __PUBLIQUE__>;"

Pour résumer la ligne SPF: Nous définissons que l'ip4 défini, les MX du domaine et la liste spf de google sont valides pour ce domaine.

SPF est assez complexe, il faudrait un tutoriel rien que pour lui, nous vous conseillons de lire les documentations conseillées à ce sujet:

Sauvegardez le tout, redémarrez les services postfix et opendkim. Nous allons maintenant effectuer des tests.


Tests DNS

Vérifions si nos entrées sont bien prises en compte :

Vérifications DKIM :

$ dig dkim._domainkey.lea-linux.org TXT | grep ^dkim
dkim._domainkey.lea-linux.org. 990	IN	TXT	"k=rsa\; p=****************************************************************\;"

Vérifications SPF:

$ dig lea-linux.org TXT |grep spf
lea-linux.org.     686   IN   TXT   "v=spf1 a ip4:********** mx include:_spf.google.com ?all"

$ dig lea-linux.org SPF
lea-linux.org.   10800   IN   SPF   "v=spf1 a ip4:********** mx include:_spf.google.com ?all"

Si vous voyez ces entrées, c'est que tout se passe bien.

Note: Chez un prestataire comme Gandi, la prise en compte des modifications peut prendre du temps. Si au bout de 2h, il ne se passe toujours rien, revenez sur l'interface de votre prestataire et vérifiez si vous n'avez pas oublié un détail.

Pour tester SPF et DKIM

Il existe quelques outils en ligne pouvant vous aider à valider votre nouvelle configuration, voici les principaux et très utiles:

Et si vous envoyez un mail depuis votre serveur vers une adresse externe (gmail par exemple), regardez les headers, vous verrez :

Received-SPF: pass (google.com: domain of votremail@votredomaine designates votre_ip_serveur_mx as permitted sender) client-ip=votre_ip_serveur_mx;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of votreemail@votredomaine designates votre_ip_serveur_mx as permitted sender) smtp.mail=votreemail@votredomaine;
       dkim=pass header.i=@votredomaine
X-DKIM: OpenDKIM Filter v2.6.8 votredomaine 2310FDC8FED
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=votredomaine; s=dkim;
	t=1428582153; bh=**********************************=;
	h=Date:From:To:Subject:From;
	b=*****************************************************************=

Si vous passez par mail-tester.com, vous devriez voir ce magnifique message :

Félicitations et bienvenue dans le monde authentifié des mails :-)


Note: Vous remarquez peut-être la ligne "Vous n'êtes pas parfaitement authentifié". C'est parce que nous n'avons pas défini de paramètre pour DMARC. Ce n'est pas très grave. Si vous voulez être (presque) parfait, vous pouvez rajouter, en attendant, dans vos DNS.:

_dmarc 1000 IN TXT "v=DMARC1; p=none"

Cela désactivera les vérifications DMARC.


Update:

Si vous recevez un mail de Outlook.com (live.com, hotmail.com, ...) pour vous indiquer que l'adresse IP de votre serveur se trouve dans leur blacklist, utilisez cette adresse: Support MX Outlook.com et remplissez le formulaire avec le plus d'informations possibles. Vous aurez une réponse d'ici quelques heures et si cela est positif un deblacklistage "modéré".

Sécurité TLS/SSL renforcée

Pour rajouter (un peu) en sécurité :

# Paramètre TLS
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtpd_tls_loglevel = 6
smtpd_tls_received_header = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
tls_random_source = dev:/dev/urandom
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# Certificat et clé (possibilité de rajouter avec CA pour plus de sécurité)
smtpd_enforce_tls = no
smtpd_tls_loglevel = 2
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/postfix/ssl/postfix.key
smtpd_tls_cert_file = /etc/postfix/ssl/postfix.crt

# Désactivation de certains algorithmes ou procédés
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtp_tls_exclude_ciphers = aNULL, DES, RC4, MD5
smtpd_tls_exclude_ciphers = aNULL, DES, RC4, MD5
smtp_tls_mandatory_exclude_ciphers = aNULL, DES, RC4, MD5
smtpd_tls_mandatory_exclude_ciphers = aNULL, DES, RC4, MD5

Il ne vous reste plus qu'à vérifier avec STARTTLS.info

Note très importante concernant la 'Désactivation de certains algorithmes': Comme le faisait remarquer [Aeris] sur Twitter, le fait de désactiver certains ciphers risquent de provoquer des fallbacks et vos données passeront en clair par défaut. La dernière partie - Désactivation de certains algorithmes ou procédés - est donc à prendre avec des pincettes, voire à ne pas appliquer si vous ne savez pas ce que vous faites ou bien vous ayez un doute, même minime.



@ Retour à la rubrique Réseau et sécurité

Copyright

© 2015 Léa-Linux

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/