Cela fait quelques années maintenant que mon serveur tourne et je trouvais le serveur de mail (postfix
) bien fonctionnel plutôt bien jusqu’à ce que je reçoive des messages de la part de Gmail comme quoi les emails envoyés par le site sont considérés comme spam!
Et c’est à ce moment que l’on réalise qu’être bloqué par son fournisseur email, ce n’est pas cool du tout : à chaque fois qu’un nouveau commentaire est publié et que quelqu’un y est abonné, l’erreur se déclenche et le mail part en mail delivery service.
Voici le message type que l’on reçoit de Gmail dans ce cas:
Final-Recipient: rfc822; ***@gmail.com
Action: failed
Status: 5.7.1
Remote-MTA: dns; gmail-smtp-in.l.google.com
Diagnostic-Code: smtp; 550-5.7.1 Our system has detected an unusual rate of unsolicited mail originating from your IP address. To protect our users from spam, mail sent from your IP address has been blocked. Please visit
https://support.google.com/mail/answer/81126 to review our Bulk Email Senders Guidelines.
Code language: JavaScript (javascript)
Lorsque l’on monte un serveur email, rien n’est sécurisé par défaut. Avec tout le spam en circulation, il y a des entêtes à ajouter lors de l’envoi pour que le courrier ne soit pas considéré comme indésirable :
Il est donc temps de sécuriser un peu notre serveur de mail.
Étape 1 : diagnostics
Sur le serveur dans le terminal, on envoie un mail de test :
mail check-auth@verifier.port25.com
Code language: CSS (css)
Résultat:
==========================================================
Summary of Results
==========================================================
SPF check: softfail
DomainKeys check: neutral
DKIM check: neutral
Sender-ID check: softfail
SpamAssassin check: ham
Du fail et du neutral, ce n’est pas trop bon! Nous allons commencer par activer SPF et Sender-ID.
Étape 2 : ajouter SPF et Sender-ID à BIND
Nous allons donc ajouter l’authentification SPF (Sender Policy Framework) à notre enregistrement DNS. On édite le fichier de configuration BIND de notre domaine :
nano /etc/bind/skyminds.net.hosts
Et on y ajoute à la fin du fichier :
;SPF
skyminds.net. IN TXT "v=spf1 ip4:IP4SERVEUR mx -all"
skyminds.net. IN SPF "v=spf1 ip4:IP4SERVEUR mx -all"
mail.skyminds.net. IN TXT "v=spf1 ip4:IP4SERVEUR a -all"
mail.skyminds.net. IN SPF "v=spf1 ip4:IP4SERVEUR a -all"
Code language: JavaScript (javascript)
Remplacez IP4SERVEUR par l’IPv4 de votre serveur et skyminds.net par votre nom de domaine. Enregistrez le fichier et relancez BIND :
/etc/init.d/bind9 restart
On renvoie un mail de test :
mail check-auth@verifier.port25.com
Code language: CSS (css)
Nouveau résultat :
==========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: neutral
Sender-ID check: pass
SpamAssassin check: ham
Pas mal, on vient d’activer le SPF et le Sender-ID en 2 minutes !
Étape 3 : installation de l’authentification DKIM
DKIM (DomainKeys Identified Mail) est une norme d’authentification fiable du nom de domaine de l’expéditeur d’un courrier électronique : DKIM fonctionne par signature cryptographique du corps du message et d’une partie de ses en-têtes.
Une signature DKIM vérifie donc l’authenticité du domaine expéditeur et garantit l’intégrité du message. Idéal pour lutter contre le spam.
1. On installe opendkim
:
apt-get install opendkim opendkim-tools
Code language: JavaScript (javascript)
Et on édite le fichier de configuration:
nano /etc/opendkim.conf
On supprime tout le contenu de ce fichier et on met :
# Enable Logging
Syslog yes
SyslogSuccess yes
LogWhy yes
# User mask
UMask 002
# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer and the verifier)
OversignHeaders From
# Our KeyTable and SigningTable
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
# Trusted Hosts
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts
# Hashing Algorithm
SignatureAlgorithm rsa-sha256
# Auto restart when the failure occurs. CAUTION: This may cause a tight fork loops
AutoRestart Yes
DNSTimeout 5
# Set the user and group to opendkim user
UserID opendkim:opendkim
# Specify the working socket
Socket inet:12345@localhost
Canonicalization relaxed/relaxed
Code language: PHP (php)
2. On édite la configuration par défaut d’opendkim:
nano /etc/default/opendkim
Code language: JavaScript (javascript)
Avec :
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=""
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
#SOCKET="local:/var/run/opendkim/opendkim.sock" # default
#SOCKET="inet:54321" # listen on all interfaces on port 54321
SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
Code language: PHP (php)
3. On crée un nouveau répertoire pour notre clé et on assigne les droits à l’utilisateur opendkim
, du groupe opendkim
:
mkdir -pv /etc/opendkim/skyminds.net/
chown -Rv opendkim:opendkim /etc/opendkim
chmod go-rwx /etc/opendkim/*
Ensuite, on crée une paire de clés pour chaque domaine :
cd /etc/opendkim/skyminds.net/
opendkim-genkey -r -h rsa-sha256 -d skyminds.net -s mail -b 4096
mv -v mail.private mail
chown opendkim:opendkim *
chmod u=rw,go-rwx *
Code language: PHP (php)
Cela nous crée 2 fichiers : un fichier mail
(clé privée) et un fichier mail.txt
qui contiendra notre clé publique.
4. On ajoute notre clé publique à l’enregistrement DNS du domaine dans BIND:
nano /etc/bind/skyminds.net.hosts
On y copie notre clé publique (/etc/opendkim/skyminds.net/mail.txt) à la fin du fichier :
;DKIM
_domainkey.skyminds.net. IN TXT "t=y; o=-;"
mail._domainkey.skyminds.net. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6YG5lJXmZxgz1eFprQfEV8oqUjYceMNPctuhi/Fo+oE+4oeDwMTDyPJcGCuJMp2XZxL2X3a8/Q9g3StekiHWqPehY7cyrnYZg6ttTCdbJYGAc/t0rVCKut/2baiGw9lcMq5sbUG9YywEEI/rN4Fu0PCU1A6BkqtNAepPhDwVRAQIDAQAB; t=s"; ----- DKIM key mail for skyminds.net
_adsp._domainkey.skyminds.net. IN TXT "dkim=unknown"
Code language: JavaScript (javascript)
On enregistre le fichier et on relance BIND :
/etc/init.d/bind9 restart
5. On associe les domaines avec les clés :
nano /etc/opendkim/KeyTable
La syntaxe du fichier est la suivante :
KeyID Domain:Selector:PathToPrivateKey
Nous ajoutons donc :
skyminds.net skyminds.net:mail:/etc/opendkim/skyminds.net/mail
Code language: JavaScript (javascript)
6. On édite ensuite la table des signatures :
nano /etc/opendkim/SigningTable
à laquelle on ajoute :
*@skyminds.net skyminds.net
Code language: CSS (css)
7. On définit les domaines considérés comme trusted :
nano /etc/opendkim/TrustedHosts
Avec :
127.0.0.1
localhost
ns.kimsufi.com
skyminds.net
Code language: CSS (css)
Il ne faut pas oublier d’ajouter le DNS de votre hébergeur (ns.kimsufi.com
chez moi).
8. On applique maintenant les bons droits à nos fichiers :
chown opendkim:opendkim /etc/opendkim/KeyTable
chown opendkim:opendkim /etc/opendkim/SigningTable
chown opendkim:opendkim /etc/opendkim/TrustedHosts
9. On édite maintenant la configuration Postfix :
nano /etc/postfix/main.cf
Et on rajoute :
# DKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12345
non_smtpd_milters = $smtpd_milters
Code language: PHP (php)
On redémarre bind
, opendkim
et postfix
pour vérifier que tout va bien :
/etc/init.d/bind9 restart
/etc/init.d/opendkim restart
/etc/init.d/postfix restart
10. On vérifie qu’opendkim est bien lancé sur le serveur :
ps aux | grep dkim
netstat -tanp | grep dkim
Étape 4 : tests et vérifications
Il faut maintenant attendre que la propagation DNS prenne effet, cela peut prendre quelques heures.
Vous pouvez lancer un test DKIM ici : http://www.brandonchecketts.com/emailtest.php
Vérifiez les erreurs mail dans les logs :
tail -f /var/log/mail.log
Code language: JavaScript (javascript)
Envoyez-vous un email via le terminal. Voici ce que vous devriez obtenir :
Étape 5 : optimiser la vitesse d’envoi
Quelques jours après la réalisation et la mise en place du tutoriel, je me suis aperçu que Gmail grognait toujours à cause de la vitesse à laquelle étaient envoyés les emails, notamment lorsque beaucoup de gens sont abonnés aux commentaires : en cas de nouveau commentaire, une flopée de notifications partent au même moment – ce qui déclenche le message d’erreur chez Gmail.
Pour améliorer cela, on édite à nouveau le fichier de configuration postfix
:
nano /etc/postfix/main.cf
Et on y rajoute :
# Matt : NOT TOO FAST COWBOY!
# This means that postfix will up to two concurrent
# connections per receiving domains. The default value is 20.
default_destination_concurrency_limit = 2
# Postfix will add a delay between each message to the same receiving domain.
default_destination_rate_delay = 5s
# Limit the number of recipients of each message.
# If a message had 20 recipients on the same domain, postfix will break it out
default_extra_recipient_limit = 3
Code language: PHP (php)
Cela se connecte au maximum avec 2 connexions par domaine, avec un délai de 5 secondes entre chaque message s’ils sont envoyés au même domaine et on envoie par tranche de 3 messages. Un peu alambiqué mais cela semble satisfaire Google.
Voilà, c’est fini. Les messages de votre serveur de mail devraient maintenant être un peu plus acceptés dans les boîtes de réception !