cd / ; apropos ; find * ;
Table des matières

Héberger son courrier électronique #

Devenir responsable de ses communications est un pas de géant vers plus d'autonomie et d'indépendance. Cette partie explique l'installation d'un serveur de courriel à la maison. Aucune base de données ne sera requise, puisque cela ne représente aucun intérêt en auto-hébergement. Restons simples !

La mise en place d'un serveur mail est souvent considérée comme délicate. C'est vrai qu'il faut prendre le temps pour le configurer. Ce n'est pas compliqué, mais complexe. On va donc décomposer l'installation d'un serveur mail en petites étapes simples :

Nous verrons en passant comment ajouter de nouveaux comptes mail sur votre serveur et comment configurer votre client de messagerie pour l'utiliser.

Vous devrez tout d'abord ouvrir le port 25 (smtp) dans la configuration de votre pare-feu.

Notez que certains fournisseurs d'accès à internet bloquent les mails sortant (port 25). Renseignez-vous avant d'avoir une mauvaise surprise. À défaut, regardez une proposition au paragraphe parlant de service smtp externe.

En complément, vous voudrez (devriez 😉) peut-être lire le tutoriel du développeur d'opensmtpd.

https://poolp.org/posts/2019-09-14/setting-up-a-mail-server-with-opensmtpd-dovecot-and-rspamd/

Configuration de votre zone DNS pour un serveur mail #

Le système de mail passe par des enregistrements qui lui sont propres. Nous devons donc procéder à quelques modifications dans notre zone DNS. Ajoutez deux nouveaux champs.

Un champ de type A qui pointe vers votre IP (sans doute déjà présent):

chezmoi.tld.  IN  A  192.0.2.2

Bien sûr, remplacez 192.0.2.2 par votre IP.

Un champ de type MX qui pointe vers le A précédent :

chezmoi.tld.  IN  MX  1  chezmoi.tld.

Notez l'importance du "." final.

Le "1" indique le "poids" de ce champ. Vous pourrez plus tard définir d'autres champs MX avec un poids plus important afin qu'ils aient une priorité plus faible et servent de "backup" en cas d'indisponibilité. On en parlera plus tard lorsque vous organiserez plusieurs serveurs avec des amis.

Certains utilisent un nom de domaine spécifique, soit un champ A différent du domaine principal afin de gérer des backups (serveurs de mail secondaires) ou bien tout simplement héberger un serveur mail derrière une autre IP que celle du serveur web. Ce n'est pas nécessaire du tout, mais si vous y tenez, voici à quoi ça ressemblera :

mail1.chezmoi.tld.  IN  MX  1  mail1.chezmoi.tld.
mail1.chezmoi.tld.  IN  A      192.0.2.2

Voici un autre exemple :

$ORIGIN chezmoi.tld
[...]
@                             IN MX 10  mail1.chezmoi.tld.
@                             IN A      192.0.2.2
mail1                         IN A      192.0.2.3

On voit dans ce cas particulier que si on demande quel serveur s'occupe des mails pour le domaine "chezmoi.tld", la zone indique : "c'est la machine située à mail1.chezmoi.tld". Plus loin, on voit que mail1.chezmoi.tld est derrière l'ip 192.0.2.3 qui n'est pas la même que celle pour chezmoi.tld seul.

Ça sera tout pour cette partie.

Obtention des certificats #

Ces certificats permettront de chiffrer la communication entre votre serveur et le logiciel qui récupère vos mails. De plus, cela rend chaque communication authentique.

Pour obtenir ou créer des certificats, je vous renvoie à la partie consacrée dans le chapitre sur httpd.

Que vous utilisiez letsencrypt ou bien des certificats auto-signés (voir man ssl(8)) n'a pas grande importance, les deux fonctionnent très bien. Veillez juste à bien prendre note de l'emplacement des certificats sur votre serveur.

Par la suite et par souci de cohérence, nous ferons comme si nous utilisions les certificats obtenus avec letsencrypt.

Veillez à bien indiquer dans la liste des domaines certifiés une entrée correspondant à votre champ MX.

Un serveur mail en 10 minutes (ou presque) #

Voici une configuration pour les trop pressés. Vous pouvez aussi voir cette partie comme une ébauche sur laquelle on s'appuiera pour la suite. Avec cette dernière :

La configuration sera plus détaillée et expliquée dans la partie avec utilisateurs virtuels. Ici, c'est pour les pressés.

C'est parti ? 😊

Configuration rapide de smtpd #

Voici le contenu du fichier /etc/mail/smtpd.conf :

# Configuration generale
# Tables 
table aliases "/etc/mail/aliases"

# Certificats
pki chezmoi.tld key "/etc/ssl/private/chezmoi.tld.key"
pki chezmoi.tld cert "/etc/ssl/chezmoi.tld.crt"

# Reception
listen on all tls pki chezmoi.tld 
# Envoi avec client de messagerie
listen on all port submission tls-require pki chezmoi.tld auth 

# ACTIONS
action "envoilemail" relay 

# On applique les alias systeme
action in_maildir maildir alias <aliases>

# Reception
match for local action in_maildir
match from any for domain chezmoi.tld action in_maildir

# Envoi
match for any action "envoilemail"
match auth from any for any action "envoilemail"

C'est tout 😊

Il y a autant de commentaires que de réelles instructions.

Configuration de dovecot (IMAP) #

Installez dovecot :

# pkg_add dovecot.

Dans le fichier /etc/dovecot/local.conf indiquez :

# On écoute en IPV4 et IPV6.
listen = *, [::]

# On stocke en Maildir
mail_location = maildir:~/Maildir

# on ne prend que le nom d'utilisateur comme identifiant, pas user@domain.tld
auth_username_format = %n

# imap > pop
protocols = imap

# Securisation. Editez ces lignes
ssl = yes
ssl_cert = </etc/ssl/chezmoi.tld.crt
ssl_key = </etc/ssl/private/chezmoi.tld.key
disable_plaintext_auth = yes

# methodes d'authentification
passdb {
        driver = bsdauth
}

userdb {
        driver = passwd
}

Rechargez dovecot :

# rcctl restart dovecot

Et voilà ! Vous pouvez maintenant configurer votre client de messagerie.

Serveur mail complet avec utilisateurs virtuels #

Cette désignation fait référence à des utilisateurs qui sont bien réels, mais qui ne sont pas des comptes UNIX à proprement parler. Ils n'ont notamment pas accès à un shell (la ligne de commande).

Ainsi, un nouveau compte mail ne sera pas créé avec adduser, mais en éditant un simple fichier texte contenant le nom d'utilisateur et un hash de son mot de passe.

On verra ici comment installer un serveur SMTP (opensmtpd) et IMAP (Dovecot).

Un utilisateur responsable des mails : _vmail #

On va créer utilisateur en charge de tous les mails. Il portera le doux nom de "_vmail" 😁. Ce dernier ne servira qu'à ça et n'aura donc pas accès au shell, c'est plus sûr 😊 :

# useradd -m -g =uid -c "Virtual Mail" -d /var/vmail -s /sbin/nologin _vmail

Un nouveau dossier est créé : /var/vmail. Les messages des utilisateurs seront dedans, mais bien organisés : dans ce dossier, il y aura des sous-répertoires portant le nom des utilisateurs virtuels. Ainsi, les messages seront enregistrés dans, par exemple :

/var/vmail/chezmoi.tld/batman/Maildir
/var/vmail/chezmoi.tld/utilisateur/Maildir
/var/vmail/chezmoi.tld/ninja/Maildir
...

/etc/mail/virtuals #

Ce fichier contient la liste des utilisateurs, un par ligne. Il fonctionne comme le fichier /etc/mail/aliases (lisez le man aliases(5) 😉):

heros@chezmoi.tld batman@chezmoi.tld,superman@chezmoi.tld
batman@chezmoi.tld _vmail
superman@chezmoi.tld _vmail
kiki@chezmoi.tld _vmail

Eh oui, toutes ces adresses correspondent (lire "appartiennent") à l'utilisateur _vmail.

Notez que sur la première ligne, on a fait un alias à titre d'exemple pour transférer un mail d'une adresse (heros@chezmoi.tld) vers plusieurs autres (batman@chezmoi.tld et superman@chezmoi.tld).

/etc/mail/passwd #

Même logique ici, une ligne pour un mot de passe :

batman@chezmoi.tld:$2b$09$lerdFpdQtnu.Bs5EpAsVbeF851GjdD0aza8IDhho38i1DOHk.ujzi
superman@chezmoi.tld:$2b$09$VRU/CYJUS3QZHVUFP70xIOURPbiNQeyOEZHoZo6NOY3uO.XSpd2MW

Chaque ligne est constituée de l'adresse mail puis du hash du mot de passe, séparés par le symbole "deux points" : <email>:<hash>

Vous DEVEZ avoir installé le port opensmtpd-table-passwd:

# pkg_add opensmtpd-table-passwd

Afin de chiffrer le mot de passe, utilisez la commande encrypt ainsi :

encrypt -b a -p

Ou bien l'équivalent :

smtpctl encrypt mot_de_passe

Ça vous demande d'entrer le mot de passe. Lorsque vous validez avec "Entrée", un hash du mot de passe s'affiche, il reste à le copier dans /etc/mail/passwd.

(Facultatif) Permissions sur les fichiers d'identification #

Les fichiers précédents ne doivent pas être lisibles par un simple utilisateur. Faisons en sorte que seul l'administrateur (root) puisse écrire dedans et rendons-les lisibles par les démons qui en auront besoin : dovecot et smtpd. Ce n'est pas une obligation, mais c'est une précaution qui ne peut blesser personne 😉.

Dovecot et smtpd fonctionnent à partir d'utilisateurs aux accès restreints, respectivement _dovecot et _smtpd. Tout ceci permet de protéger votre serveur si un jour, l'un de ces services était compromis.

Nous allons créer un groupe _maildaemons dans lequel nous mettrons les deux utilisateurs cités ci-dessus afin de faciliter la gestion des permissions :

# groupadd _maildaemons
# usermod -G _maildaemons _smtpd
# usermod -G _maildaemons _dovecot

dovecot n'est peut-être pas installé à ce stade de votre lecture puisqu'on en parle plus loin. Installez-le avant la dernière commande : "# pkg_add dovecot".

On définit maintenant le propriétaire et le groupe des fichiers contenant les mots de passe et identifiants :

# chown root:_maildaemons /etc/mail/passwd /etc/mail/virtuals

Enfin, on ne permet qu'à root d'écrire dans ces fichiers et au groupe _maildaemons d'en lire le contenu :

# chmod 640 /etc/mail/passwd /etc/mail/virtuals

Si vous vérifiez, vous voyez que les permissions et propriétaires sont corrects :

# ls -l /etc/mail/passwd
-rw-r-----  1 root  _maildaemons  17226 Nov 12 08:40 /etc/mail/passwd

Configuration d'Opensmtpd (smtpd) #

Opensmtpd (smtpd) est le serveur mail par défaut sur OpenBSD. Il est déjà installé, reste à le configurer.

Cependant, avant toutes choses, ouvrez et redirigez les ports suivants : 25 (smtp), 587 (submission) et 993 (imaps). Ce dernier servira à dovecot. Nous ne nous préoccupons pas du port 465 (smtps) car il est déprécié.

Pour configurer opensmtpd, on édite /etc/mail/smtpd.conf. Ce dernier sera mis en œuvre dans l'ordre de lecture.

Il se décompose en 3 parties :

Le voici, à adapter à vos besoins :

# Configuration generale
# Tables 
table aliases "/etc/mail/aliases"
table passwd "/etc/mail/passwd" # require opensmtpd-table-passwd
table virtuals "/etc/mail/virtuals"

# Certificats
pki chezmoi.tld key "/etc/ssl/private/chezmoi.tld.key"
pki chezmoi.tld cert "/etc/ssl/chezmoi.tld.crt"

# Ecoute pour recevoir/envoyer
# Reception
listen on all tls pki chezmoi.tld 
# Envoi avec client de messagerie
listen on all port submission tls-require pki chezmoi.tld auth <passwd> 

# ACTIONS 
action "envoi" relay 
action local_mail maildir alias <aliases>
action virtual_maildir maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}/Maildir" virtual <virtuals>

# Correspondances
# Reception
# Message pour les utilisateurs virtuels
match from any for domain chezmoi.tld action virtual_maildir
# Message pour les utilisateurs locaux
match from any for local action local_mail


# Envoi
match auth from any for any action "envoi"
match for any action "envoi"

Vous n'avez quasiment rien à modifier dans ce fichier, mis à part "chezmoi.tld" à remplacer par votre nom de domaine.

STOOOP! On veut des détails !

Regardons les lignes de ce fichier les unes après les autres.

Tous d'abord, les premières lignes correspondent à des options générales.

Ensuite, sont définies quelques actions qui seront appliquées aux mails. Il peut s'agir d'envoyer un courriel à l'extérieur ou bien de distribuer une enveloppe à un utilisateur du serveur.

Enfin, on regarde si on doit envoyer un message ou le délivrer pour appliquer les actions définies.

Notez que si rien n'est précisé, on considère que la règle s'applique pour un message venant du serveur : le "from local" est sous-entendu. Sinon, "from any" permet d'envoyer un message à partir de votre ordinateur, en passant par le serveur.

Nous passons maintenant à une étape simple mais importante afin que les mails soient correctement émis. Il faut indiquer dans le fichier /etc/mail/mailname votre nom de domaine sur une seule ligne. Il s'agit du domaine de l'enregistrement MX de votre zone DNS :

chezmoi.tld

Nous pouvons maintenant activer et relancer le serveur smtpd :

# rcctl enable smtpd
# rcctl restart smtpd

Voilà pour opensmtpd 😊.

Dovecot #

Dovecot va être utilisé comme serveur IMAP, afin de pouvoir récupérer son courrier à partir d'un client comme Thunderbird.

On installe dovecot comme d'habitude :

# pkg_add dovecot

On édite maintenant le fichier /etc/dovecot/local.conf pour y mettre le contenu suivant :

# On écoute en IPV4 et IPV6.
listen = *, [::]

# imap > pop
protocols = imap

# Chiffrement. Editez ces lignes
ssl = yes
ssl_cert = </etc/ssl/chezmoi.tld.crt
ssl_key = </etc/ssl/private/chezmoi.tld.key
disable_plaintext_auth = yes

# emplacement des mails. %d : domaine, %n : nom d'utilisateur
mail_location = maildir:/var/vmail/%d/%n/Maildir

# très important comme on a modifié les permissions
# sur /etc/mail/passwd
service auth {
    user = $default_internal_user
    group = _maildaemons
}

# methodes d'authentification
passdb {
    args = scheme=blf-crypt /etc/mail/passwd
    driver = passwd-file
}

# Les messages sont dans /var/vmail et appartiennent à _vmail
userdb {
    driver = static
    args = uid=_vmail gid=_vmail home=/var/vmail/%d/%n/ 
}

L'exemple ci-dessus est commenté pour vous aider à comprendre ce qui y est fait.

Pensez à adapter l'emplacement des certificats aux variables ssl_cert et ssl_key.

Par ailleurs, une configuration ssl est déjà pré-configurée dans le fichier /etc/dovecot/conf.d/10-ssl.conf. C'est censé nous faciliter la vie avec un script qui génère un certificat auto-signé, mais comme on a déjà nos certificats et configuré cette partie, il vaut mieux éviter les mélanges. Dans ce fichier, commentez donc toutes les lignes restantes :

# Fichier /etc/dovecot/conf.d/10-ssl.conf>
#ssl_cert = </etc/ssl/dovecotcert.pem
#ssl_key = </etc/ssl/private/dovecot.pem

Pour terminer cette partie, on active dovecot et on relance les différents éléments constituant le serveur mail.

# rcctl enable dovecot
# rcctl start dovecot
# rcctl restart smtpd

Il vous est désormais possible d'utiliser un client de messagerie afin de consulter votre courrier.

Ajouter un nouveau compte mail #

Vous devez remplir les fichiers /etc/mail/virtuals et /etc/mail/passwd avec une ligne en plus comme on l'a vu au tout début. Ensuite, lancez les commandes suivantes pour que smtpd prenne vos changements en compte :

smtpctl update table virtuals
smtpctl update table passwd

Ou alors, relancez smtpd avec rcctl.

Gérer plusieurs domaines #

Vous pouvez héberger un serveur mail recevant/envoyant des messages pour plusieurs domaines différents. Un peu d'organisation pour y arriver ne fait pas de mal. Vous devrez aussi être attentif à la façon dont vous gérer les certificats SSL.

Voici quelques notes à ce sujet.

Plusieurs domaines gérés par smtpd #

Je vous recommande de créer un fichier contenant la liste de tous les domaines que vous gérez. Ce dernier pourrait être /etc/mail/domains et contenir:

chezmoi.tld
domain.tld
other.bar

Ainsi, au lieu d'avoir dans /etc/mail/smtpd.conf une ligne pour chaque domaine, il suffira :

table domains "/etc/mail/domains"
...
match from any for domain <domains> action virtual_maildir

Vous devrez être attentif aux certificats utilisés. En supposant qu'il existe un certificat par domaine, vous pourrez indiquer les lignes suivantes. Vous remarquerez qu'on termine par un certificat par défaut avec "*" :

pki chezmoi.tld key "/etc/ssl/private/chezmoi.tld.key"
pki chezmoi.tld cert "/etc/ssl/chezmoi.tld.crt"
pki domain.tld key "/etc/ssl/private/domain.tld.key"
pki domain.tld cert "/etc/ssl/domain.tld.crt"
pki other.bar key "/etc/ssl/private/other.bar.key"
pki other.bar cert "/etc/ssl/other.bar.crt"
pki "*" key "/etc/ssl/private/chezmoi.tld.key"
pki "*" cert "/etc/ssl/chezmoi.tld.crt"
...
listen on all tls
...
listen on all port submission tls-require auth <passwd>

TOUTEFOIS, il vous est tout à fait possible de n'utiliser qu'un seul certificat contenant une certification pour plusieurs domaines, en utilisant "alternative names" dans la configuration d'acme-client. C'est nettement plus facile à gérer. La configuration de smtpd est alors la même qu'avec 1 seul certificat.

Plusieurs domaines gérés par dovecot #

Pour dovecot, la principale différence à prendre en compte est la gestion des certificats. Il faudra ajouter des sections "local_name" pour les domaines supplémentaires. Cela pourra ressembler à cette configuration:

ssl = yes
ssl_cert = </etc/ssl/chezmoi.tld.crt
ssl_key = </etc/ssl/private/chezmoi.tld.key
# pas de plaintext
disable_plaintext_auth = yes

local_name domain.tld {
        ssl_cert = </etc/ssl/domain.tld.crt
        ssl_key = </etc/ssl/private/domain.tld.key
}
local_name other.bar {
        ssl_cert = </etc/ssl/other.bar.crt
        ssl_key = </etc/ssl/private/other.bar.key
}

Ici aussi, n'utiliser qu'un seul certificat pour plusieurs domaines sera nettement plus pratique.

Redirection de mail #

Il est simplissime de transférer les mails reçus sur une adresse vers un autre compte de messagerie comme c'est indiqué dans la page man aliases(5).

Par exemple, vous disposez d'une adresse bibi@chezmoi.tld et souhaitez que tous les messages reçus par bibi soient transférés automatiquement à jean-eudes@ouaf.xyz.

Pour ça, il suffit d'éditer le fichier /etc/mail/virtuals, puis d'y ajouter une ligne comme celle-ci :

bibichezmoi.tld: jean-eudes@ouaf.xyz

Dans le fichier /etc/mail/aliases, vous pouvez aussi faire des redirections avec les utilisateurs du serveur, très utile pour l'administration système. On peut dans ce cas ne spécifier que le nom d'utilisateur.

root: jean
hostmaster: root
postmaster: root
webmaster:  arthur
jean: toto@serveurmail.net

De façon générale, ça donne :

utilisateur: adresse1.mail.com, adresse2.mail.com

Afin que ce changement soit pris en compte, le plus simple reste la commande suivante :

# rcctl restart smtpd

C'est tout ! Je vous l'avais dit que c'était simple. 😎

Configurer son client de messagerie #

Pour consulter vos mails sur le serveur, vous pouvez utiliser un client de messagerie comme l'excellent Thunderbird, logiciel-libre respectueux de votre vie privée.

Voici les paramètres qu'il faudra indiquer au logiciel pour envoyer et recevoir des courriels. Notez que tous ne vous seront peut-être pas demandés :

Enregistrements DNS facultatifs pour la configuration des clients de messagerie #

Pour simplifier la configuration des clients de messagerie lorsqu'on veut ajouter un nouveau compte mail, vous pouvez ajouter dans votre zone DNS les enregistrements suivants, compris par la plupart des logiciels existants :

_submission._tcp.chezmoi.tld  86400   IN  SRV 0 1 587 chezmoi.tld
_imap._tcp.chezmoi.tld        86400   IN  SRV 0 0 0   .
_imaps._tcp.chezmoi.tld       86400   IN  SRV 0 1 993 chezmoi.tld

Ainsi, les clients pourront détecter plus facilement la configuration nécessaire et auto-configurer votre accès.

Voici la rfc6186 correspondante :

https://datatracker.ietf.org/doc/html/rfc6186

Ne pas perdre de messages : champs MX et backup #

Il est possible que des mails n'arrive pas à votre serveur si ce dernier est hors-ligne pendant plus d'une semaine. Normalement, tous les serveurs de messagerie tenteront à intervalles réguliers de renvoyer un mail qui n'a pas pu être délivré.

Cependant, c'est plus rassurant de prévoir le coup en configurant une solution de secours. Il vous faut pour cela :

Ce serveur gardera vos messages en file d'attente le temps que le vôtre redevienne disponible.

De votre côté, il vous suffit d'ajouter à votre zone un nouveau champ MX avec un "poids" plus élevé que le vôtre. Ce champ pointe vers le serveur secondaire :

@                     IN MX 10  chezmoi.tld.
@                     IN MX 70  mail.copain.eu.

Dans l'exemple ci-dessus, votre serveur a un poids inférieur (10) que celui de du serveur secondaire (70). Ce dernier sera utilisé si le premier n'est pas disponible.

De son côté, votre ami, pour peu qu'il utilise lui aussi opensmtpd n'aura qu'à ajouter les lignes suivantes à son /etc/mail/smtpd.conf afin de se constituer serveur mail de secours :

action relaybackup relay backup mx "chezmoi.tld" 
...
match from any for domain chezmoi.tld action relaybackup

L'idéal, c'est de lui retouner la faveur 😉.

Ne pas être mis dans les spams (SPF, DKIM...) #

En l'état, vous pouvez recevoir et envoyer des messages. Cependant, il se peut que certains serveurs de messagerie considèrent vos mails comme des spams.

Il existe quelques petites manipulations pour rendre vos messages légitimes. Nous allons les détailler dans les paragraphes suivants. Gardez à l'esprit qu'elles se complètent sans se suffire à elles-mêmes.

Reverse DNS #

Chez votre fournisseur d'accès à internet, cherchez les options correspondant à votre adresse IP. Vous pourrez configurer un reverse DNS ou en français DNS inverse.

Alors que votre nom de domaine est relié à l'IP du serveur, il faut aussi configurer la réciproque, c'est-à-dire relier à votre IP le nom de domaine.

Un petit mail à votre fournisseur permettra de savoir comment s'y prendre si vous ne trouvez pas 😉.

Si vous ne pouvez pas faire cette manipulation, ce n'est pas une catastrophe, du moment que vous pouvez mettre en place SPF et DKIM (voir paragraphes suivants). Vous disposez très certainement d'un DNS inverse valide, bien qu'il ne corresponde pas forcément à votre domaine.

Une autre possibilité consiste à louer un VPN pour obtenir une nouvelle IP dédiée à votre serveur. Les fournisseurs de VPN proposent souvent un reverse DNS configurable.

SPF #

Normalement, seul votre serveur est autorisé à envoyer des messages avec votre nom de domaine. Un enregistrement SPF dans votre zone permet de le préciser. Puisque normalement, c'est l'administrateur du serveur de mails qui gère aussi la zone, c'est une preuve de bonne foi. L'absence de champ SPF est très mauvais pour la réputation d'un mail.

Ajoutez un champ DNS de type SPF dans votre zone DNS qui correspond au champ A utilisé pour vos mails (chez votre registre ou sur votre serveur de noms si vous l'hébergez aussi) tel que celui-ci :

chezmoi.tld.   SPF "v=spf1 a mx ~all"

ou bien sous forme de champ TXT si le SPF n'est pas disponible :

chezmoi.tld. TXT "v=spf1 a mx ~all"

Cet exemple est très simple mais devrait convenir à la plupart des cas. Vous pouvez vous renseigner sur la syntaxe de ces champs si ça vous chante 😊

Signature DKIM #

Cette technique consiste à signer avec le serveur les messages émis par le serveur à l'aide d'une clé privée. On ajoute ensuite dans un champ DNS la clé publique correspondante qui permettra au destinataire de vérifier que le mail reçu provient bien de votre serveur.

Hum... Pas sûr d'avoir compris.

Je reprends. Nous allons créer une clé privée et une clé publique.

La clé privée servira à signer les messages. On l'appelle "privée" car vous devez être la seule personne capable de signer (comme pour vos chèques ou vos impôts). La clé publique disponible dans un champ DNS, donc accessible à tous, est là pour vérifier que la signature est bien authentique. On peut voir ça comme une pièce de puzzle unique, qui est la seule à pouvoir entrer dans l'empreinte créée par la signature.

On présentera ici deux méthodes pour signer les messages : l'une avec une extension à smtpd, l'autre avec un paquet faisant office de proxy. Le premier est le plus simple 😊. Notez que c'est aussi possible avec rspamd (voir la partie correspondante), la méthode de génération des clés restant identique. Si vous choisissez d'utiliser cet antispam, vous voudrez certainement aussi utiliser sa capacité à signer les messages plutôt que mutliplier les outils installés.

Les commandes suivantes permettent de fabriquer la paire de clés qui servira à signer les mails émis :

# mkdir -p /etc/dkim/
# chmod 770 /etc/dkim/
# cd /etc/dkim/

On génère les clefs :

# openssl genrsa -out private.key 2048               
# openssl rsa -in private.key -pubout -out public.key

On ajuste les permissions sur les clefs :

# chmod 400 private.key

Il faut absolument rendre publique une façon de vérifier que la signature DKIM sur les messages envoyés est bien correcte.

Nous allons pour cela ajouter un nouveau champ dans vos DNS auprès de votre registre ou dans votre zone. Eh oui, encore ! On va en réalité indiquer le nécessaire pour pouvoir vérifier la signature des messages qui auront un drapeau "dkimpubkey".

Il s'agira d'un champ DKIM ou TXT selon ce qui est disponible. Remplissez-le ainsi :

Recopiez à la place des points de suspension le contenu du fichier public.key, que vous pouvez afficher avec la commande cat :

# cat /etc/dkim/public.key

Ce qui nous donnera dans la zone DNS de votre domaine :

dkimpubkey._domainkey    IN TXT    ( "v=DKIM1; k=rsa; t=s;p=v+Fb...vhP/oB")

Signature des messages avec opensmtpd-filter-dkimsign #

Depuis qu'smtpd est équipé de "filtres", il vous est possible de signer vos messages avec un nouveau filtre. Cela rendra la configuration un peu plus simple.

Tout d'abord, installer le port opensmtpd-filter-dkimsign.

# pkg_add opensmtpd-filter-dkimsign

On modifie les permissions pour que l'outil de signature puisse accéder aux clés :

# chown -R _dkimsign:_dkimsign /etc/dkim/

Si vos clés de signature ont bien été générées auparavant, vous pouvez ajouter en haut de votre fichier de configuration /etc/mail/smtpd.conf la définition du filtre "dkimsign":

filter "dkimsign" proc-exec "filter-dkimsign \
    -d <domain> \
    -s <selector> \
    -k /etc/dkim/private.key" \
    user _dkimsign group _dkimsign

Remplacez <domain> par votre nom de domaine et <selector> par "dkimpubkey" : c'est ce qu'on a mis un peu plus haut dans le champ DNS.

Enfin, il vous suffit de faire passer les mails sortants par ce filtre. On modifie la ligne correspondant à l'envoi des messages dans /etc/mail/smtpd.conf:

listen on all port submission tls-require auth <passwd> filter "dkimsign"

Signature des messages avec dkimproxy #

On peut aussi utiliser dkimproxy pour signer les messages.

On l'installe comme d'habitude :

# pkg_add dkimproxy

Vous rendrez dkimproxy propriétaire du dossier contenant les clés:

# chown -R _dkimproxy:_dkimproxy /etc/dkim/

Afin de configurer la signature des messages envoyés, il faut éditer le ficher /etc/dkimproxy_out.conf ainsi :

listen    127.0.0.1:10027
relay     127.0.0.1:10028
domain    chezmoi.tld
signature dkim(c=relaxed)
signature domainkeys(c=nofws)
keyfile   /etc/dkim/private.key
selector  dkimpubkey

Euh, c'est quoi tout ça ?

Quelques menues explications :

Bien, reste à indiquer à opensmtpd de signer les mails. On va donc ajouter dans le fichier /etc/mail/smtpd.conf une ligne pour écouter sur le port 10028 en local, afin d'envoyer les mails que dkimproxy aura signé. On leur colle l'étiquette "DKIM" pour les repérer ensuite.

listen on lo0 port 10028 tag DKIM   

Les messages qui auront l'étiquette "DKIM" peuvent être envoyés. On n'envoie plus les mails s'ils ne sont pas passés par dkimproxy.

match tag DKIM for any action "sendthismail"
match auth tag DKIM from any for any action "sendthismail"

Enfin, les messages pas encore signés doivent être envoyés à dkimproxy. On définit l'action correspondante :

action dkimproxy relay host smtp://127.0.0.1:10027 

S'ensuit les règles de correspondance qui vont bien, à placer à la fin du fichier smtpd.conf:

match auth from any for any action dkimproxy
match for any action dkimproxy

Ça va? Vous suivez toujours ?

Courage, c'est presque fini. 😉

Finalement, activez dkimproxy puis rechargez opensmtpd avant de tester si vous avez réussi à configurer correctement l'envoi de vos mails.

# rcctl enable dkimproxy_out
# rcctl start dkimproxy_out
# rcctl restart smtpd

Vérifications #

Pour vérifier que vos messages envoyés ne sont pas considérés comme spam, suivez les indications du site mail-tester.

https://www.mail-tester.com/

Vous allez envoyer un message à l'adresse donnée, vous devriez obtenir une bonne note. La preuve avec mon propre serveur :

../../mail-tester-fr.png

Il se peut qu'on vous parle d'un enregistrement dmarc. Libre à vous de l'ajouter à vos DNS, mais ce n'est pas obligatoire. En réalité, "ça fait juste bien" d'en avoir un... Pour ne rien vous cacher, le score obtenu sans dmarc est déjà meilleur qu'avec nombre de "grands" services de messagerie (testez avec gmail pour rigoler : 6.1/10 lors de mon dernier test...).

Essayez aussi :

http://isnotspam.com/

https://mxtoolbox.com/deliverability


Utiliser un relai SMTP externe (FAI bloquants) #

Si votre fournisseur d'accès à internet bloque le port smtp (25), vous serez bien embêté pour envoyer des messages. Au moins deux solutions s'offrent à vous :

Nous supposerons que vous disposez d'un accès par smtp sur un autre serveur (votre fournisseur de mail habituel). Vous envoyez déjà des courriels avec ce dernier à l'aide d'un identifiant et d'un mot de passe. Mettez ces derniers dans un fichier /etc/mail/secrets sous cette forme :

# echo "id_secret utilisateur:motdepasse" > /etc/mail/secrets

Bien sûr, vous aurez remplacé les éléments suivants :

Avant d'aller plus loin, modifiez les permissions sur ce fichier afin que seul smtpd puisse le lire et root le modifier :

# chmod 640 /etc/mail/secrets
# chown root:_smtpd /etc/mail/secrets

Ensuite, modifiez le ficher /etc/mail/smtpd.conf comme ceci afin d'indiquer d'envoyer les messages à l'aide de ce service externe :

...
table secrets "/etc/mail/secrets"
...
listen on all...
...

action "relay" relay host smtp+tls://id_secret@smtp.exemple.com \
      auth <secrets> mail-from "@chezmoi.tld"

...
match from any for any action "relay"

Un peu d'explications ne feront pas de mal, surtout pour que vous sachiez quoi modifier :

Pour finir, rechargez smtpd pour profiter de cette nouvelle configuration :

rcctl restart smtpd

Pour un autre exemple, vous pouvez consulter la fin du "man smtpd.conf".

https://man.openbsd.org/smtpd.conf

Lutter contre les spams à la réception : filtre senderscore #

Senderscore maintient une base de données concernant la réputation de certains serveurs.

https://www.senderscore.org/

Autant avoir une réputation moyenne ne veut pas dire grand chose concernant la légitimité des mails envoyés par un serveur, une mauvaise réputation signifie que ce dernier a envoyé à plusieurs reprises des spams.

smtpd permet d'utiliser des filtres variés ce qui rend la vérification avec senderscore plus facile.

Installez le paquet opensmtpd-filter-senderscore.

Ensuite, à la ligne gérant la réception dans /etc/mail/smtpd.conf :

filter senderscore \
         proc-exec "filter-senderscore -junkBelow 70 -slowFactor 2000"
...
listen on all tls pki chezmoi.tld filter { senderscore }

Lutter contre les spams à la réception : spamassassin #

On ne présente plus spamassassin, un filtre antispam à la réception. Avec spamd, il est utilisé par OpenBSD sur leurs listes de diffusion. Voyons comment le faire communiquer avec smtpd.

https://spamassassin.apache.org/

Méthode rapide avec filter-spamassassin #

Sachez qu'il existe un filtre opensmtpd-filter-spamassassin que vous trouverez sans doute très pratique à utiliser.

N'oubliez pas de lire le contenu de /usr/local/share/doc/pkg-readmes/opensmtpd-filter-spamassassin ;)

En quelques lignes:

# pkg_add p5-Mail-SpamAssassin opensmtpd-filter-dkim
# rcctl enable spamassassin
# rcctl start spamassassin

(pas besoin de spampd avec cette méthode)

Dans /etc/mail/smtpd.conf :

filter "spamassassin" proc-exec "filter-spamassassin"
[...]
listen on all tls pki chezmoi.tld.pki filter { spamassassin senderscore }

Méthode avec utilisation d'étiquettes #

On va détailler ici une méthode utilisant des étiquettes pour bien comprendre comment les choses fonctionnent.

On commence par installer les paquets utiles :

# pkg_add p5-Mail-SpamAssassin spampd

Pour que spampd puisse faire le lien entre le serveur smtpd et spamassassin qui vérifie les messages, il doit tourner en arrière-plan. On active donc ce service :

# rcctl enable spampd

Vous pouvez préciser certaines options pour spampd afin d'être sûr qu'il fonctionne comme prévu :

# rcctl set spampd flags "--relayhost=127.0.0.1:10026"

Ensuite, on démarre le service :

# rcctl start spampd

Il en va de même pour spamassassin qui doit être actif :

# rcctl enable spamassassin
# rcctl start spamassassin

Nous allons maintenant faire passer tous les messages entrants par spamassassin qui va les vérifier. Pour cela, il faut les envoyer sur le port 10025. S'il ne s'agit pas de spam, alors spampd se charge de les renvoyer sur le port 10026. Tous les messages arrivant ainsi recevront l'étiquette "SPAMASSASSIN", pour que l'on sache qu'il faut les distribuer car ils ont déjà été traités.

Voici donc les lignes à ajouter au fichier /etc/mail/smtpd.conf :

...
# Messages verifies par spamassassin
listen on lo0 port 10026 tag SPAMASSASSIN
...
action spamassassin relay host smtp://127.0.0.1:10025 
...
# Message venant du système
accept from local for local alias <aliases> deliver to maildir "~/Maildir"
# Message SPAMASSASSIN
match tag SPAMASSASSIN from any for domain "chezmoi.tld" action virtual_maildir
# Messages a faire verifier par spamassassin
match from any for domain "chezmoi.tld" action spamassassin
...

Actuellement, spamassassin modifie le sujet des mails spams en indiquant clairement leur nature.

Vous pouvez modifier la configuration de spamassassin pour que les spams soient directement supprimés mais c'est déconseillé en cas de faux positifs.

https://wiki.apache.org/spamassassin/DeletingAllMailsMarkedSpam

Spamassassin ajoute un entête "X-spam" aux messages indésirables. On va modifier l'action de distribution pour ajouter le mot-clé junk afin que ces messages soient automatiquement classés dans le dossier des spams lorsqu'ils seront livrés :

# Dans /etc/mail/smtpd.conf
action virtual_maildir maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}/Maildir" junk virtual <virtuals>

Lutter contre les spams à la réception : rspamd #

Rspamd n'est pas qu'un antispam. Il est extrêmement complet et peut aussi gérer le greylisting, les signatures DKIM...

https://rspamd.com/

Il faudra donc absolument consulter la documentation officielle pour maîtriser pleinement ce dernier. Dans cette partie, je vous propose une configuration succinte de rspamd qui gèrera et remplacera certains éléments décrits dans ce document concernant le greylisting et les listes noires avec spamd, spamassassin pour l'antispam et dkimproxy pour la signature DKIM.

Mais, n'est-ce pas mieux de confier à chaque tâche un outil spécifique ?

C'est à vous de voir ce que vous préférez 😊. À l'heure où j'écris ces lignes, spamd ne gère pas encore l'IPv6, alors que rspamd si en théorie. Cependant, il n'est pas en mesure de piéger les spammeurs avec les spamtraps : les pièges ne servent qu'à apprendre qui est un spammeur, mais pas de les ralentir et lutter activement contre ces derniers. Par ailleurs, il est écrit en C, plus performant que le perl avec lequel spamassassin est développé.

À vous de peser le pour et le contre. 😋

Et toi, t'utilises quoi ?

spamassassin et spamd en mode liste noire. rspamd fait trop de choses en même temps à mon goût. Mais n'y voyez aucune publicité 😉.

Installation de rspamd #

# pkg_add rspamd redis opensmtpd-filter-rspamd
# rcctl enable redis rspamd
# rcctl start redis rspamd

Puis configurez rspamd:

# rspamadm configwizard

Je vous conseille d'ajouter dans /etc/newsyslog.conf le nécessaire afin d'avoir des journaux trop gros:

# /etc/newsyslog.conf
/var/log/rspamd/rspamd.log              644  5     300  *     Z

Intégration de rspamd à /etc/mail/smtpd.conf #

Ce fichier devra contenir les lignes suivantes :

filter rspamd proc-exec "filter-rspamd"

# filtre en reception
listen on all tls pki chezmoi.tld \
    filter { rspamd }

Gestion DKIM #

rspamd peut gérer les signatures dkim. Nul besoin de dkimproxy par conséquent.

Créez les clés puis faites en sorte qu'elles appartiennent au groupe _rspamd.

# chown -R _rspamd:_rspamd /etc/dkim/

N'oubliez pas de publier le champ DNS approprié 😉.

Créez le fichier /etc/rspamd/local.d/dkim_signing.conf :

# If true, username does not need to contain matching domain
allow_username_mismatch = true;

path = "/etc/dkim/private.key";
selector = "dkimpubkey";

Afin de signer les mails sortants, vous devez avoir ceci dans /etc/mail/smtpd.conf

filter rspamd proc-exec "filter-rspamd"
# Envoi avec signature DKIM geree par rspamd
listen on all port submission tls-require pki chezmoi.tld auth \
    filter { rspamd }

Greylisting et rspamd #

Rspamd fait du greylisting par défaut. Si vous souhaitez continuer à utiliser spamd à la place, vous pouvez désactiver le greylisting en éditant le fichier /etc/rspamd/local.d/actions.conf :

greylist = none;

Ainsi que le fichier /etc/rspamd/local.d/greylist.conf

enabled = false;

Spamtraps #

Contrairement à spamd, rspamd ne garde pas captif les spammeurs qui écrivent sur une spamtrap. Cela sert tout de même à reconnaître des spammeurs pour plus tard.

Si une spamtrap vous tente quand même avec rspamd, alors écrivez dans le fichier /etc/rspamd/local.d/spamtrap.conf :

action = "no action";
learn_spam = true;
map = file://$LOCAL_CONFDIR/maps.d/spamtrap.map;

enabled = true;

Puis remplissez le fichier /etc/rspamd/maps.d/spamtrap.map avec des expressions régulières des fausses adresses piège que vous laisserez traîner sur internet. Par exemple :

/^trap@chezmoi.tld$/
/^fake@chezmoi.tld$/

Personnellement, je préfère pour ça utiliser spamd, mais les 2 peuvent se compléter avec des spamtraps différentes.

Listes noires #

Vous pouvez paramétrer des listes noires comme avec spamd avec le module multimap.

https://rspamd.com/doc/modules/multimap.html

Accès au WebUI #

Depuis votre ordinateur de bureau, créez un tunnel SSH :

ssh -N -L 9999:127.0.0.1:11334 utilisateurssh@chezmoi.tld

Ouvrez ensuite votre navigateur à l'adresse http://localhost:9999.

Vous pourrez alors admirer de magnifiques graphiques.

Gestion des spams avec dovecot #

On peut laisser l'antispam faire son travail tranquille dans son coin. Toutefois, c'est intéressant de lui indiquer les quelques mails indésirables qu'il n'a pas détectés ou au contraire les faux-positifs afin qu'il apprenne et devienne de plus en plus efficace.

Si vous utilisez dovecot afin de consulter vos messages avec un client IMAP, il est possible de marquer comme spam les messages que vous déplacez dans le dossier "Junk" (par exemple). De la même façon vous pouvez marquer un message comme légitime si vous le retirez du dossier "Junk".

Notez que cette fonctionnalité pourra être mise en place quel que soit l'antispam que vous utilisez.

L'installation va se dérouler en trois étapes :

Tout ceci est décrit dans la documentation de dovecot :

https://wiki2.dovecot.org/HowTo/AntispamWithSieve

Pour configurer dovecot de cette façon, nous commençons par installer le plugin pigeonhole qui donnera accès à sieve.

# pkg_add dovecot-pigeonhole

On active ce plugin en ajoutant les lignes suivantes à la fin du fichier /etc/dovecot/local.conf :

protocol imap {
    mail_plugins = $mail_plugins imap_sieve
}

Enfin, toujours dans le même fichier, on configure ce plugin. On indique des actions à réaliser selon les emplacements où sont déplacés les messages. :

plugin {
    sieve_plugins = sieve_imapsieve sieve_extprograms

    # Un message déplacé dans le dossier Junk est un spam
    imapsieve_mailbox1_name = Junk
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/report-spam.sieve

    # Du dossier des spams vers n'importe ou : le mail est légitime
    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Junk
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/report-ham.sieve

    sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve

    sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.exécute
}

On crée maintenant deux fichiers dans le dossier /usr/local/lib/dovecot/sieve/.

Le premier s'appelle report-spam.sieve :

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "learn-spam.sh" [ "${username}" ];

Le second s'appelle report-ham.sieve :

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "learn-ham.sh" [ "${username}" ];

On fait maintenant en sorte que sieve tienne compte de ces fichiers. Avant tout, il faut recharger dovecot :

# rcctl restart dovecot

Ensuite, compilez les scripts sieve :

# sievec /usr/local/lib/dovecot/sieve/report-spam.sieve
# sievec /usr/local/lib/dovecot/sieve/report-ham.sieve

Ces deux fichiers font appel à deux scripts : learn-spam.sh et learn-ham.sh. Le contenu de ces derniers va dépendre de l'antispam que vous utilisez. Ils serviront à apprendre à votre antispam si un message est légitime ou non. Lisez la suite pour terminer.

Scripts d'apprentissage pour spamassassin #

Voici comment remplir les scripts d'apprentissage pour spamassassin. Nous mettrons ces scripts dans le dossier /usr/local/lib/dovecot/sieve/.

#!/bin/sh
#learn-spam.sh
exec /usr/local/bin/spamc -u ${1} -L spam

#!/bin/sh
# learn-ham.sh
exec /usr/local/bin/spamc -u ${1} -L ham

Il vous faudra ajouter une option au démarrage de spamassasin pour qu'il accepte les requêtes d'apprentissage:

# rcctl set spamassassin flags -l

Scripts d'apprentissage pour rspamd #

Les scripts vont toujours dans /usr/local/lib/dovecot/sieve/.

#!/bin/sh
#learn-spam.sh
exec /usr/local/bin/rspamc -d "${1}" learn_spam

#!/bin/sh
# learn-ham.sh
exec /usr/local/bin/rspamc -d "${1}" learn_ham

À réaliser dans tous les cas... #

Afin que ces scripts puissent être lancés, rendez-les exécutables avec cette commande :

# chmod +x /usr/local/lib/dovecot/sieve/learn-*.sh

Pour terminer, n'oubliez pas de recharger dovecot :

# rcctl reload dovecot

Et voilà, désormais, les scripts d'apprentissage seront appelés selon le dossier dans lequel les utilisateurs déplaceront les mails.

Si vous souhaitez en savoir plus, vous pouvez lire la documentation de dovecot.

https://wiki2.dovecot.org/HowTo

Lutte contre les spams avant réception avec spamd #

Trier les spams une fois qu'ils sont reçus, c'est pas mal. Mais embêter les spammeurs, c'est bon pour tout le monde 😋. Spamd fait semblant d'être un serveur mail afin de filtrer les spams et ralentir les spammeurs. Il a été écrit dans l'optique d'être très efficace et ne pas ralentir la machine. Bien sûr, il transmet les mails légitimes au serveur smtpd ensuite.

Ce qui est rigolo, c'est qu'il va communiquer tout doucement avec les spammeurs et leur faire dépenser inutilement temps et ressources 😊.

Enfin, avantage non négligeable, il est présent par défaut dans OpenBSD.

Comment marche spamd ? #

Deux méthodes sont possibles et compatibles. La première consiste à laisser traîner sur le web une fausse adresse mail : une spamtrap. Tous les messages envoyés à cette adresse sont émis par des robots spammeurs : l'origine de ces derniers est alors mise sur liste noire puis ralentie.

L'autre méthode est le "greylisting". Afin de reconnaître les pourriels, spamd va mettre en attente ceux qui contactent le serveur. Ils sont mis sur liste grise.

Il existe aussi un mode "blacklist only" pour ne piéger que des IP déjà sur des listes noires.

Normalement, un serveur expéditeur légitime réessaie automatiquement de délivrer le message après un certain temps. Lors du 2^e^ essai, ce serveur est mis sur liste blanche et le message est correctement distribué. Tous ceux à qui vous avez écrit sont aussi mis sur liste blanche.

Les spammeurs ne vont pas réessayer de délivrer le message. Dans ce cas, ils seront oubliés après un délai assez long, et vous n'aurez pas reçu le spam.

Attention : Cette méthode, bien que très efficace, suppose que l'expéditeur fait les choses comme il faut. Ce n'est malheureusement pas toujours le cas, notamment pour certains sites marchands. Pensez-y. C'est heureusement facile d'ajouter un serveur sur liste blanche.

Vous devriez de toute manière utiliser une adresse poubelle comme guerrilamail dans ces cas de figure.

https://www.guerrillamail.com

Afin d'enregistrer les vilains (et bons) expéditeurs, il faudra exécuter la commande spamd-setup régulièrement.

Mise en place de spamd #

On commence par activer spamd au démarrage, en indiquant les options dont il aura besoin, puis on le lance :

# rcctl enable spamd
# rcctl set spamd flags "-v -G 25:4:864"
# rcctl start spamd

Le premier nombre correspond au nombre de minutes qu'un expéditeur doit attendre avant de réessayer de nous renvoyer son mail (puisque les spammeurs envoient des salves de mails très rapidement). Le second correspond au temps qu'une entrée reste dans la liste grise, et le dernier le temps pendant lequel une entrée restera sur la liste blanche (en heures).

En complément, je vous invite à activer spamlogd qui gardera en mémoire les expéditeurs légitimes de mail dans le temps sans repasser par la case "liste grise", tant que ces derniers envoient des mails régulièrement. Il enregistre aussi sur liste blanche les serveurs auxquels vous envoyez des messages. Attention, il faut bien avoir précisé le mot clé "log" dans la configuration du pare-feu, comme précisé un peu plus loin.

# rcctl enable spamlogd
# rcctl start spamlogd

spamd se place juste avant smtpd. On va éditer la configuration du pare-feu en conséquence. Il va envoyer à spamd tout le flux destiné au serveur smtp, qui relaiera ensuite le mail normalement s'il est légitime.

Voici ce qu'il faut donc ajouter dans /etc/pf.conf :

table <spamd-white> persist
table <nospamd> persist file "/etc/mail/nospamd"
pass in on egress proto tcp to any port smtp divert-to 127.0.0.1 port spamd
pass in on egress proto tcp from <nospamd> to any port smtp
pass in log on egress proto tcp from <spamd-white> to any port smtp

Dans l'ordre des lignes :

Voilà pour le pare-feu. N'oubliez pas de le recharger :

# pfctl -ef /etc/pf.conf

Il est nécessaire de régulièrement charger la liste noire des spammeurs dans pf afin que spamd fonctionne bien. Nous allons nous servir d'une tâche cron pour ça. Saisissez "# crontab -e", puis décommentez la ligne suivante :

~  *  *  *  *  /usr/libexec/spamd-setup

Le "~" permet de lancer à intervalles aléatoires la commande précédente 😉. Notez que c'est un nombre de minute aléatoires, cet intervalle sera donc toujours inférieur à 1h.

Spamtrap avec spamd #

Vous pouvez piéger les spammeurs en laissant traîner sur le web une fausse adresse mail. Si spamd voit un message arriver pour cette adresse, alors il sait déjà que c'est un spam : il peut donc le mettre sur liste noire. Vous voilà protégés pour l'avenir.

Afin de glisser cette "adresse-piège" sur le web sans que ça soit visible par les humains, vous pouvez l'insérer ainsi dans le code html de votre site :

<a href="mailto:piege@chezmoi.tld"></a>

Sinon, copiez-la sur des pastebins publics.

Pour indiquer à spamd cette adresse piège, il faut ajouter les options suivantes à spamdb (attention au "b" final, ce n'est pas spamd). :

# spamdb -T -a 'piege@chezmoi.tld'

Bien entendu, cette adresse piège ne doit pas réellement exister et ne risque pas de servir à quiconque.

Utiliser des listes noires ou blanches pré-existantes #

Les gens sympas, ça existe ! Ces derniers ont rassemblé une liste de spammeurs qu'ils rendent publique. Afin de les utiliser avec spamd, il faut éditer le fichier /etc/mail/spamd.conf.

Voyons l'exemple par défaut livré de base, la liste nixspam :

http://www.heise.de/ix/nixspam

Dans le fichier /etc/mail/spamd.conf, nous mettrons les lignes suivantes :

all:\
        :nixspam

# Nixspam recent sources list.
# Mirrored from http://www.heise.de/ix/nixspam
nixspam:\
        :black:\
        :msg="Your address %A is in the nixspam list\n\
        See http://www.heise.de/ix/nixspam/dnsbl_en/ for details":\
        :method=http:\
        :file=www.openbsd.org/spamd/nixspam.gz

Au début du fichier, vous lisez "all". Précisez ensuite le nom des listes qui seront utilisées et qui sont configurées en-dessous en les séparant par des ":". Nous allons en ajouter dans les paragraphes suivants.

Les listes peuvent être récupérées par spamd-setup en précisant leur URL, ou bien être des fichiers présents sur votre serveur.

Utiliser la liste noire de bsdly #

Peter N.M.Hansteen publie une liste d'IP piégées avec ses propres SPAMTRAPS.

http://www.bsdly.net/

Il met sur liste noire les IP cherchant à télécharger trop souvent sa liste pour éviter les surcharges sur son serveur. On va donc les récupérer régulièrement en ajoutant à votre crontab, toutes les heures à 20 minutes passées :

20 * * * *   /usr/local/sbin/bsdly-spamd

Le script bsdly-spamd ne fait que récupérer la liste de Peter :

#!/bin/sh
# update bsdly.net traplist into DST
URL="https://www.bsdly.net/~peter/bsdly.net.traplist"
# alternative URL
#URL="https://home.nuug.no/~peter/bsdly.net.traplist"
DST=/var/db/bsdly.traplist

ftp -o "${DST}" "${URL}"

Ensuite, indiquez dans /etc/mail/spamd.conf d'ajouter le contenu du fichier /var/db/bsdly.traplist à la liste noire :

all:\
      :nixspam:bsdlyblack:

nixspam:\
      :black:\
      :msg="Your address %A is in the nixspam list\n\
      See http://www.heise.de/ix/nixspam/dnsbl_en/ for details":\
      :method=https:\
      :file=www.openbsd.org/spamd/nixspam.gz

bsdlyblack:\
      :black:\
      :msg="SPAM.  Your address %A has sent spam within the last 24 hours.  See http://www.bsdly.net/~peter/traplist.shtml for details.":\
      :method=file:\
      :file=/var/db/bsdly.traplist

Utiliser les listes noire et blanches de uceprotect #

Le site uceprotect devrait vous plaire si vous n'aimez par les spams :

http://www.uceprotect.net/en/index.php

Ils proposent des listes d'IP mises à jour toutes les heures. Il est possible de récupérer les listes en entier comme on l'a fait avec bsdly.net.traplist, mais cela consommera moins de bande passante de ne récupérer que les changements avec (open)rsync. C'est mieux pour vous et pour uceprotect.

Dans le crontab, on appelle le script qui mettra à jour toutes les heures (Ne mettez pas à jour les listes plus souvent, sinon vous serez bloqués par leur serveur) :

10 * * * *     /usr/local/sbin/uceprotect-spamd 

Le contenu du script uceprotect-spamd est le suivant :

#!/bin/sh

RSYNC="/usr/bin/openrsync -a"
URLS="rsync-mirrors.uceprotect.net::RBLDNSD-ALL/dnsbl-1.uceprotect.net
rsync-mirrors.uceprotect.net::RBLDNSD-ALL/dnsbl-2.uceprotect.net
rsync-mirrors.uceprotect.net::RBLDNSD-ALL/ips.whitelisted.org"
OUT="/var/db/RBLDNSD-ALL/"
mkdir -p "${OUT}"

for URL in ${URLS}; do
      ${RSYNC} "${URL}" "${OUT}"
done

On charge ces listes dans /etc/mail/spamd.conf. Il y a des listes noires et des listes blanches :

all:\
      :nixspam:bsdlyblack:\
      rbldnsd-1:rbldnsd-2:rbldnsd-white:

...

rbldnsd-1:\
      :black:\
      :msg="Your address %A is listed on UCEPROTECT-Level 1\n \
      see http://www.uceprotect.net/en":\
      :method=file:\
      :file=/var/db/RBLDNSD-ALL/dnsbl-1.uceprotect.net

rbldnsd-2:\
      :black:\
      :msg="Your address %A is listed on UCEPROTECT-Level 2\n \
      see http://www.uceprotect.net/en":\
      :method=file:\
      :file=/var/db/RBLDNSD-ALL/dnsbl-2.uceprotect.net

rbldnsd-white:\
      :white:\
      :method=file:\
      :file=/var/db/RBLDNSD-ALL/ips.whitelisted.org

N'hésitez pas à faire un don à uceprotect.net, leur travail en vaut la peine. 😃

Problèmes éventuels avec le greylisting #

Trop de personnes utilisent encore un fournisseur de mail, comme Gmail. Ces derniers disposent de plusieurs serveurs et donc de plusieurs adresses IP. Malheureusement, le temps que l'adresse IP du premier serveur à tenter l'envoi d'un message soit mise sur liste blanche, c'est un autre de leurs serveurs avec une IP différente qui prend le relais. Au final, ils ne sont jamais mis sur liste blanche.

Ici, nous allons créer une liste des domaines pour lesquels on ne veut pas faire de greylisting.

Je vous propose de mettre sur liste blanche les adresses IPs des fournisseurs de mail relativement connus. Depuis qu'OpenBSD est disponible en version 6.3, nous pouvons utiliser la commande smtpctl spf walk très pratique pour récupérer ces informations.

Tout d'abord, on crée un fichier qui contient la liste des domaines à qui on épargne le greylisting. Ce fichier sera /etc/mail/nospamd_domains_list.txt :

gmail.com
hotmail.com
facebookmail.com
apple.com
microsoft.com
lists.openbsd.org
linkedin.com
freebsd.org
twitter.com
amazon.com
yahoo.com
yahoo.fr
live.fr
mail-out.ovh.net
mxb.ovh.net
laposte.net
protonmail.com

Complétez ce fichier à votre guise si vous remarquez que des serveurs restent indéfiniment sur liste grise.

Maintenant, on crée le script /usr/local/sbin/generate-nospamd qui va enregistrer dans le fichier /etc/mail/nospamd les IP des serveurs définis ci-dessus.

#!/bin/sh
# /usr/local/sbin/generate-nospamd

DOMAINS=/etc/mail/nospamd_domains_list.txt
WHITELIST=/etc/mail/nospamd

echo "#$(date)" > "$WHITELIST"
smtpctl spf walk < "${DOMAINS}" >> "$WHITELIST"
exit 0

Je vous invite à appeler ce script via /etc/daily.local afin de régulièrement mettre à jour la liste des IP. Ensuite, il faut penser à recharger la table dans le pare-feu :

# /etc/daily.local
/usr/local/sbin/generate-nospamd
pfctl -t nospamd -T replace -f /etc/mail/nospamd

spamd en mode blacklist seul #

Pour éviter le problème cité ci-dessus, et être sûr de n'embêter QUE les spammeurs sans gêner les expéditeurs légitimes, vous pouvez seulement faire tourner spamd en mode blacklist. On retire alors le greylisting, et on piège seulement les communications venant d'IP connues comme malsaines.

Pour cela, ajoutez le flag "-b" au lancement de spamd :

# rcctl set spamd flags -b

La configuration du pare-feu est aussi à revoir : seules les IP dans la table spamd seront à piéger. Dans /etc/pf.conf :

table <spamd> persist
[...]
pass in on egress inet proto tcp from <spamd> to any port smtp \
     divert-to 127.0.0.1 port spamd

Vous ouvrirez ensuite le port "smtp" si vous en avez besoin. En effet, vous pouvez très bien héberger spamd sans avoir de serveur mail, rien que pour lutter contre le spam 😄

Enfin, reste à ajouter le flag "-b" à spamd-setup. Lancez # crontab -e puis veillez à avoir cette ligne qui permet de lancer spamd-setup toutes les heures:

~    *    *    *    *    /usr/libexec/spamd-setup -b

Consulter l'activité de spamd #

Pour voir l'activité de spamd, lancez la commande "spamdb" pour voir apparaître des choses comme ça :

# spamdb
WHITE|62.4.1.33|||1462699174|1462699174|1465809574|1|0
GREY|182.70.43.24|abts-mum-dynamic-024.43.70.182.airtelbroadband.in|<Estella32@thunderguy.co.uk>|<toto@chezmoi.tld>|1473409924|1473424324|1473424324|1|0
GREY|14.183.132.63|static.vnpt.vn|<Abby5@toddelliott.com>|<kiki@chezmoi.tld>|1473410586|1473424986|1473424986|1|0

On peut lire dans l'ordre :

Il n'y a pas à dire, les "temps" sont illisibles pour les humains. Utiliser la commande date pour avoir un format lisible :

$ date -r 1462699174
    Sun May  8 11:19:34 CEST 2016

Pour manuellement mettre sur liste blanche une IP que vous savez valide, utilisez :

# spamdb -a "62.4.1.37"

Partager les informations entre deux instances de spamd #

Puisque vous avez demandé à un·e ami·e d'être un backup au cas où votre serveur mail serait indisponible (n'est-ce pas ? 😊), il est important que son serveur ait connaissance des spammeurs détectés par votre spamd. Sinon, les spammeurs pourraient passer par leur backup pour vous délivrer des messages gênants.

Heureusement, spamd peut partager ses listes. Vous devez le lancer avec les options -Y et -y :

Éditez le fichier /etc/rc.conf.local en fonction pour obtenir par exemple :

spamd_flags=-y em0 -Y 211.217.177.100 -Y domaine.tld

Avant de relancer spamd, créez un fichier /etc/mail/spamd.key qui servira de clé partagée :

# dd if=/dev/random of=/etc/mail/spamd.key bs=2048 count=1

Tous les serveurs qui communiqueront entre eux devront avoir le même fichier. Envoyez-le donc à vos amis 😊.

Ouvrez dans votre pare-feu et routeur le port 8025/udp (spamd-sync) au cas où il serait fermé.

#/etc/pf.conf
pass in quick on egress proto udp to any port spamd-sync

Enfin, relancez spamd :

# rcctl restart spamd

Vérifier que tout fonctionne bien #

Vous voudrez peut-être tester votre serveur mail après tous ces efforts. Vous l'avez bien mérité. Vous pouvez bien entendu écrire à des amis, mais cela peut poser des soucis :

Il existe heureusement des robots auxquels on peut écrire un mail, qui vous répondront très vite en vous donnant de précieuses informations. Il existe les adresses suivantes :

Ainsi que les sites suivants:

http://www.mail-tester.com

https://dkimvalidator.com/results

https://mxtoolbox.com/

Vous en trouverez d'autres sur cette page :

http://www.bortzmeyer.org/repondeurs-courrier-test.html

Le serveur smtp ne fonctionne pas comme prévu #

Si votre serveur mail rencontre des problèmes pour envoyer ou recevoir des messages, vous pouvez utiliser la commande smtpctl pour voir en détail ce qu'il se passe.

Par exemple, pour obtenir des informations générales :

# smtpctl show stats
control.session=1
mda.envelope=0
mda.pending=0
mda.running=0
mda.user=0
mta.connector=1
mta.domain=1
mta.envelope=1
mta.host=2
mta.relay=1
mta.route=1
mta.session=1
mta.source=1
mta.task=1
mta.task.running=0
queue.evpcache.load.hit=1675
queue.evpcache.size=2
queue.evpcache.update.hit=6
scheduler.delivery.ok=826
scheduler.delivery.tempfail=6
scheduler.envelope=2
scheduler.envelope.incoming=0
scheduler.envelope.inflight=1
scheduler.ramqueue.envelope=2
scheduler.ramqueue.message=2
scheduler.ramqueue.update=0
smtp.session=0
smtp.session.inet4=787
smtp.session.local=31
smtp.tls=0
uptime=777861
uptime.human=9d4m21s

Pour voir les messages en attente :

# smtpctl show queue
1101f6e60c169eac|inet4|mta||0100015b3a046476-f7d7955a-5842-49af-927c-4fa677f311c6-000000@bounces.duolingo.com|deux@domaine.eu|deux@domaine.eu|1491327053|1491672653|0|5|pending|3154|Network error on destination MXs
1a2123e1c2b3e462|inet4|mta||gitlab@framasoft.org|deux+framagit@domaine.eu|deux+framagit@domaine.eu|1491333449|1491679049|1491333849|1|inflight|50|Network error on destination MXs

Pour suivre en temps réel ce qu'il se passe :

# smtpctl monitor

Bien sûr, davantage d'explications sont disponibles dans la page man smtpctl. 😉


Table des matières

Donate