Introduction
Ce tutoriel va nous permettre de déployer un petit serveur de mail Postfix ayant pour fonction de relai SMTP, c.a.d. de transmettre des mails sortants vers un autre serveur SMTP.
Son immense avantage consiste à déléguer la gestion des boites mail des utilisateurs à des fournisseurs de services experts en la matière, et ainsi de s\’éviter l\’experte et lourde administration d\’un serveur de mail rattaché à un nom de domaine public (FQDN).
Donc en ayant au préalable délégué la gestion de son mail à un fournisseur expert en la matière tel que [https://www.gandi.net/ Gandi.Net] ou [https://www.ovhtelecom.fr/ OVH], nous allons pouvoir en utiliser la quintessence.
Ce tutoriel, à quelques détails près, peut s\’appliquer au moins aux \’\’\’2\’\’\’ usages suivants :
- L\’envoi de mail depuis des application PHP exécutées sur un serveur LAMP (exemple : formulaire de contact, application de bloging, …)
- L\’envoi rapide et rationalisé des mails sortants provenant d\’un réseau local LAN d\’entreprise
Pré-requis
Fournisseur de services
Le fournisseur de services mail propose les fonctions de SMTP authentifié sécurité TLS/SSL et l\’authentification par mot-de-passe, et cela de façon indépendante des services de FAI qu\’il peut proposer (cas particulier du fournisseur historique : Orange)
L\’exécution de ce présent tutoriel nécessite la souscription préalable d\’un compte de messagerie électronique de type : \’\’truc@domaine.fr\’\’
Système & Réseau
Le serveur de mail doit avoir accès à Internet, et cela à minima via le port 465 (parfois 25 &/| 445, selon votre fournisseur de services)
Il n\’est pas requis, ni recommandé, qu\’Internet est accès à ce serveur, ainsi il est préférable de le protéger derrière un pare-feu.
Ce tutoriel décris précisément la marche à suivre dans le cas d\’un système GNU/Linux Debian 8.8 (Jessie), et est donc transposable à tout système UNIX apparenté et répondant aux normes POSIX, à savoir :
- Toute distribution de type GNU/Linux (Ubunutu, SuSe, RedHat, OpenWRT, …)
- Les systèmes de la famille BSD (FreeBSD, NetBSD, OpenBSD)
Et éventuellement : - Darwin OS, macPorts : partie du système UNIX libre devenue propriétaire via la distribution par la firme Apple
En aucun cas un quelconque système ou logiciel de le firme Microsoft ne peut être utilisé pour dérouler ce tutoriel, excepté de quelques amusantes expérimentations sur les portabilités qu\’offre CYGWIN !
Installation
Et bien là, c\’est assez pas compliqué.
\’\’\’Postfix\’\’\’ est le serveur de mail proposé ici !
$ apt-cache search \'^postfix$\' postfix - High-performance mail transport agent
Parfait, installons le, avec certaines bibliothèques pour le SSL :
$ sudo apt-get install postfix libqca2-plugin-cyrus-sasl libsasl2-modules
Première question posée par l\’installateur Debian :
General type of mail configuration: [ ] … [*] Internet Site
2ème :
hote.domaine.fr
Et c\’est tout pour Postfix !
Générer les certificats de sécurité
Dans les premiers instants, un compte d\’utilisateur ordinaire suffit pour générer les divers chaînons de sécurité.
Il est conseillé d\’effectuer cette opération dans un répertoire temporaire dédié, par exemple :
$ mkdir /tmp/pfx-ssl && cd /tmp/pfx-ssl
Générer la clé
Tout d\’abord, il nous fait générer une clé unique pour notre hôte/domaine :
$ openssl genrsa -des3 -out hote.domaine.fr.key 2048
Il est demandé de saisir une \ »passphrase\ », elle ne peut être vide : retenez la bien !
Le certificat de requête
Ensuite, il nous faut générer le \ »certificate request\ » à partir de cette clé :
$ openssl req -new -key hote.domaine.fr.key -out hote.domaine.fr.csr Enter pass phrase for hote.domaine.fr.key: >
Donc re-saisir la \ »passphrase\ » saisie juste avant …
Ensuite, nous subissons un interrogatoire :
Country Name (2 letter code) [AU]: > FR State or Province Name (full name) [Some-State]: > Aquitaine Locality Name (eg, city) []: > MA VILLE Organization Name (eg, company) [Internet Widgits Pty Ltd]: > BastBalt Organizational Unit Name (eg, section) []: > IT Common Name (e.g. server FQDN or YOUR name) []: > domaine.fr Email Address []: > eUh7S1j@exemple.com Please enter the following \'extra\' attributes to be sent with your certificate request A challenge password []: > An optional company name []: >
Il est conseillé de laisser vide les 2 dernières saisies.
Le certificat final
Nous reprenons les éléments crées précédemment pour aboutir à l\’ultime :
$ openssl x509 -req -days 365 -in hote.domaine.fr.csr -signkey hote.domaine.fr.key -out hote.domaine.fr.crt
Nous sommes donc en possession de 3 fichiers :
$ ls hote.domaine.fr.crt hote.domaine.fr.csr hote.domaine.fr.key
Supprimer la \’passphrase\’
À chaque sollicitation d\’un de ces certificats, la \’passphrase\’ sera demandée pour les valider, ce qui a pour énorme inconvénient de solliciter cette saisie à chaque démarrage, du démon postfix, donc à chaque démarrage de la machine, et pur tous ses services, etc …
Donc il est préférable de supprimer cette contrainte en saisissant une dernière fois ce mot-de-passe :
$ openssl rsa -in hote.domaine.fr.key -out mail.domain.tld.key.nopass Enter pass phrase for hote.domaine.fr.key: writing RSA key
Le C.A.
Et là, c\’est un peu troublant, mais on s\’auto-proclame autorité de certification (\’\’\’C\’\’\’ertificate \’\’\’A\’\’\’utority) pour 3650 jours :
$ openssl req -new -x509 -extensions v3_ca -keyout hote.domaine.fr-ca-key.pem -out hote.domaine.fr-ca-cert.pem -days 3650
[…] [Même questionnaire que précédemment !]
Utiliser les certificats
À présent, tous ces certificats doivent être utilisés par postfix.
\nIl faut utiliser les privilèges d\’administrateur, pour les installer soit :
- Spécifiquement à Postfix : /etc/postfix/ssl/
- Pour d\’autres démons : /etc/ssl/private/ && /etc/ssl/certs/
Dans le cas présent, certains certificats étant fournis pour certains services par certains registraires, moyennant finances, il est proposé de ne pas tout mélanger :
Nous créons un dossier dédié aux certificats de Postfix :
$ sudo mkdir /etc/postfix/ssl
Avec un peu de zèle, un sous-dosier pour les certificats CA :
$ sudo mkdir /etc/postfix/ssl/certs
Et d\’y copier notre arsenal précédemment généré :
$ cd /tmp/pfx-ssl && sudo cp hote.domaine.fr.csr hote.domaine.fr.crt /etc/postfix/ssl $ sudo cp hote.domaine.fr-ca-cert.pem hote.domaine.fr-ca-key.pem /etc/postfix/ssl/certs
Les faire appartenir à root, et ajuster les permissions :
$ sudo chown -R root:root /etc/postfix/ssl/
$ sudo chmod 600 /etc/postfix/ssl/certs/hote.domaine.fr-ca-key.pem
Il nous reste plus qu\’à informer Postfix de nos \ »manigances\ » …
Source
Avec tous mes remerciements au rédacteur de ce tutoriel sur le sujet : Create a self signed SSL key for Postfix
LA Configuration Main.Cf
Nous rentrons dans le coeur même de la configuration de postfix \’\’/etc/postfix/main.cf\’\’ :
#/etc/postfix/main.cf : Postfix Mail transport main configuration file
smtpd_banner = $myhostname ESMTP $mail_name (Hello Yu)
setgid_group = postdrop
biff = no
2bounce_notice_recipient = postmaster
# appending .domain is the MUA\’s job.
append_dot_mydomain = no
myhostname = hote
mydomain = domaine.fr
mydestination = $myhostname, localhost, localhost.$mydomain $myhostname.$mydomain
# /etc/mailname usualy content $myhostname.$mydomain
myorigin = /etc/mailname
# Aliases
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# Allowed network
mynetworks = 127.0.0.0/8
# For LAN usage, specify LAN network :
# mynetworks = 127.0.0.0/8 192.168.1.0/24
# If you want use external program … :
#mailbox_command = procmail -a \ »$EXTENSION\ »
# Mailbox configuration
home_mailbox = Mail/
mailbox_size_limit = 0
recipient_delimiter = +
# Your mail service provider
relayhost = mail.gandi.net:587
# TLS options for both client and server side
smtp_use_tls = yes
smtp_enforce_tls = yes
tls_append_default_CA = yes
smtp_tls_CAfile = /etc/postfix/ssl/certs/hote.domaine.fr-ca-cert.pem
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtp_tls_security_level = may
smtpd_tls_CAfile = /etc/postfix/ssl/certs/hote.domaine.fr-ca-cert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/hote.domaine.fr.crt
smtpd_tls_key_file = /etc/postfix/ssl/certs/hote.domaine.fr-ca-key.pem
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
tls_random_source = dev:/dev/urandom
smtpd_tls_security_level = may
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay.passwd
smtp_sasl_security_options = noanonymous
# Some restrictions
smtpd_recipient_restrictions = permit_mynetworks,check_relay_domains
# EOF
Config diverses : aliases et relay …
/etc/mailname
Il contient uniquement sur 1 seule ligne le nom de la machine ajouté du nom de domaine, dans le cas d\’un :
hote.domaine.fr
/etc/aliases
Les aliases, en plus de la première ligne par défaut nécessaire pour recevoir les mails d\’alerte de Postfix , ils peuvent être fort utile pour rediriger une adresse mail vers une autre.
En supposant que votre compte UNIX sur la machine soir \ »vous\ », votre adresse mail supposée sera donc : \’\’vous@hote.domaine.fr\’\’
# See man 5 aliases for format\n#postmaster: root\npostmaster: vous\nwebmaster: vous
Ainsi, les mails systèmes adressés à \’\’postmaster@hote.domaine.fr\’\’ et \’\’webmaster@hote.domaine.fr\’\’ seront redirigés inconditionnellement vers l\’adresse unique \’\’vous@hote.domaine.fr\’\’.
Pour que cette table de hachage soit lue par postfix, il faut en générer une version binaire \’\’/etc/aliases.db\’\’ :
$ sudo postalias /etc/aliases
/etc/postfix/relay.passwd
Ce fichier contient des informations critiques, à savoir vos identifiants chez le (ou les) fournisseur(s) de services mail que vous utilisez, il se présente sous la forme :
mail.gandi.net compte@exemple.fr:m0tDePassE
Ensuite, il faut compiler une version binaire avec \’\’postmap\’\’ :
$ sudo postmap /etc/postfix/relay.passwd
Il est important de lui donner les bonnes permissions, seul l\’utilisateur root y a accès :
$ sudo chown root:root /etc/postfix/relay.passwd*
$ sudo chmod 600 /etc/postfix/relay.passwd*
\n\n
Répétition générale
Il est possible, même fréquent, qu\’une ou des erreurs se soient glissées …
Essayonsde vérifier la config postfix :
sudo postconf -n
Nous relançons le service :
$ sudo service postfix restart
Et à ce stade il est conseillé de \ »lire le journal\ » :
sudo tail -f /var/log/mail.log\n […]\n Jul 22 19:33:58 hote postfix/master[18217]: terminating on signal 15\n Jul 22 19:33:58 hote postfix/master[21580]: daemon started -- version 2.11.3, configuration /etc/postfix
Nous allons voir en dialoguant directement en SMTP avec le serveur :
$ telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is \'^]\'.
220 hote ESMTP Postfix (Hello Yu)\nELHO hote
250 hote\nMAIL FROM: bastien@domaine.fr
250 2.1.0 Ok\nRCPT TO: bastien.baltazar@gmail.com
250 2.1.5 Ok\nDATA\n 354 End data with .
Envoi 001 from Localhost/Telnet / NO TLS
--
Moi
.
250 2.0.0 Ok: queued as A94DC5EEA4
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
$
Le serveur indique qu\’il a prit en charge le mail, ce qui ne veut pas dire qu\’il est arrivé à destination !
Nous regardons si notre mail n° A94DC5EEA4 est encore présent dans la queue :
$ mailq\n -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------\n A94DC5EEA4 340 Sat Jul 22 19:40:06 bastien@domaine.fr\n (connect to mail.gandi.net[2001:4b98:c:521::11]:587: Network is unreachable)\n bastien.baltazar@gmail.com\n -- 0 Kbytes in 1 Request.
Il y a donc un soucis : Postfix ne parviens pas à contacter notre fournisseur de services.
À noter que le protocole IPv6 est utilisé par défaut dans le cas présent.
Dans le journal \’\’mail.log\’\’ :
Jul 22 19:41:04 hote postfix/qmgr[21582]: A94DC5EEA4: from=bastien@domaine.fr, size=340, nrcpt=1 (queue active)\nJul 22 19:41:04 hote postfix/smtp[22023]: error: open database /etc/postfix/relay.passwd.db: No such file or directory\nJul 22 19:41:05 hote postfix/smtp[22023]: warning: hash:/etc/postfix/relay.passwd is unavailable. open database\n/etc/postfix/relay.passwd.db: No such file or directory\nJul 22 19:41:05 hote postfix/smtp[22023]: warning: hash:/etc/postfix/relay.passwd lookup error for \"mail.gandi.net\"\nJul 22 19:41:05 hote postfix/smtp[22023]: warning: A94DC5EEA4: smtp_sasl_passwd lookup error\nJul 22 19:41:05 hote postfix/smtp[22023]: A94DC5EEA4: local data error while talking to mail.gandi.net[217.70.184.11]\nJul 22 19:41:05 hote postfix/smtp[22023]: connect to mail.gandi.net[2001:4b98:c:521::11]:587: Network is unreachable
L\’exemple est trivial, il y a eu un oubli : générer le binaire \’\’/etc/postfix/relay.passwd.db\’\’, tel qu\’indiqué ci-dessus.
Une fois ceci corrigé, nous rechargeons la configuration :
$ sudo postfix reload
Et puis nous provoquons un envoi du contenu de la queue :
$ sudo postfix flush
Que nous nous empressons de vérifier :
$ mailq\n Mail queue is empty
Ce qui signifie dans le cas présent que notre mail expérimental est dans les mains du fournisseur de services Gandi
Ainsi que l\’adresse mail de destination utilisée durant l\’expédition manuelle a bien reçu ce mail expérimental, en consultant cette boite mail depuis un client mail (Thunderbird), et y trouvons un nouveau mail dans la boite de réception, contenant ce que nous avons saisis une fois connecté au serveur SMTP (\ »Test 001 from Localhost/Telnet / NO TLS […]\ ») !
Configurer les clients
Hébergé : LAMP::PHP
À priori, il n\’y a aucune configuration particulière à appliquer. Dans certains cas, il peut même opportun de commenter les deux lignes suivantes relatives au SMTP réservées à Windows dans le fichier \’\’php.ini\’\’ :
[mail function]\n ; For Win32 only.\n ; http://php.net/smtp\n ; SMTP = localhost\n ; http://php.net/smtp-port\n ; smtp_port = 25\n
LAN : Thunderbir
Il suffit simplement sur n\’importe quel poste de travail adressé sur un réseau spécifié dans la variable mynetworks de /etc/postfix/main.cf, d\’utiliser une configuration très basique :
Hôte : hote.domaine.lan\n Port : 25\n Authentification : Aucune\n TLS/SSL : Non
Conclusion
Voilà un serveur de mail relai SMTP pleinement fonctionnel pour un usage très courant.
Son immense avantage consiste à déléguer la gestion des boites mail des utilisateurs à des fournisseurs de services experts en la matière, et ainsi de s\’éviter l\’experte et lourde administration d\’un serveur de mail rattaché à un nom de domaine public (FQDN)