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