Installation d'une solution mail complète sous Debian 9 Stretch

Vous apprendrez ici comment installer une solution de messagerie complète avec des utilisateurs virtuels MySQL sous Debian 9 Stretch, à savoir qu'il est aussi possible d'utiliser SQLite ou pgSQL.

Rspamd permettra de signer les emails sortants avec DKIM et ARC afin que vous ne vous retrouviez pas dans les spams et de vérifier les emails entrants grâce à son filtrage bayésien mais aussi Fuzzy check, SPF, DKIM, DMARC, ARC, DNSBL et autres.

Les champs SPF et DMARC participeront à ne pas se retrouver dans les spams, ou pire, ignoré.

Nous utiliserons les logiciels suivants :

  • Postfix
  • Dovecot
  • Sieve
  • Rspamd

Pour la gestion des utilisateurs virtuels :

Dans ce guide, nous travaillerons avec la configuration suivante :

  • Domaine : domain.tld
  • IPv4 du serveur : x.x.x.x
  • IPv6 du serveur : xxxx:xxxx:xx:xxxx::1
  • Courrier entrant : imap.domain.tld sur port 993 (imaps)
  • Courrier sortant : smtp.domain.tld sur port 587 (submission)
  • Compte courrier : email@domain.tld
  • Certificats : Let's Encrypt

On peut commencer.

  1. Pré-requis
  2. Configuration des champs DNS
  3. Génération des certificats Let's Encrypt
  4. Modification des dépôts APT
  5. Modification du fichier hosts
  6. Création de la base MySQL
  7. Configuration de PostfixAdmin
  8. Création d'un compte email virtuel
  9. Installation de Postfix
  10. Installation de Dovecot
  11. Installation de Sieve
  12. Installation de Rspamd
  13. Configuration du champ DMARC
  14. Configuration du champ SPF
  15. Valider son installation
  16. Conclusion
  17. Références et remerciements

1. Pré-requis

  • Nginx (installation conseillé depuis les debian-backports) : servira pour la WebUi Rspamd ainsi que pour PostfixAdmin
  • MariaDB : servira à héberger vos utilisateurs virtuels avec l'aide de PostfixAdmin
  • PHP-FPM : utilisé par PostfixAdmin
  • Posséder un nom de domaine domain.tld (ici chez Gandi)

2. Configuration des champs DNS

Depuis l'interface de votre registar, qui donne pour Gandi :

@ 86400 IN A x.x.x.x
@ 86400 IN MX 1 smtp.domain.tld.
imap 86400 IN A x.x.x.x
smtp 86400 IN A x.x.x.x
  • Ligne 1 : domain.tld pointe vers x.x.x.x (A = IPv4)
  • Ligne 2 : Un email arrivant vers domain.tld sera acheminé vers smtp.domain.tld (ne pas oublier le point en fin de ligne)
  • Ligne 3 : imap.domain.tld pointe vers x.x.x.x (A = IPv4)
  • Ligne 4 : smtp.domain.tld pointe vers x.x.x.x (A = IPv4)

Si vous souhaitez utiliser IPv6 (AAAA) en plus de IPv4 (A), il suffira d'ajouter des champs AAAA :

@ 86400 IN A x.x.x.x
@ 86400 IN MX 1 smtp.domain.tld.
imap 86400 IN A x.x.x.x
imap 86400 IN AAAA xxxx:xxxx:xx:xxxx::1
smtp 86400 IN A x.x.x.x
smtp 86400 IN AAAA xxxx:xxxx:xx:xxxx::1

3. Génération des certificats Let's Encrypt

La génération des certificats ne sera pas expliquée mais vous pouvez suivre ce guide si vous êtes chez Gandi.

Quoi qu'il en soit, je préconise l'utilisation du client acme.sh mais vous pouvez aussi utiliser certbot ou alors le client de votre choix sur cette liste.

4. Modification des dépôts APT

Vous devrez ajouter le dépôt rspamd en suivant le guide officiel pour Debian.

5. Modification du fichier hosts

Modification du fichier /etc/hosts afin d'ajouter les domaines à 127.0.0.1 :

127.0.0.1 localhost domain.tld imap.domain.tld smtp.domain.tld

6. Création de la base MySQL

Création d'une base postfix et d'un utilisateur postfix ayant tous les privilèges sur la base :

[root@serveur ~]# mysql -u root -p

La requête :

CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'CHANGEME';
GRANT ALL PRIVILEGES ON `postfix`.* TO 'postfix'@'localhost';
FLUSH PRIVILEGES;

7. Configuration de PostfixAdmin

Vous n'avez plus qu'à créer le fichier config.local.php dans le répertoire de PostfixAdmin :

<?php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_name'] = 'postfix';
$CONF['database_password'] = 'CHANGEME';
$CONF['fetchmail'] = 'NO';
$CONF['quota_multiplier'] = '1048576';
$CONF['quota'] = 'YES';
$CONF['used_quotas'] = 'YES';
$CONF['show_footer_text'] = 'NO';
?>

Rendez-vous sur le setup.php de PostfixAdmin depuis votre navigateur afin d'initialiser les tables et créer votre password d'admin que vous ajouterez dans config.local.php :

$CONF['setup_password'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

Si vous avez ce message d'erreur lors de l'accès à setup.php : ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver :

[root@serveur ?]# mkdir templates_c
[root@serveur ?]# chown www-data: templates_c/

8. Création d'un compte email virtuel

Depuis l'interface d'administration de PostfixAdmin, vous devez ajouter un nouveau domaine puis un nouveau compte courrier.

Nous prendrons ici comme exemple :

  • Domaine : domain.tld
  • Compte courrier : email@domain.tld

9. Installation de Postfix

Installation des paquets :

[root@serveur ~]# apt install postfix postfix-mysql postfix-pcre libsasl2-modules libsasl2-modules-sql

Vous compléterez les options comme ceci :

  • Configuration type du serveur de messagerie : Site Internet
  • Nom de courrier : domain.tld

Ajout de l'utilisateur postfix dans le groupe sasl :

[root@serveur ~]# adduser postfix sasl

Création de l'utilisateur vmail et du groupe vmail ainsi que du répertoire de stockage des emails :

[root@serveur ~]# groupadd -g 5000 vmail
[root@serveur ~]# useradd -M -s /sbin/nologin -u 5000 -g vmail -d /var/vmail vmail
[root@serveur ~]# mkdir /var/vmail
[root@serveur ~]# chown vmail: /var/vmail/

Pour commencer, on va épurer le fichier /etc/postfix/main.cf afin de mieux nous y retrouver :

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
compatibility_level = 2
mailbox_size_limit = 0
mydestination = smtp.domain.tld, localhost
myhostname = smtp.domain.tld
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = smtp.domain.tld
myorigin = smtp.domain.tld
readme_directory = no
recipient_delimiter = +
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls=yes

Puis on va compléter, sécuriser au mieux TLS, utiliser LMTP et Rspamd, vous devrez adapter et comprendre cette configuration :

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
compatibility_level = 2
header_checks = pcre:/etc/postfix/header_checks
readme_directory = no
mailbox_size_limit = 0
message_size_limit = 104857600
mydestination = smtp.domain.tld, localhost
mydomain = domain.tld
myhostname = smtp.domain.tld
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = smtp.domain.tld
recipient_delimiter = +

smtp_destination_concurrency_failed_cohort_limit = 10
smtp_destination_concurrency_limit = 2
smtp_destination_rate_delay = 2
smtp_destination_recipient_limit = 2

smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtp_tls_fingerprint_digest = sha1
smtpd_tls_fingerprint_digest = sha1
smtp_tls_loglevel = 1
smtpd_tls_loglevel = 1
smtp_tls_mandatory_ciphers = high
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_helo_required = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_invalid_hostname, reject_unknown_recipient_domain, reject_unauth_destination, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_pipelining, check_policy_service unix:private/quota-status
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_tls_auth_only = yes
smtpd_tls_CAfile = /etc/ssl/certs/domain.tld-chain.pem
smtpd_tls_cert_file = /etc/ssl/certs/domain.tld-cert.pem
smtpd_tls_dh1024_param_file = /etc/postfix/dh2048.pem
smtpd_tls_key_file = /etc/ssl/private/domain.tld-privkey.key
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, 3DES, MD5, PSK
smtpd_tls_mandatory_ciphers = high
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
tls_high_cipherlist = ECDH+aRSA+AES256:ECDH+aRSA+AES128:AES256-SHA:DES-CBC3-SHA
tls_preempt_cipherlist = yes

smtpd_milters = inet:localhost:11332
milter_default_action = accept
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
milter_protocol = 6

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual-alias-maps.cf

Si vous ne voulez ou pouvez pas utiliser IPv6, vous devrez ajouter ceci :

inet_protocols = ipv4

Création du fichier /etc/postfix/header_checks :

/^Received:/         IGNORE
/^User-Agent:/       IGNORE
/^X-Originating-IP:/ IGNORE

Cela permettra aux emails sortant d'avoir des informations sensibles supprimées du header, par exemple votre client (User-Agent) et votre adresse IP (X-Originating-IP).

Attention à ne pas supprimer certains éléments si vous ne souhaitez pas atterrir dans les spams en dégradant votre note calculée par les anti-spams (SpamAssassin, Rspamd), il est par exemple déconseillé de supprimer Message-ID.

Génération des paramètres Diffie-Hellman avec une clé de 2048 bits :

[root@serveur ~]# openssl dhparam -out /etc/postfix/dh2048.pem 2048

Si vous voulez utiliser un relay pour envoyer vos emails, vous devrez ajouter ceci et l'adapter, dans mon exemple j'utilise un relay gandi :

relayhost = [relay.mail.gandi.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = plain
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes

Créer le fichier /etc/postfix/sasl_passwd :

[relay.mail.gandi.net]:587 mail@domainrelay.tld:password

Puis générer le fichier /etc/postfix/sasl_passwd.db avec postmap :

[root@serveur ~]# postmap /etc/postfix/sasl_passwd

Création du répertoire qui contiendra les fichiers de requêtes MySQL :

[root@serveur ~]# mkdir /etc/postfix/mysql

Création du fichier /etc/postfix/mysql/mysql-virtual-alias-maps.cf :

hosts = localhost
user = postfix
password = CHANGEME
dbname = postfix
query = SELECT mailbox.username FROM mailbox INNER JOIN alias ON mailbox.username = alias.goto WHERE alias.address = '%s' AND mailbox.active = 1 AND alias.active = 1

Création du fichier /etc/postfix/mysql/mysql-virtual-mailbox-domains.cf :

hosts = localhost
user = postfix
password = CHANGEME
dbname = postfix
query = SELECT 1 FROM domain WHERE domain = '%s' AND active = 1

Création du fichier /etc/postfix/mysql/mysql-virtual-mailbox-maps.cf :

hosts = localhost
user = postfix
password = CHANGEME
dbname = postfix
query = SELECT 1 FROM mailbox INNER JOIN domain ON mailbox.domain = domain.domain WHERE mailbox.username = '%s' AND mailbox.active = 1 AND domain.active = 1

Activation du port submission (587) dans le fichier /etc/postfix/master.cf, le port smtps (465) n'est volontairement pas activé :

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

10. Installation de Dovecot

Installation des paquets, dovecot-pop3d n'est volontairement pas installé :

[root@serveur ~]# apt install dovecot-imapd dovecot-mysql dovecot-lmtpd

Modification du fichier /etc/dovecot/dovecot.conf :

protocols = imap lmtp
dict {
  quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
!include conf.d/*.conf

Modification du fichier /etc/dovecot/dovecot-dict-sql.conf.ext :

connect = host=localhost dbname=postfix user=postfix password=CHANGEME
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}

Modification du fichier /etc/dovecot/dovecot-sql.conf.ext :

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=CHANGEME
default_pass_scheme = SHA512-CRYPT
user_query = SELECT '/var/vmail/%d/%n' AS home, 'maildir:/var/vmail/%d/%n' AS mail, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = 1
password_query = SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule, username AS user, password, '/var/vmail/%d/%n' AS userdb_home, 'maildir:/var/vmail/%d/%n' AS userdb_mail, 5000 AS userdb_uid, 5000 AS userdb_gid FROM mailbox WHERE username = '%u' AND active = 1
iterate_query = SELECT username AS user FROM mailbox WHERE active = 1

Modification du fichier /etc/dovecot/conf.d/auth-sql.conf.ext :

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

Modification du fichier /etc/dovecot/conf.d/10-auth.conf :

disable_plaintext_auth = yes
auth_mechanisms = plain
!include auth-sql.conf.ext

Modification du fichier /etc/dovecot/conf.d/10-mail.conf :

mail_location = maildir:/var/vmail/%d/%n
namespace inbox {
  inbox = yes
}
first_valid_uid = 5000
mail_plugins = quota
mbox_write_locks = fcntl

Modification du fichier /etc/dovecot/conf.d/10-ssl.conf :

ssl = required
ssl_cert = </etc/ssl/certs/domain.tld-fullchain.pem
ssl_key = </etc/ssl/private/domain.tld-privkey.key
ssl_dh_parameters_length = 2048
ssl_protocols = !SSLv3
ssl_cipher_list = ECDHE-RSA-CHACHA20-POLY1305:EECDH+AES:+AES128:+AES256:+SHA
ssl_prefer_server_ciphers = yes

Modification du fichier /etc/dovecot/conf.d/10-master.conf (vous remarquerez le port = 0 dans le service imap-login afin de désactiver ce protocole, mettez port = 143 si vous souhaitez le conserver) :

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0666
    user = postfix
    group = postfix
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
    mode = 0666
    user = vmail
    group = vmail
  }
}

Modification du fichier /etc/dovecot/conf.d/15-mailboxes.conf :

namespace inbox {
  mailbox Drafts {
    auto = create
    special_use = \Drafts
  }
  mailbox Junk {
    auto = create
    special_use = \Junk
  }
  mailbox Trash {
    auto = create
    special_use = \Trash
  }
  mailbox Sent {
    auto = create
    special_use = \Sent
  }
}

Modification du fichier /etc/dovecot/conf.d/20-imap.conf :

protocol imap {
  mail_plugins = $mail_plugins imap_quota
}

Modification du fichier /etc/dovecot/conf.d/90-quota.conf :

plugin {
  quota_grace = 100K
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox is full"
  quota = dict:User quota::proxy::quota
}
service quota-status {
  executable = quota-status -p postfix
  unix_listener /var/spool/postfix/private/quota-status {
    mode = 0666
    user = postfix
    group = postfix
  }
  client_limit = 1
}

Attention, à partir de la version 2.3.0 de Dovecot (pas encore disponible sur Debian Stretch au moment où j'écris), vous devrez générer des paramètres Diffie-Hellman, ici avec une clé de 4096 bits :

[root@serveur ~]# openssl dhparam -out /etc/dovecot/dh4096.pem 4096

Et modifier le fichier /etc/dovecot/conf.d/10-ssl.conf comme ceci :

ssl = required
ssl_cert = </etc/ssl/certs/domain.tld-fullchain.pem
ssl_key = </etc/ssl/private/domain.tld-privkey.key
ssl_dh = </etc/dovecot/dh4096.pem
ssl_min_protocol = TLSv1
ssl_cipher_list = ECDHE-RSA-CHACHA20-POLY1305:EECDH+AES:+AES128:+AES256:+SHA
ssl_prefer_server_ciphers = yes

Ce guide sera raccourci lorsque la version 2.3.0 de Dovecot sera disponible sur les dépôts Debian Stretch.

11. Installation de Sieve

Installation des paquets :

[root@serveur ~]# apt install dovecot-sieve dovecot-managesieved

Modification du fichier /etc/dovecot/conf.d/20-lmtp.conf :

protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

Modification du fichier /etc/dovecot/conf.d/90-sieve.conf :

plugin {
  sieve = /var/vmail/%d/%n/.dovecot.sieve
}

Création de ma première règle pour la boite email@domain.tld :

[root@serveur ~]# vim /var/vmail/domain.tld/email/.dovecot.sieve

La règle parle d'elle-même :

require "fileinto";

if header :is "X-Spam" "Yes" {
    fileinto "Junk";
    stop;
}

Je n'oublie pas de modifier les permissions du fichier :

[root@serveur ~]# chown vmail: /var/vmail/domain.tld/email/.dovecot.sieve

12. Installation de Rspamd

Installation du paquet :

[root@serveur ~]# apt install rspamd

Génération des clés DKIM et ARC :

[root@serveur ~]# rspamadm dkim_keygen -s 'dkim' -d domain.tld

si vous le souhaitez, vous pouvez utiliser une clé différente pour ARC et DKIM.

Cela devrait vous retourner votre clé privée ainsi que l'enregistrement DNS à ajouter au niveau de votre registar :

-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJw8Kj9Lnujn7ZJM
fCNtGkOh5ZLBhk4qz8KldARmvIBcVFd5+Qi3aHNVvHvUPSloWPTLWFuQo0SvEU7q
SFunwNySiO6MhIgA80TyCdAI5ACEWnCV32bnwXflghSiyqKufOeE+MTaTVXoU4XE
Gsg6IHnFb9mSFNnD+B0o5+0wKJTtAgMBAAECgYA4g/8YVGeQgs1KncZOHlpg2sCr
/LtzrULoe2djbDKGEGAmIKY4Q/hRuFLtTFIvl2KOcrxsqv6Uiuus60zvcthtoRZP
1HBYVCTTS/l9Kygos19ppefUV8excpHjwLP4shlnXf6LQPiTh30wQdLSwHOPUudD
8UYmfExj5n7HKyDuoQJBAMnYhIHMmGm4a93+hqG0LNzEVIlkTMOf2ogZIXphoJh/
KTc6txfj3Fr7oT6XgEDahgZ+WGDcp5xOmP5cwD7mZLUCQQDGJvB/JWGV0Eibey3h
q6/lIvcHLzfn8Kmj0sWJ4WKwQejFFp7PYgH1QqTafD6/s/3DClqJ4o49W5IQqcKy
bopZAkArV9Q0bzO3WAPJutM8PA16JqqkiiY1x8jMeuEGf5pVxNCb7H7OoX57Bxe7
8hp3UrV/BXiC7D8NwI736ADcQOsVAkBXtxcRAagwHFJ32VBXLJwhj5fQq1tRJhzC
M2RUg9we8B4tWLUWUmlRe53kRcm1LOUxeJzZmtuiV63SCIPyXrKJAkBTfdpcdQ74
XoRT5qF8raJuA/jS0mbI7EF/vTLyJebkATLnd3ZdekG/lO2h0ORtz5zepifdrNcT
Akm7ilhEosrG
-----END PRIVATE KEY-----
dkim._domainkey IN TXT ( "v=DKIM1; k=rsa; "
    "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcPCo/S57o5+2STHwjbRpDoeWSwYZOKs/CpXQEZryAXFRXefkIt2hzVbx71D0paFj0y1hbkKNErxFO6khbp8DckojujISIAPNE8gnQCOQAhFpwld9m58F35YIUosqirnznhPjE2k1V6FOFxBrIOiB5xW/ZkhTZw/gdKOftMCiU7QIDAQAB" ) ;

On enregistre la clé privée dans /var/lib/rspamd/arc/domain.tld.arc.key et /var/lib/rspamd/dkim/domain.tld.dkim.key, il s'agit des emplacements par défaut que Rspamd saura lire directement :

[root@serveur ~]# mkdir /var/lib/rspamd/arc/ /var/lib/rspamd/dkim/
[root@serveur ~]# cd /var/lib/rspamd/
[root@serveur rspamd]# vim arc/domain.tld.arc.key
[root@serveur rspamd]# cp arc/domain.tld.arc.key dkim/domain.tld.dkim.key
[root@serveur rspamd]# chown -R _rspamd: arc/ dkim/

Le contenu des fichiers domain.tld.arc.key et domain.tld.dkim.key contiendra la clé privée :

-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJw8Kj9Lnujn7ZJM
fCNtGkOh5ZLBhk4qz8KldARmvIBcVFd5+Qi3aHNVvHvUPSloWPTLWFuQo0SvEU7q
SFunwNySiO6MhIgA80TyCdAI5ACEWnCV32bnwXflghSiyqKufOeE+MTaTVXoU4XE
Gsg6IHnFb9mSFNnD+B0o5+0wKJTtAgMBAAECgYA4g/8YVGeQgs1KncZOHlpg2sCr
/LtzrULoe2djbDKGEGAmIKY4Q/hRuFLtTFIvl2KOcrxsqv6Uiuus60zvcthtoRZP
1HBYVCTTS/l9Kygos19ppefUV8excpHjwLP4shlnXf6LQPiTh30wQdLSwHOPUudD
8UYmfExj5n7HKyDuoQJBAMnYhIHMmGm4a93+hqG0LNzEVIlkTMOf2ogZIXphoJh/
KTc6txfj3Fr7oT6XgEDahgZ+WGDcp5xOmP5cwD7mZLUCQQDGJvB/JWGV0Eibey3h
q6/lIvcHLzfn8Kmj0sWJ4WKwQejFFp7PYgH1QqTafD6/s/3DClqJ4o49W5IQqcKy
bopZAkArV9Q0bzO3WAPJutM8PA16JqqkiiY1x8jMeuEGf5pVxNCb7H7OoX57Bxe7
8hp3UrV/BXiC7D8NwI736ADcQOsVAkBXtxcRAagwHFJ32VBXLJwhj5fQq1tRJhzC
M2RUg9we8B4tWLUWUmlRe53kRcm1LOUxeJzZmtuiV63SCIPyXrKJAkBTfdpcdQ74
XoRT5qF8raJuA/jS0mbI7EF/vTLyJebkATLnd3ZdekG/lO2h0ORtz5zepifdrNcT
Akm7ilhEosrG
-----END PRIVATE KEY-----

Ajouter l'enregistrement DNS générée précédemment au niveau de votre registar pour les 2 selecteurs arc et dkim :

arc._domainkey 86400 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcPCo/S57o5+2STHwjbRpDoeWSwYZOKs/CpXQEZryAXFRXefkIt2hzVbx71D0paFj0y1hbkKNErxFO6khbp8DckojujISIAPNE8gnQCOQAhFpwld9m58F35YIUosqirnznhPjE2k1V6FOFxBrIOiB5xW/ZkhTZw/gdKOftMCiU7QIDAQAB;"
dkim._domainkey 86400 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcPCo/S57o5+2STHwjbRpDoeWSwYZOKs/CpXQEZryAXFRXefkIt2hzVbx71D0paFj0y1hbkKNErxFO6khbp8DckojujISIAPNE8gnQCOQAhFpwld9m58F35YIUosqirnznhPjE2k1V6FOFxBrIOiB5xW/ZkhTZw/gdKOftMCiU7QIDAQAB;"

Si vous ne souhaitez pas que les emails considérés comme spam avec une note au-delà de 15 (par défaut) soient supprimés mais déplacés dans les spams, vous devez créer ou modifier le fichier /etc/rspamd/override.d/metrics.conf :

actions {
  add_header = 6;
  greylist = 4;
}

Configuration de la WebUi :

Vous devrez suivre le guide officiel.

A titre d'exemple, voici ma configuration pour Nginx :

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name sub.domain.tld;

    access_log /var/log/nginx/rspamd-access.log;
    error_log /var/log/nginx/rspamd-error.log;

    ssl_certificate /etc/ssl/certs/domain.tld-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/domain.tld-privkey.key;
    ssl_trusted_certificate /etc/ssl/certs/domain.tld-chain.pem;
    ssl_dhparam certs/dhparam.pem;
    ssl_protocols TLSv1.2;
    ssl_ecdh_curve X25519:sect571r1:secp521r1:secp384r1;
    ssl_ciphers ECDHE-RSA-CHACHA20-POLY1305:EECDH+AES:+AES128:+AES256:+SHA;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";

    location = /robots.txt {
        return 200 "User-agent: *\nDisallow: /\n";
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:11334;
    }
}

Si vous ne voulez pas de logs dans /var/log/rspamd/ mais uniquement sous journald, vous devez créer ou modifier le fichier /etc/rspamd/local.d/logging.inc :

systemd = true;
type = "console";

Puis supprimer les logs :

[root@serveur ~]# systemctl stop rspamd
[root@serveur ~]# cd /var/log/rspamd/
[root@serveur rspamd]# rm -f rspamd.*
[root@serveur rspamd]# systemctl start rspamd

Il est possible de dire à Dovecot d'apprendre automatiquement à Rspamd depuis les spams déplacés par Sieve dans le répertoire .Junk (spam) mais je conseille de ne pas mettre en place cette fonctionnalité car il arrive parfois que des faux positifs arrivent dans le dossier, surtout lorsque l'installation est toute fraiche et que vous n'avez pas jouer avec les listes blanches.

Vous pourrez de temps en temps taper cette commande en vous assurant d'abord qu'il n'y a aucun faux positif dans les spams :

[root@serveur ~]# rspamc learn_spam /var/vmail/domain.tld/mail/.Junk/cur

Ce qui vous retournera par exemple :

Results for file: /var/vmail/domain.tld/mail/.Junk/cur/1500138937.M595397P8882.xxx.tld,S=1750,W=1812:2,S (0.073 seconds)
success = true;

Results for file: /var/vmail/domain.tld/mail/.Junk/cur/1499713762.M666346P25835.xxx.tld,S=1420,W=1472:2,S (0.077 seconds)
HTTP error: 404, <544289145.201707101209@sstechnologies.com> has been already learned as spam, ignore it

Results for file: /var/vmail/domain.tld/mail/.Junk/cur/1500346894.M702472P15799.xxx.tld,S=1482,W=1536:2,S (0.017 seconds)
success = true;

13. Configuration du champ DMARC

Ajouter l'entrée TXT au niveau de votre registar :

_dmarc 86400 IN TXT "v=DMARC1; p=none; sp=reject"

Voici un assistant afin de comprendre la ligne ci-dessus : http://www.kitterman.com/dmarc/assistant.html

14. Configuration du champ SPF

Ajouter l'entrée TXT au niveau de votre registar :

Dans mon exemple :

@ 86400 IN TXT "v=spf1 a mx -all"

Voici un assistant afin de comprendre la ligne ci-dessus : https://www.spfwizard.net/

Attention, si vous utilisez un relay, par exemple pour Gandi, vous devrez avoir une ligne de ce type :

@ 86400 IN TXT "v=spf1 ip4:217.70.176.0/21 ip6:2001:4b98:c::/48 ip4:217.70.185.10 ip4:217.70.186.165 a ptr -all"

C'est terminé, on peut relancer les daemons :

[root@serveur ~]# systemctl restart postfix dovecot rspamd

15. Valider son installation

Le temps de la réplication DNS pouvant prendre un certain temps, il sera sans doute nécessaire d'attendre quelques heures avant d'avoir des résultats optimaux.

Il est déconseillé d'envoyer des emails vers gmail, outlook, ymail ou n'importe où tant que votre configuration ne sera pas notée 10/10 sur https://www.mail-tester.com/.

Je vois beaucoup de guide expliquant de regarder l'entête d'un email envoyé vers gmail afin de contrôler son installation, l'art de se tirer une balle dans le pied, à ne pas faire.

Suis-je blacklisté ? :

Si vous-êtes blacklisté, vous pouvez demander à ne plus l'être mais ça peut être très long, vous pouvez aussi faire comme moi et commander un autre VPS en espérant qu'une IP non blacklistée vous soit fournie.

Mon serveur de messagerie est-il bien configuré ? :

SPF, DKIM, DMARC sont-ils bien configurés ? :

On continue les tests ? :

16. Conclusion

Il est fortement conseillé de jouer avec Rspamd et de bien comprendre son fonctionnement, notamment au niveau des settings, rules, local et override et de ne jamais modifier les fichiers de configuration de base.

Les logs Postfix et Dovecot pourront vous en apprendre beaucoup et permettront de corriger les potentielles erreurs, détecter des tentatives de hack par bots ou ciblées.

L'analyse des logs Rspamd ainsi que la WebUi vous permettront de peaufiner vos règles, settings et différentes listes blanches.

Je préconise l'utilisation d'un bon webmail tel que RainLoop ou RoundCube, du client K9 Mail pour Android.

On pourra maintenant imaginer cette configuration finale pour vous :

  • WebUi Rspamd : https://rspamd.domain.tld
  • RainLoop ou RoundCube : https://webmail.domain.tld
  • PostfixAdmin : https://postfix.domain.tld
  • Courrier entrant : imap.domain.tld sur port 993 (imaps)
  • Courrier sortant : smtp.domain.tld sur port 587 (submission)

17. Références et remerciements