Installer Postfix en local pour un poste de travail
Pour une correspondance entre vos utilisateurs d'un poste de travail et avec les applications locales de la machine, il est important d'installer un serveur de courrier MTA. Pour plus d'informations sur la messagerie lire Comment fonctionne le courriel sous Linux ?, et sur les principes du serveur Postfix lire Comment configurer sa distribution de courriels systèmes MTA avec Postfix ?
Installation du serveur de messagerie Postfix
Installez les paquets du serveur de messagerie postfix. Choisir «pas de configuration» si l'installation demande de paramétrer le serveur de messagerie.
Installer le client Mutt de messagerie MUA mutt (les clients MUA de mailutils et de bsd-mailx ne supportent que le format mbox pour la gestion locale, vous pouvez aussi utiliser Neomutt avec plus de fonctionnalités en remplacement de Mutt Neomutt).
Définir le gestionnaire de messagerie
Vous devez définir qui va avoir la supervision de la messagerie. Donc si l'utilisateur root est le superviseur de la messagerie, ou si c'est un utilisateur du système (serveur ou desktop Linux). Le fichier /etc/aliases (kate /etc/aliases
) est à paramétrer comme suit.
Avec l'utilisateur directement gestionnaire de messagerie :
postmaster: utilisateur
Avec l'utilisateur gestionnaire de la machine Linux (relais postmater à l'utilisateur root) :
postmaster: root root: utilisateur
sudo postalias /etc/aliases
Configurer le DNS pour votre serveur de messagerie
Pour configurer un serveur DNS local avec Bind9 pour votre poste de travail.
Pour configurer un serveur DNS local avec Dnsmasq pour votre poste de travail.
Si vous ne voulez pas d'un serveur DNS dédié à votre messagerie
Pour créer un domaine dns local pour votre messagerie :
sudo hostnamectl set-hostname ma-machine.local.fr --static
Remplacez local.fr par le nom DNS que vous voulez, et ma-machine avec le nom d'ordinateur.
Vérifiez que le DNS fonctionne bien :
hostname
retourne le nom d'ordinateur
ma-machine.local.fr
hostname -d
retourne le domaine DNS de l'ordinateur
local.fr
Configurer le serveur de messagerie par le paquet d'installation
Vous pouvez maintenant configurer le serveur de messagerie Postfix.
Si votre application est déjà installée, tapez :
sudo dpkg-reconfigure postfix
Entrez les détails suivants Touche tabulation pour basculer sur OK, et touche Entrée pour valider le message d'information.
Choisissez le type de configuration automatique Postfix de serveur de messagerie que vous voulez faire. Ici c'est Local Uniquement
Ici on va fixer le non de domaine de messagerie (par exemple @local.fr). Donc saisissez le nom du domaine de messagerie que vous voulez pour vos courriels locaux des utilisateurs de la machine.
La variable du fichier Ubuntu /etc/mailname et le paramètre Postfix myorigin sont donc paramétrés ici.
Ici on fixe le gestionnaire de messagerie.
postmaster: root
)
Ici on fixe les domaines de messagerie à accepter comme courriels au départ. Par exemple pour des adresses @Ma-Machine (résultat de la commande bash hostname
) ajouter Ma-Machine, pour des courriels @local.fr ajouter local.fr, etc.
Donc dans notre cas :
Ma-Machine, Ma-Machine.local.fr, localhost.localdomain, localhost, local.fr
C'est la variable mydestination du fichier /etc/postfix/main.cf qui est modifiée.
Définit sur quel réseau distribuer les courriels.
127.0.0.1/32 [::1]/128
C'est la variable mynetworks du fichier /etc/postfix/main.cf qui est modifiée.
Fixe un taille limite pour les boites aux lettres des comptes utilisateur du système.
C'est la variable mailbox_size_limit du fichier /etc/postfix/main.cf qui est modifiée.
Définit une extension pour des sous domaines de messagerie.
C'est la variable recipient_delimiter du fichier /etc/postfix/main.cf qui est modifiée.
Définit les protocoles du réseaux de transport qui doivent être utiliser.
C'est la variable inet_protocols du fichier /etc/postfix/main.cf qui est modifiée.
Emplacement des boîtes aux lettres des utilisateurs du système
Nous remarquons que le «configurateur» de Postfix ne demande pas de préciser où les boîtes aux lettres des utilisateurs sont situées.
La commande de la file d'attente :
postconf queue_directory
renvoie
queue_directory = /var/spool/postfix
La commande de boîtes postales :
postconf mail_spool_directory
renvoie
mail_spool_directory = /var/mail
Si on passe la commande de boîtes aux lettres utilisateurs :
postconf home_mailbox
Nous avons :
home_mailbox =
Nous voyons alors que les boîtes aux lettres des utilisateurs sont des boîtes postales et se situent dans /var/mail/utilisateur.
Il nous faudra donc éditer le fichier /etc/postfix/main.cf (kate /etc/postfix/main.cf
) et ajouter la variable home_mailbox pour vos utilisateurs.
Par exemple :
# au format maildir home_mailbox = .local/share/courriels/arrivées/
ou passer la commande dans un terminal :
sudo postconf -e home_mailbox=.local/share/courriels/arrivées/
afin que le courriel soit directement distribué dans la boîte aux lettres locale de l'utilisateur.
Pour valider la configuration dans Postfix, tapez :
systemctl restart postfix
Configurer le client mail MUA système
Testez la lecture de la boîte aux lettres :
mutt
Si vous avez un message du genre :
/home/utidisateur/Mail n'existe pas. Le créer ? ([oui]/non):
C'est que votre client mail est mal configuré.
Tapez :
n
puis pour quitter Mutt
q
Éditer le fichier .muttrc dans votre dossier /home/utilisateur (kate ~/.muttrc
)
Et ajouter ou modifier ces lignes :
# Configuration de base set realname="{Prénom NOM}" set header_cache=~/.mutt/cache/headers set certificate_file=~/.mutt/certificates set message_cachedir=~/.mutt/cache/bodies set beep set use_from = yes # Boite de réception set spoolfile=~/.local/share/courriels/arrivées/ # Boite aux lettres de Mutt set folder=~/.local/share/courriels # Autres dossiers set postponed=+brouillons set record=+envoyés # Encodage à utiliser set charset=utf-8 set send_charset=utf-8 # Format de la date à afficher avant les citations lors d'une réponse set date_format="%A %d %B %Y à %I:%M:%S%p" set index_format="%4C %Z %{%b %d} %-15.15F (%4l) %s" set fast_reply set include=yes # Configuration SMTP set sendmail="/usr/sbin/sendmail"
Configurer une distribution SMTP locale sécurisée
Bloquer le port 25 SMTP standard
Test de la connexion sur le port 25
Déjà testons que le port 25 est ouvert. Pour cela tapez la commande :
telnet localhost 25
Ce qui affiche
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 Ma-Machine ESMTP Postfix (Ubuntu)
Tapez :
HELO Ma-Machine
retourne
250 Ma-Machine
Puis saisissez l'identifiant d'un compte local :
MAIL FROM: utilisateur
retourne
250 2.1.0 Ok
Saisissez le destinataire :
RCPT TO: utilisateur@localhost
retourne
250 2.1.5 Ok
Saisissez :
DATA
retourne
354 End data with <CR><LF>.<CR><LF>
Et enfin vous pouvez saisir votre courriel :
From: utilisateur To: utilisateur Subject: Test de message sur port 25 Ceci est un test d'envoi sur port 25 Merci de votre coopération .
retourne
250 2.0.0 Ok: queued as 9E77AA02321
Pour quitter tapez :
QUIT
retourne
221 2.0.0 Bye Connection closed by foreign host.
Vous avez expédié un courriels
Blocage du port 25
Modifier le fichier master.cf (kate /etc/postfix/master.cf
)
Changer
smtp inet n - y - - smtpd
en
587 inet n - y - - smtpd -o content_filter=dksign:[127.0.0.1]:12028
Redémarrage de Postfix pour valider les changements :
systemctl restart postfix
Test du verrouillage du port 25
Pour cela taper :
telnet localhost 25
retourne
Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused
Test de l'accès sur le port 587
Pour cela taper :
telnet localhost 587
retourne
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 Ma-Machine ESMTP Postfix (Ubuntu)
Tapez :
HELO Ma-Machine
retourne
250 Ma-Machine
Puis saisissez l'identifiant d'un compte local :
MAIL FROM: utilisateur
retourne
250 2.1.0 Ok
Tapez pour quitter :
QUIT
retourne
221 2.0.0 Bye Connection closed by foreign host.
Renforcer la sécurité
Vous pouvez modifier la directive
smtpd_banner = $myhostname ESMTP (Courriels)
dans le fichier main.cf si vous voulez plus de sécurité. Cela retournera lors de la connexion telnet sur le port 587 :
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 Ma-Machine ESMTP (Courriels)
Mettre en place la connexion TLS
Pour valider le transport TLS il faut modifier le fichier main.cf (kate /etc/postfix/main.cf
) comme suit :
# TLS pour le serveur smtpd de Postfix # Utilise le générateur de nombres aléatoires de Linux tls_random_source = dev:/dev/urandom # Active le protocole de cryptage TLS smtpd_use_tls = yes # N'autorise que les connections TLS smtpd_tls_auth_only = yes # Niveau de sécurité dans la négociation du protocole smtpd_tls_security_level = may # Les clefs du cryptage smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key # TLS pour le client # Active le protocole de cryptage TLS smtp_use_tls = yes # Niveau de sécurité dans la négociation du protocole smtp_tls_security_level = may # Les clefs du cryptage smtp_tls_CApath = /etc/ssl/certs # Répertoire de cache pour la communication smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
Tester le fonctionnement de TLS
Connexion normale Tapez :
telnet localhost 587
retourne
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 Ma-Machine ESMTP (Courriels)
Tapez :
ehlo Ma-Machine
retourne
250-Ma-Machine 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING
Tapez :
MAIL FROM: utilisateur
retourne
250 2.1.0 Ok
Tapez :
QUIT
retourne
221 2.0.0 Bye Connection closed by foreign host.
Pour vous connecter en TLS :
openssl s_client -starttls smtp -connect localhost:587
retourne
CONNECTED(00000003) … Start Time: 1598437512 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no Max Early Data: 0 --- read R BLOCK
Tapez :
ehlo Ma-Machine
retourne
250-Ma-Machine 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING
Tapez :
MAIL FROM: utilisateur
retourne
250 2.1.0 Ok
Tapez :
QUIT
retourne
221 2.0.0 Bye Connection closed by foreign host.
Bloquer les connections non TLS
Pour cela il faut modifier le fichier master.cf (kate /etc/postfix/master.cf
)
Modifier le fichier comme ci-dessous :
#587 inet n - y - - smtpd # -o content_filter=dksign:[127.0.0.1]:12028 ⋅⋅⋅ submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_tls_auth_only=yes -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions -o smtpd_recipient_restrictions= -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
Vérifier le blocage des connexions non TLS
Tester la connexion telnet :
telnet localhost 587
retourne
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 Ma-Machine ESMTP (Courriels)
Taper :
ehlo Ma-Machine
retourne
250-Ma-Machine 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING
Taper :
MAIL FROM: utilisateur
retourne
530 5.7.0 Must issue a STARTTLS command first
Taper :
quit
retourne
221 2.0.0 Bye Connection closed by foreign host.
Tester la connection TLS :
openssl s_client -starttls smtp -connect localhost:587
retourne
CONNECTED(00000003) … read R BLOCK
Tapez :
ehlo Ma-Machine
retourne
250-Ma-Machine 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH DIGEST-MD5 NTLM CRAM-MD5 PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING
Tapez :
MAIL FROM: utilisateur
retourne
250 2.1.0 Ok
Tapez :
QUIT
retourne
221 2.0.0 Bye Connection closed by foreign host.
Vos échanges de courriels sont maintenant cryptés lors du transport en SMTP.
On peut encore Renforcer la sécurité du cryptage TLS dans Postfix.
C'est maintenant à l'authentification système au niveau utilisateur que nous allons agir pour renforcer la sécurité
Mettre en place l'authentification SASL
Si vous voulez pousser la sécurité à l'extrême, vous pouvez authentifier vos utilisateurs de façon plus poussé pour la messagerie.
Installer les applications complémentaires
Pour la partie authentification installez les paquets libsasl2-modules sasl2bin.
Postfix doit être membre du groupe sasl
getent group sasl
doit retourner
sasl:x:45:postfix
Pour ajouter l'utilisateur «postfix» au groupe sasl, tapez dans un terminal :
sudo adduser postfix sasl
Voir quels sont les types d'authentifications acceptés par Postfix
Pour le serveur smtpd de Postfix :
postconf -a
retourne
cyrus dovecot
Pour le client smtp de Posfix :
postconf -A
retourne
cyrus
Configurons le serveur smtpd de Postfix pour accepter l'authentification SASL Cyrius
Afin de permettre l'authentification SASL Cyrius par Postfix, il va être nécessaire de modifier la configuration générale. Nous allons ajouter les options suivantes à main.cf afin de n'autoriser l'accès au SMTP qu'aux utilisateurs identifiés (par un login qui est leur adresse e-mail, et le mot de passe de ce compte e-mail).
Éditer le fichier main.cf (kate /etc/postfix/main.cf) et modifiez/ajoutez les lignes suivantes :
# Paramétrages SASL du serveur smtpd de Postfix # Variable postfix contenant le hostname Ma-Machine smtpd_sasl_local_domain = $myhostname # Active l'authentification SASL pour le serveur smtpd de Postfix smtpd_sasl_auth_enable = yes # Interdit les méthodes qui autorisent l'authentification anonyme. smtpd_sasl_security_options = noanonymous # Active l’interopérabilité avec les clients SMTP qui implémentent une version obsolète de la commande AUTH (RFC 2554). MicroSoft Outlook Express version 4 et Exchange version 5.0 sont des exemples de tels clients. broken_sasl_auth_clients = no # Pour autoriser le relais de courriels des utilisateurs authentifiés smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
Configurer le serveur d'authentification Cyrus
Créer et éditer le fichier smtpd.conf (kate /etc/postfix/sasl/smtpd.conf
) avec ces valeurs :
pwcheck_method: saslauthd # Fonctionnement avec le service saslauthd de Cyrus mech_list: PLAIN LOGIN # Les méthodes d'authentifications PLAIN et LOGIN sont permises
Créer un fichier de configuration Cyrus saslauthd-postfix pour Postfix :
sudo cp /etc/default/saslauthd /etc/default/saslauthd-postfix
Modifier le fichier saslauthd-postfix (kate /etc/default/saslauthd-postfix
) suivant :
START=yes NAME="saslauthd-postf" # Maximum 15 caractères OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd" # Chroot du serveur Postfix dans /var/spool/postfix
Créer le sous répertoire dans le chroot de Postfix :
sudo dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
Redémarrer le service saslauthd :
systemctl restart saslauthd
Pour valider la configuration de postfix, tapez :
systemctl restart postfix
Configurer le client mail MUA système pour l'authentification SASL
Le client Mutt devrait fonctionner de façon transparente en local avec cette configuration.
Pour vérifier l’authentification au serveur SMTP en TLS SASL. Créer un Hash (code crypté) pour votre utilisateur local.
python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"utilisateur@local.fr", encoding="ascii")).decode("ascii"))'
ou en perl:
perl -MMIME::Base64 -le 'print encode_base64("utilisateur\@local.fr");'
Ce qui donne en sortie :
dXRpbGlzYXRldXJAbG9jYWwuZnI=
Créer un Hash pour le mot de passe de l'utilisateur local.
python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"mdp_de_utilisateur", encoding="ascii")).decode("ascii"))'
ou en perl:
perl -MMIME::Base64 -le 'print encode_base64("mdp_de_utilisateur");'
Ce qui donne en sortie :
bWRwX2RlX3V0aWxpc2F0ZXVy
Créer un Hash (code crypté de connexion) pour l'identifiant avec mot de passe de l'utilisateur local.
python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"\000utilisateur@local.fr\000mdp_de_utilisateur", encoding="ascii")).decode("ascii"))'
ou en perl:
perl -MMIME::Base64 -le 'print encode_base64("\000utilisateur\@local.fr\000mdp_de_utilisateur");'
Ce qui donne en sortie :
AHV0aWxpc2F0ZXVyQGxvY2FsLmZyAG1kcF9kZV91dGlsaXNhdGV1cg==
Pour vérifier qu'il n'y a pas d'erreurs :
python3 -c 'import sys; from base64 import b64decode; print(b64decode("AHV0aWxpc2F0ZXVyQGxvY2FsLmZyAG1kcF9kZV91dGlsaXNhdGV1cg==").decode("ascii"))'
ou en perl
perl -MMIME::Base64 -le 'print decode_base64("AHV0aWxpc2F0ZXVyQGxvY2FsLmZyAG1kcF9kZV91dGlsaXNhdGV1cg==");'
Pour vous connecter avec cet identifiant crypté :
openssl s_client -starttls smtp -connect localhost:587
Pour l'authentification en login :
AUTH LOGIN
retourne
334 VXNlcm5hbWU6
VXNlcm5hbWU6 c'est «Username:» en crypté.
Saisissez votre identifiant utilisateur@local.fr crypté :
dXRpbGlzYXRldXJAbG9jYWwuZnI=
retourne
334 UGFzc3dvcmQ6
UGFzc3dvcmQ6 c'est «Password:» en crypté.
Saisissez votre mot de passe utilisateur crypté :
bWRwX2RlX3V0aWxpc2F0ZXVy
retourne
235 2.7.0 Authentification successful
Pour l'authentification en direct (PLAIN) :
Maintenant c'est le code de Hash de l'identifiant avec le mot de passe applicatif qu'il faut saisir pour l'authentification en clair :
AUTH PLAIN AHV0aWxpc2F0ZXVyQGxvY2FsLmZyAG1kcF9kZV91dGlsaXNhdGV1cg==
retourne
325 2.7.0 Authentification successful
Si le compte de connexion n'est pas bon vous aurez :
535 5.7.8 Error: authentication failed: no mechanism available
Si l'identifiant PLAIN crypté n'est pas bon vous aurez :
535 5.7.8 Error: authentication failed: another step is needed in authentication
Si le protocole de connexion n'est pas bon vous aurez:
535 5.7.8 Error: authentication failed: bad protocol / cancel
Etc.
Maintenant nous avons un système de messagerie très sécurisé. On peut encore améliorer le système d'authentification SASL pour cela il faut voir Configuration avancée de SASL Cyrus avec Postfix.
On peut aussi étendre cette configuration avec un relaie sur un serveur de messagerie du réseau ou d'internet
Considérations de sécurités sur une architecture LAN et au-delà
Pour renforcer la sécurité si votre poste de travail est dans un réseau local, il vous faudra centraliser les messages sur des boites aux lettres postales pour éviter les failles de sécurités des utilisateurs locaux peux respectueux des consignes de sécurités. Pour un poste de travail multi-utilisateurs chez soit, ce genre de configuration de boîtes aux lettres par utilisateurs peut-être intéressante pour la messagerie système et entre utilisateurs locaux du poste de travail.
Dans un environnement professionnel où le serveur de messagerie est sur un réseau local, il est préférable d'avoir des boites aux lettres postales (/var/mail/utilisateur). Cela permet d'avoir plusieurs niveaux de contrôles de sécurités.
Le premier aux niveau du serveur de messagerie MTA (filtrages SPAM et antivirus).
Le deuxième au niveau du MDA (Mail Delivery Agent aussi avec des outils anti-SPAMs et anti-virus) qu'il faudra installer voir Comment configurer sa distribution de courriels locale MDA ?.
Un troisième niveau peut-être mis en place au niveau du client de messagerie MUA sur le poste de travail avec un serveur local sur le modèle ci-dessus complété par un relaie vers le serveur de messagerie du réseau
Pour cela il faut supprimer la directive
home_mailbox= ...
du fichier de configuration main.cf de Postfix. Et modifier le client MUA Mutt avec
set spoolfile=/var/mail/$USER
dans le fichier .muttrc du répertoire home de l'utilisateur.