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

Dovecot deliver comme LDA et Sieve / Pigeonhole

Pour remettre un message localement dans le bon répertoire de la bonne boîte aux lettres, un système de messagerie utilise un LDA (Local Delivery Agent). Le MTA (Mail Transfer Agent) Postfix est souvent utilisé pour cette tache par l’intermédiaire de son daemon virtual qui fait exactement cette tache, sans fioritures. C’est lorsque l’on veut un peu plus de fonctionnalités et de souplesse qu’il est intéressant de changer de LDA, dans ce tutoriel ce sera pour celui de Dovecot que nous connaissons déjà pour avoir mis en œuvre un serveur complet de messagerie basé sur Postfix et Dovecot. Le LDA de Dovecot se nomme deliver et la prochaine étape de ce tutoriel consistera à modifier notre configuration pour l’utiliser.

Continue reading « Dovecot deliver comme LDA et Sieve / Pigeonhole »

Installation et configuration d’un serveur de messagerie simple avec Postfix et Dovecot

Ce tutoriel aide à l’installation et la configuration d’un serveur de messagerie SMTP et IMAP basé sur Postfix et Dovecot.

Par serveur simple, j’entends par là, pas de SSL, de MySQL et de fonctions avancées. Ces fonctions viendront par la suite dans de prochains articles. La solution proposée est à base de Postfix pour le MTA et Dovecot comme serveur IMAP.

Il gérera des boîtes aux lettres virtuelles – c’est-à-dire indépendantes des comptes systèmes – d’autant d’utilisateurs et de domaines que ce soit.

Pour la suite des opérations, la machine utilisée est sous Fedora, le tutoriel pourra donc convenir aux utilisateurs de CentOS et de Red Hat. On supposera qu’elle s’appelle monhostname.local.mondomaine.net. C’est parti ^.^



Postfix

L’installation se fait naturellement avec yum :

# yum install postfix

Afin de préparer le terrain, il faut créer l’arborescence qui accueillera les boîtes aux lettres virtuelles et l’utilisateur/groupe de celles-ci. Pour ce faire, ajouter un utilisateur vmail et un groupe du même nom ayant tout deux des uid et gid non réservés, par exemple 6000. Le home de cet utilisateur sera /home/vmail, c’est ici que les BAL seront construites :

# groupadd -g 6000 vmail
# useradd -d /home/vmail -m -u 6000 -g 6000 -s /dev/null vmail

On change les droits et le propriétaire des répertoires pour plus de sécurité :

# chmod -R 750 /home/vmail/
# chown -R vmail:vmail /home/vmail/

Les fichiers de configuration Postfix se situent sous /etc/postfix et c’est main.conf qui nous intéresse. Je vais juste copier-coller le mien ci-dessous, pour plus de renseignement sur ses paramètres, voir cet article.

alias_database = $alias_maps
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
delay_warning_time = 4h
html_directory = no
inet_interfaces = all
mail_owner = postfix
mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
mailbox_size_limit = 512000000
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
masquerade_domains = mondomaine.net
message_size_limit = 50000000
mydestination = $myhostname, localhost.$myhostname, localhost
mydomain = mondomaine.net
myhostname = monhostname.local.mondomaine.net
mynetworks = 192.168.1.0/24, 127.0.0.0/8
myorigin = $myhostname
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
recipient_delimiter = +
relayhost = [smtp.sfr.fr]
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
smtp_generic_maps = hash:/etc/postfix/generic
smtpd_banner = $myhostname ESMTP
smtpd_recipient_limit = 50
unknown_local_recipient_reject_code = 550
virtual_alias_maps = hash:/etc/postfix/user_aliases
virtual_gid_maps = static:6000
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = /etc/postfix/domains
virtual_mailbox_limit = 512000000
virtual_mailbox_maps = hash:/etc/postfix/user_mailboxes_path
virtual_minimum_uid = 6000
virtual_uid_maps = static:6000

Astuce : Si comme moi, le serveur est sur un domaine local (monhostname.local.mondomaine.net), quelques difficultés vont être rencontrées lors de l’envoi de message vers l’extérieur, la machine de relai [smtp.sfr.fr] va refuser d’acheminer les emails car le domaine n’est pas enregistré sur la toile : Sender address rejected: Domain not found. Pour remédier à cela, il faut substituer l’adresse de l’émetteur en ajoutant ceci dans /etc/postfix/generic :

@monhostname.local.mondomaine.net       @mondomaine.net

On compile ce fichier avec postmap avant de relancer Postfix :

# postmap /etc/postfix/generic

Pour savoir où délivrer le courrier, le système va lire le nom des domaines virtuels gérés dans le fichier domains et les adresses emails ainsi que leur chemin seront dans user_mailboxes_path, tout deux toujours sous /etc/postfix. Il suffit d’ajouter des domaines séparés par des retours ligne, comme suit :

mondomaine.net
monautredomaine.com

Et pour les boîtes aux lettres virtuelles :

tutu@mondomaine.net mondomaine.net/tutu/
toto@monautredomaine.com monautredomaine.com/toto/

Noter le / (slash) de fin important pour indiquer qu’il s’agit de boîtes au format Maildir.

On ajoute un alias pour par exemple rediriger le courrier de toto@monautredomaine.com vers l’adresse tutu@mondomaine.net dans user_aliases :

toto@monautredomaine.com tutu@mondomaine.net

Et pour fignoler, on redirige le courrier de root – qui arrive sous /var/mail/root – vers une adresse virtuelle pour que la lecture des courriers important du système soit facilité. Ceci ce fait dans le fichier /etc/aliases :

root: tutu@mondomaine.net

Postfix ne lit pas ce genre de fichier tel quel, il faut comme pour le fichier generic le compiler pour créer le fichier de base de données grâce à la commande postmap, comme ceci :

postmap /etc/postfix/user_mailboxes_path
postmap /etc/postfix/user_aliases

Les alias locaux eux se compilent avec la commande :

newaliases

Une fois les changements effectués, on recharge Postfix :

# service postfix reload

On peut désormais faire un petit essai d’envoi d’email :

# "Email test" | mail -s "Test email root" root

Le message doit arriver dans /home/vmail/mondomaine.net/tutu/new/, l’arborescence étant créée automatiquement par Postfix dès réception de l’email.
A noter qu’il est préférable d’avoir un champ MX mondomaine.net dans vos zones DNS pour que le courrier soit bien acheminé.



Dovecot

Comme le dit le site sur lequel je me suis inspiré, recevoir du courrier c’est bien, pouvoir le lire c’est mieux. Pour cela, il faut installer Dovecot que l’on utilisera en serveur IMAP.

# yum install dovecot

Le fichier de configuration se situant sous /etc/dovecot/dovecot.conf, on l’édite comme suit :

# On veut des BAL IMAP
protocols = imap

# Chemin des les logs
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log

# Je ne veux pas de SSL
ssl_disable = yes
disable_plaintext_auth = no

# Les BAL seront au format Maildir
mail_location = maildir:/home/vmail/%d/%n

# Optimisations
dotlock_use_excl=yes
maildir_copy_with_hardlinks=yes

# Configuration de l'authentification
auth_verbose = yes
auth default {
    mechanisms = plain
    passdb passwd-file {
        # Chemin vers les utilisateurs dovecot (les adresses email gérées)
        args = /etc/dovecot/passwd
    }
    userdb static {
        # Chemin vers les BAL
        args = uid=vmail gid=vmail home=/home/vmail/%d/%n/
    }
}

Maintenant il faut créer les utilisateurs (adresses emails) et les mots de passes associés pour accèder aux BAL dans le fichier /etc/dovecot/passwd :

echo "tutu@mondomaine.net:`dovecotpw -p lemotdepasse`" >> /etc/dovecot/passwd

On démarre Dovecot :

service dovecot start

Et voilà, c’est fini! Il ne reste plus qu’à le tester. On peut commencer par essayer d’accéder à une BAL en telnet sur le port 143 :

$ telnet monhostname.mondomaine.net 143
Trying 127.0.0.1...
Connected to monhostname.mondomaine.net.
Escape character is '^]'.
* OK Dovecot ready.
1 login tutu@mondomaine.net motdepasse

1 OK Logged in.
2 select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.

* 1 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1217314075] UIDs valid

* OK [UIDNEXT 15] Predicted next UID
2 OK [READ-WRITE] Select completed.

3 list "" *
* LIST (\HasNoChildren) "." "Drafts"
* LIST (\HasNoChildren) "." "Sent"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "INBOX"

3 OK List completed.

Si cela fonctionne, vous pouvez essayer avec un vrai client (Thunderbird, Mail.app, Claws Mail, Outlook). Sinon, il faut aller voir d’où vient le problème dans les logs sous /var/log et mieux vaut lire et relire les documentations (voir ci-dessous).


En complément :


Les bases de cet article à l’origine pour Arch Linux datent du 29 juillet 2008, c’est une sorte de re-publication un peu mise-à-jour pour Fedora et un transfert de Joomla vers WordPress.