Installer un serveur mail postfix sous Debian Jessie + SPF + DKIM + SASL

Quand on possède un hébergement traditionnel, on ne dispose pas forcément des outils nécessaires pour mailer en masse (utile quand on a plein de prospects/clients/membres).

Même en bénéficiant d’un service de mailing, les limites d’utilisation se font rapidement sentir.. Ou alors cela devient vite hors de prix pour un simple particulier !

Vaut-il la peine de dépenser autant lorsqu’on peut l’avoir gratuitement ? Je récapitule ici la manière dont j’ai installé mon propre serveur mail afin de me libérer de ces contraintes (bon d’autres apparaissent comme devoir gérer configuration/maintenance/debug, être considéré comme spam et finir sur liste noire… mais vive quand même le DIY ^^ !).

1) Configuration préalable

DNS

Configurez votre serveur DNS de manière à faire pointer le champ MX de votre nom de domaine vers l’IP de la machine sur lequel tournera votre serveur mail. (Généralement votre registrar vous propose ce service en simplifié.)

Ce qui doit donner quelque chose qui ressemble à ça (en mode expert).

smtp 300 IN A XXX.XXX.XXX.XXX 
@ 28800 IN MX 10 smtp 
www 10800 IN A XXX.XXX.XXX.XXX

IP reverse

Mettez un reverse sur l’IP de votre serveur (vers votre domaine).

Modifications de quelques fichiers + hostname

 # echo "domaine" > /etc/hostname
 # echo "domaine.com" > /etc/mailname
 # echo "127.0.0.1 domaine.com domaine" >> /etc/hosts
 # hostname domaine

2) Ouverture des ports

Vous devez maintenant ouvrir quelques ports tcp de votre machine.

  • 25 : pour que le serveur réceptionne les mails (smtp)
  • 587 : si vous souhaitez un chiffrement des vos données

Autres ports facultatifs : 465, 110 et 995 (pop3), 143 et 993 (imap)

3) Installation de Postfix

# apt-get install postfix

Ouvrez /etc/postfix/main.cf

# nano /etc/postfix/main.cf

Et modifiez la ligne

myhostname = domaine.com

4) SPF

Dans les DNS

IN TXT "v=spf1 a mx ip4:XXX.XXX.XXX.XXX -all"

5) DKIM

# apt-get install opendkim opendkim-tools

5.1) Dans /etc/opendkim.conf

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

# Log to syslog
Syslog          yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask           002
# OpenDKIM user
# Remember to add user postfix to group opendkim
UserID          opendkim

# Map domains in From addresses to keys used to sign messages
KeyTable        /etc/opendkim/key.table
SigningTable        refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts

# Commonly-used options; the commented-out versions show the defaults.
Canonicalization    relaxed/simple
Mode            sv
SubDomains      no
#ADSPAction     continue
AutoRestart     yes
AutoRestartRate     10/1M
Background      yes
DNSTimeout      5
SignatureAlgorithm  rsa-sha256

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

Socket local:/var/spool/postfix/opendkim/opendkim.sock

5.2) Création de dossiers et permissions

# chmod u=rw,go=r /etc/opendkim.conf
# chown -R opendkim:opendkim /etc/opendkim.conf

# mkdir /etc/opendkim

# mkdir /etc/opendkim/keys
# chmod -R go-rw /etc/opendkim/keys

5.3) Dans /etc/opendkim/signing.table

*@domaine.com   key

5.4) Dans /etc/opendkim/key.table

key     domaine.com:YYYYMM:/etc/opendkim/keys/YYYYMM.private

5.5) Dans /etc/opendkim/trusted.hosts

127.0.0.1
::1
localhost
myhostname
domaine.com

5.6) Génération de clés

# mkdir /etc/opendkim/keys/domaine.com
# cd /etc/opendkim/keys/domaine.com
# opendkim-genkey -b 2048 -h rsa-sha256 -r -s YYYYMM -d domaine.com -v

Vous devriez alors obtenir 2 fichiers YYYYMM.private et YYYYMM.txt

5.7) Retour au DNS

Ouvrez le fichier .private, et recopiez ce qu’il y a entre parenthèses en retirant les guillemets

201702._domainkey  IN  TXT ( "**v=DKIM1; h=rsa-sha256; k=rsa; s=email; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXR"
"ZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB**" )  ; ----- DKIM key 201510 for example.com

deviendra

v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXRZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB

C’est cette séquence qu’il faudra placer dans un champ value d’un enregistrement SPF (ou TXT), avec pour nom YYYYMM._domainkey

Si vous souhaitez tester votre config, cette commande devrait afficher « key ok ».

# opendkim-testkey -d example.com -s YYYYMM -vvv

5.8) Configuration de Postfix

5.8.1) Création d’un dossier destiné à accueillir la socket

# mkdir /var/spool/postfix/opendkim
# chown opendkim:opendkim /var/spool/postfix/opendkim

5.8.2) Changement de groupe de l’user postfix

# usermod -G opendkim postfix

5.8.3) Ajouter dans /etc/postfix/main.cf

# Milter configuration
# OpenDKIM
milter_default_action = accept
# Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2
milter_protocol = 6
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = local:/opendkim/opendkim.sock

5.8.3) Redémarrage

# systemctl restart opendkim
# systemctl restart postfix

Petite note :

Pour ma part j’ai eu un souci car opendkim.sock n’apparaissait pas dans /var/spool/postfix/opendkim/

J’ai découvert que le souci venait du démarrage et redémarrage du service opendkim.

Alors j’ai édité

# systemctl edit opendkim

puis inscrit

[Service]
ExecStart=
ExecStart=/usr/sbin/opendkim -x /etc/opendkim.conf -u opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/spool/postfix/opendkim/opendkim.sock

et enfin rechargé

# service opendkim restart

Et plus aucun souci par la suite.

6) S’identifier grâce à SASL et saslauthd

# apt-get install sasl2-bin libsasl2-modules

Dans /etc/postfix/sasl/smtpd.conf

# nano /etc/postfix

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

/etc/postfix/sasl/smtpd.conf sera automatiquement chargé par postfix (de même pour la socket saslauthd)

Dans /etc/default/sasl-postfix

# nano /etc/default/sasl-postfix

START=yes
DESC="SASL Auth. Daemon for Postfix"
NAME="saslauthd-postf"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

# dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
# adduser postfix sasl

Ajouter dans /etc/postfix/main.cf

# nano /etc/postfix/main.cf

smtpd_tls_security_level = encrypt
smtpd_sasl_auth_enable = yes
smtpd_relay_restrictions = permit_mynetworks reject_unauth_destination reject
smtpd_sasl_authenticated_header = yes

Décommenter dans /etc/postfix/master.cf

# nano /etc/postfix/master.cf

submission inet n       -       y       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

Ce qui permettra d’expédier des mails après identification sur le port 587. (Ce qui ne sera pas ici le cas sur le port 25)

Redémarrer

# service saslauthd restart
# service postfix stop
# service postfix start

Bonus

Chiffrage systématique des mails envoyés

smtp_tls_security_level = encrypt

Envoyer un email à travers une IP en particulier (utile lorsque votre serveur possède plusieurs interfaces)

smtp_bind_address = 192.168.0.87
John Doe avatar
About John Doe
John Doe's true identity is unknown. Maybe he is a successful blogger or writer. Nobody knows it.
comments powered by Disqus