Synopsis
Le mail est un des moyens de communication les plus utilisés dans le monde, ce qui créer automatiquement des dérives comme le Spam et autres usurpations. Il faut savoir que le protocole SMTP (Simple Mail Transfert Protocol) date des années 80 et comme son nom l’indique est assez simple, il n’a donc pas été pensé pour être sécurisé.
Étant donné que dans la conception ouverte du SMTP n’importe qui peut en théorie envoyer un mail en se faisant passer pour qui il veux, la logique s’est tourné vers une vérification à la réception via DKIM, SPF, DMARK et Antispam … ainsi qu’une sécurisation via SMTP over STARTTLS/SSL.
Voilà pourquoi la plupart des Antispam utilisent des RBL (Real-time Blackhole List) ou DNSBL (Domain Name System-based Blackhole List) dont une qui liste toutes les IP publiques non « professionnelles » pour s’assurer que les ordinateurs d’utilisateurs lambda victimes de malwares ne se transforment en bots envoyant massivement du spam. D’ailleurs certains opérateurs bloquent les requêtes sortantes sur le port SMTP (25).
Une mesure efficace pour Monsieur Michu, mais gênante pour l’utilisateur avancé qui souhaite héberger son propre serveur mail. Voila pourquoi ce post va vous permettre de solutionner ceci avec la mise en place d’un relais SMTP authentifié.
Prérequis
- Un nom de domaine.
- Un serveur sous Ubuntu Server LTS (ex. 16.04) comme par exemple un VPS chez OVH (P’tite pub…).
- Une connexion en root (Pour éviter le sudo :D).
- Configuration DNS (Voir plus bas)
- Reverse DNS (Record type A).
- SPF (Record type TXT)
- DMARC (Record type TXT)
- Reverse DNS du VPS configuré.
Installation des paquets
- Installation de Postfix est ses dépendances.
apt-get install postfix sasl2-bin libsasl2-modules
- Sélectionner Internet Site
- Utiliser le nom configuré dans le reverse DNS du VPS.
Authentification SASL
L’authentification SASL va être gérée par le daemon saslauthd, avec une base d’identifiants sasldb.
Éditer le fichier /etc/default/saslauthd et remplacer ces lignes :
- Autoriser le daemon à démarrer.
START=no
START=yes
- Forcer l’authentification via la DB SASL plutôt que PAM.
MECHANISMS="pam"
MECHANISMS="sasldb"
- Utiliser l’environnement de Postfix.
OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
- Faire un lien symbolique pour l’utilisation de l’environnement Postfix chrooté.
cd /var/run mv saslauthd saslauthd.bak ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
- Démarrer le service saslauthd.
service saslauthd start
- Créer un compte utilisateur qui sera autorisé à relayer, à utiliser plus tard sous la forme « user@domain ».
saslpasswd2 -u domain user
Configuration de postfix
Le daemon SMTP de Postfix écoute par défaut sur le port 25, hors pour l’authentification nous allons le passer sur le port 587 (submission).
- Editer le fichier /etc/postfix/master.cf et retirer le # au début de la ligne « submission » et l’ajouter au début de « smtp ».
- S’assurer aussi que la ligne utilise les 4 tirets, pour autoriser l’environnement chrooté.
#smtp inet n - - - - smtpd #smtp inet n - - - 1 postscreen #smtpd pass - - - - - smtpd #dnsblog unix - - - - 0 dnsblog #tlsproxy unix - - - - 0 tlsproxy #submission inet n - - - - smtpd
- Ajouter cette ligne pour forcer l’Pv4 sur Gmail
smtp-ipv4 unix - - - - - smtp -o inet_protocols=ipv4
- Ajouter ces lignes à la fin du fichier /etc/postfix/main.cf pour forcer Postfix à utiliser SASL en rejetant les requêtes non authentifiées.
smtpd_sasl_local_domain = $mydomain smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = no smtpd_recipient_restrictions = permit_sasl_authenticated,reject
- Créer le fichier /etc/postfix/sasl/smtpd.conf, pour activer communication entre Postfix et saslauthd.
pwcheck_method: saslauthd saslauthd_path: /var/run/saslauthd/mux mech_list: PLAIN LOGIN
- Permettre à Postfix de communiquer avec le daemon saslauthd en ajoutant l’utilisateur au groupe.
adduser postfix sasl
- Redémarrer le service Postfix pour prendre les modification en compte.
service postfix restart
Forcer IPv4 pour Gmail
- Créer le fichier transport.
/etc/postfix/transport
- Y ajouter cette ligne.
gmail.com smtp-ipv4:
- Ajouter transport au lookup tables Postfix.
postmap /etc/postfix/transport
- Ajouter ces lignes à la fin du fichier /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport compatibility_level=2
- Prise en compte des modifications sur Postfix.
service postfix reload
Génération des certificats SSL
- Afin d’exploiter le SSL, il va falloir générer des certificats pour Postfix.
mkdir /etc/postfix/ssl cd /etc/postfix/ssl/ openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024 chmod 600 smtpd.key openssl req -new -key smtpd.key -out smtpd.csr
- Les réponses ne sont pas très importantes sauf pour le CN.
Common Name (CN) : <FQDN_Reverse_DNS>
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt openssl rsa -in smtpd.key -out smtpd.key.unencrypted mv -f smtpd.key.unencrypted smtpd.key openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
- Répondre aux questions de la même façon qu’à l’étape précédente.
- Activation de TLS dans Postfix via /etc/postfix/main.cf.
# TLS parameters smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key smtpd_use_tls = yes smtpd_tls_loglevel = 1 smtpd_tls_auth_only = no smtpd_recipient_limit = 100 smtp_tls_security_level = may smtpd_tls_received_header = yes smtp_tls_note_starttls_offer = yes smtpd_tls_session_cache_timeout = 3600s smtpd_helo_restrictions = reject_invalid_hostname smtpd_sender_restrictions = reject_unknown_address tls_random_source = dev:/dev/urandom smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
Cependant début 2018, la RFC 83146 a finalement affecté officiellement le port 465 au protocole SMTP avec TLS implicite.
- Il est donc possible d’éditer le fichier /etc/postfix/master.cf et de modifier « submission » par « smtps ».
#smtp inet n - - - - smtpd
#smtp inet n - - - 1 postscreen
#smtpd pass - - - - - smtpd
#dnsblog unix - - - - 0 dnsblog
#tlsproxy unix - - - - 0 tlsproxy
smtps inet n - - - - smtpd
- Redémarrer le service Postfix pour prendre les modifications en compte.
service postfix restart
- Voila à quoi devrait ressembler votre fichier /etc/postfix/main.cf.
# See /usr/share/postfix/main.cf.dist for a commented, more complete version smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no readme_directory = no # appending .domain is the MUA's job. append_dot_mydomain = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key smtpd_use_tls = yes smtpd_tls_loglevel = 1 smtpd_tls_auth_only = no smtpd_recipient_limit = 100 smtp_tls_security_level = may smtpd_tls_received_header = yes smtp_tls_note_starttls_offer = yes smtpd_tls_session_cache_timeout = 3600s smtpd_helo_restrictions = reject_invalid_hostname smtpd_sender_restrictions = reject_unknown_address tls_random_source = dev:/dev/urandom smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache #Postfix smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = smtp.myoffice.ovh alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = $myhostname, smtp.myoffice.ovh, localhost.myoffice.ovh, , localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 20480000
message_size_limit = 20480000 recipient_delimiter = + inet_interfaces = all inet_protocols = all #SASL Authentication smtpd_sasl_local_domain = $mydomain smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = no smtpd_recipient_restrictions = permit_sasl_authenticated,reject
Configuration du Firewall (UFW)
- Installation des paquets.
apt-get install ufw
- Vérifier les règles en place.
ufw status
- Bloquer les ports en entrée (Incoming).
ufw default deny incoming
ufw default allow outgoing
- Autoriser des ports en entrée (ex. SSH/SMTP)
ufw allow 22/tcp ufw allow 587/tcp ufw allow 465/tcp
- Activer le Firewall UFW.
ufw enable
Configuration des Record DNS
Ci-dessous un récapitulatif des différents Record DNS à configurer sur la zone mondomaine.fr, avec des exemples.
VPS Name : vps VPS Domain : mondomaine.fr VPS FQDN : vps.mondomaine.fr VPS IP : 1.2.3.4 IP Publique serveur d'envoi (ex. Exchange) : 2.3.4.5
- Reverse DNS (Type A)
<VPS_NAME> IN A <VPS_IP>
vps IN A 1.2.3.4
- SPF (Type TXT)
IN TXT "v=spf1 +ip4:<SOURCE_IP> +ptr:<DOMAIN_VPS> +mx ip4:<VPS_IP> ~all"
IN TXT "v=spf1 +ip4:2.3.4.5 +ptr:mondomaine.fr +mx ip4:1.2.3.4 ~all"
- DMARC (Type TXT)
_dmarc IN TXT "v=DMARC1; p=none"
Configuration du serveur mail
Le but est maintenant de dire au Mail Server de router ses mails en sortie vers notre VPS.
- Pour Exchange il faut configurer le Send Connector pour utiliser le FQDN du VPS en Smart Host (Route mail through smart hosts).
Test de la configuration
Pour les tests de la configuration je vous conseille d’utiliser MXToolbox et Mail Tester, sans oublier de specifier le port (ex. vps.mondomaine.fr:587)
Bonjour j’ai effectuer toutes les manipulations et cote dns ca a l’air bon mais seulement quand j’essaye d’envoyer un mail cela ne fonctionne pas en tant que smtp server j’ai bien mit vps.domaine.fr en username j’ai mit vps et mot de passe le mien en email d’envoie j’ai mit ceci [email protected] et j’ai la reponse echec d’envoie du courrier pouvez vous m’aider ?
Cordialement super tuto
Bonjour,
Vous utilisez exactement le même OS ?
Je vous conseille d’utiliser le logiciel SMTP Diag Tool pour avoir en temps réel le message d’erreur (https://www.adminkit.net/smtp_diag_tool.aspx).
Si c’est une erreur d’authentification revoir SASL, attention c’est « saslpasswd2 -c -u domain username » pour au final faire « username@domain » sur le serveur SMTP, voir recopier mon exemple de configuration de main.cf.
Créer un user :
saslpasswd2 -c -u <domain> <username>
Modifier le password :
saslpasswd2 -u <domain> <username>
Supprimer un user :
saslpasswd2 -d -u <domain> <username>
Lister les users :
sasldblistusers2
Excellent tuto mais la machine doit etre dans le meme LAN je suppose ? (smtpd_relay_restrictions = permit_mynetworks)
je vais retirer ça pour le mettre sur un petit VPS
Merci pour le com’, concernant la restriction elle permet de bloquer le relay sans authentification.
Étant donné que nous allons être authentifié, il autorisera notre réseau.
Bon
apt update & apt upgrade
Plus rien ne fonctionne
auth login to postfix meet 454 4.7.0 Temporary authentication failure: generic failure sur le smarthost exchange
Je seche
Merci pour ton aide
Je me réponds à moi même
Suite à l’update (21/05/2020 sous Ubuntu 18.04 LTS)
il faut
submission inet n – y – – smtpd