Postfix
.:[ Serveur de Messagerie ]:.
Filtrage anti-spam : Anti-Spam SpamAssassin | Anti-Virus Clamav
Filtrage anti-virus : Plateforme de filtrage Amavis >> Amavis avec MySQL
Plus de fonctions : Ajouter un Disclaimer | Signature DKIM | Mailman | Maildrop
Clients de messagerie : Configurer Thundirbird | Configurer Roundcube
Pour aller plus loin : Commandes messagerie | DNSBL | MX Backup
Présentation
Postfix est un serveur mail SMTP (Simple Mail Transfer Protocol) appelé aussi MTA pour Mail Transport Agent. Son rôle est d'assurer le traitement des mails aussi bien à l'envoi qu'à la réception.
Pour que les utilisateurs puissent récupérer leur message, Postfix devra être couplé à un service de relève de message basé sur le protocole POP (Post Office Protocol) et/ou IMAP (Internet Message Access Protocol). Nous utiliseront le service courier. L'authentification des utilisateurs sur le serveur mail s'effectuera par l'intermédiaire du daemon saslauth.
Pour faciliter la compréhensions et le fonctionnement de Postfix, cette documentation explique l'installation du système pas à pas avec divers tests pour valider le fonctionnement attendu.
Architecture
- Notre serveur Postfix est installé sur la même machines que les services Courier qui vont permettre de relever les mails. Notre machine a pour IP 10.0.0.44, comme nom d'hôte alice.lan et comme nom de domaine pour la messagerie @mail.glx.
- Voici un schéma plus précis de Postfix et plus particulièrement les différents sous-programmes qui le compose. Des analyses de logs reprenant ce schéma de principe sont disponibles ici.
Installation
Il sera nécessaire d'installer les services suivants :
- Postfix, qui est le MTA;
- Procmail, qui est le MDA (Mail Delivery Agent) permettant de délivrer les mails aux utilisateurs UNIX locaux;
- Courier-Pop, qui est le serveur POP pour la récupération des messages par l'utilisateur via un client de messagerie;
- Courier-Imap, qui est le serveur IMAP pour la récupération des messages par l'utilisateur via un client de messagerie ou un webmail;
|
|
- Un assistant d'installation se lancera et posera des questions. Peu importe les réponses, la configuration sera réinitialisée et étudiée pas à pas.
- Par défaut, Postfix ne supporte pas les quotas. Pour greffer cette fonctionnalités à Postfix, il est nécessaire de lui appliquer le patch adéquate. Tous d'abord, il faut récupérer les sources de Postfix puis les sauvegarder dans le dossier /usr/src/ :
|
|
- Avant de télécharger le patch, il est nécessaire de vérifier la version de Postfix :
|
|
- Une fois la version connu, on se rend sur le site du développeur du patch (http://vda.sourceforge.net/) puis on choisi le patch approprié à notre version de Postfix :
|
|
- Maintenant, on applique le patch. Pour cela, on se place dans le dossier des sources de Postfix, puis avec la commande patch, on y intègre les éléments du patch :
|
|
- Ouvrir le fichier /usr/src/postfix-2.9.6/debian/rules, puis remplacer :
export DEB_BUILD_HARDENING=1
- Par :
export DEB_BUILD_HARDENING=0
- On va pouvoir construire le nouveau package Postfix :
|
|
- Si l'on se place dans le dossier /usr/src/ on peut remarquer plusieurs packages .deb. Les deux packages qui nous intéresse sont postfix_2.9.6-1~12.04.1_i386.deb et postfix-mysql_2.9.6-1~12.04.1_i386.deb :
|
|
Les packages ont été réalisés en prenant en compte des paramètres du système ainsi que sa configuration matériel. Il se peut que les paquets générés aient des terminaisons différentes, par exemple amd64 au lieu de i386. |
- On procède à l'installation de ces deux packages sur le système :
|
|
Configuration de base
Tout au long de cette documentation nous utiliseront le nom de domaine fictif mail.glx. Nos adresses mails seront de la forme @mail.glx.
Fichier /etc/postfix/main.cf
- Le fichier de configuration main.cf contient les éléments de configuration sur le MTA Postfix. Nous ferons une sauvegarde du fichier existant :
|
|
- Puis nous créerons un nouveau fichier main.cf et nous y insérons les éléments suivants :
smtpd_banner = $myhostname ESMTP $mail_name biff = no append_dot_mydomain = no readme_directory = no myhostname = alice.lan alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydomain = mail.glx myorigin = $mydomain mydestination = localhost $mydomain relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/124 [::1]/128 home_mailbox = Maildir/ mailbox_command = procmail -a "$EXTENSION" recipient_delimiter = + inet_interfaces = all message_size_limit = 5120000 mailbox_size_limit = 10240000 smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination permit
- On indique à Postfix les destinations locales dans le paramètre mydestination (les noms de domaines pour lesquels Postfix doit gérer les courriers entrants)
- Le paramètre mynetworks contient la liste des réseaux. Par la suite ce paramètre pourra être utilisé dans des règles de filtrage. Le relayage SMTP est uniquement autorisé depuis un hôte contenu dans mynetwork.
- Lorsque vous vous connecter au serveur Postfix en ssh, le terminal vous notifie lorsqu'il y a des nouveaux mails. Il est possible de désactiver cette notification via le paramètre biff.
- La variable home_mailbox indique où trouver le répertoire mail des utilisateurs. Dans ce cas de configuration, se sera /home/<user>/Maildir/.
- La variable inet indique sur quel(s) interface(s) réseau le serveur doit écouter. Ici il écoute sur toutes les interfaces.
- La variable message_size_limit indique la taille maximale d'un message - pièce jointe incluse (en Ko, ici 5120000/1000/1024 = 5 Mo).
- La variable mailbox_size_limit indique la taille maximale d'une boîte mail (en Ko, ici 10240000/1000/1024 = 10 Mo).
|
Par défaut, la variable home_mailbox a pour valeur /var/mail. Les messages sont enregistrés dans un fichier texte portant le nom de l'utilisateur UNIX. Ce mode de fonctionnement n'est pas compatible avec les daemons courier-pop et courier-imap |
Fichier /etc/procmailrc
- Le daemon procmail interrogera ce fichier pour chaque mail entrant. On y définira la localisation des répertoires de stockage des mails pour les utilisateurs UNIX.
MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/
|
Le fichier n'existe pas, il faut le créer ! |
Création du répertoire mail
Dans notre cas nous disposons de l'utilisateur UNIX alice sur notre serveur avec pour répertoire personnel /home/alice.
- Création des répertoires pour la boîte mail électronique de alice :
|
|
- Pour que cette opération s'effectue automatiquement à chaque ajout d'un nouvel utilisateur UNIX :
|
|
Nos comptes mails sont basés sur les utilisateurs UNIX du serveur. |
Application des paramètres
- Pour que les modifications soient prises en compte, il faut redémarrer Postfix :
|
|
Test de validation du serveur
Test du serveur SMTP
- Nous pouvons vérifier le bon fonctionnement du serveur SMTP en s'y connectant avec la commande telnet :
|
|
- Le serveur répondra par un code 220 contenant la bannière qui a été définit au paramètre smtpd_banner dans le fichier main.cf.
|
|
- Pour valider son fonctionnement, nous allons envoyer un mail. Commençons d'abord par indiquer notre adresse mail émetteur :
|
|
- Le serveur acquittant avec le code 250, nous pouvons maintenant indiquer l'adresse de l'expéditeur :
|
|
- Le serveur doit acquitter également avec le code 250. Maintenant nous allons rédiger le contenu du mail. Pour cela, il faut saisir la commande data :
|
|
- Le serveur répondra par :
|
|
- Dès lors, nous pouvons maintenant rédiger notre mail. La touche Entrée est interprétée comme un retour à la ligne dans le mail.
|
|
- Le mail rédigé, on revient à la ligne avec la touche Entrée, puis on saisit un point (.) et on appui de nouveau sur la touche Entrée :
|
|
- Le serveur valide la mise en attente de distribution du mail et retourne son numéro d'identifiant dans la file d'attente :
|
|
- On ferme la connexion avec la commande quit :
|
|
Test du serveur POP3
- On va vérifier la bonne réception du mail envoyé à l'étape précédente. Pour cela on se connecte au serveur sur le port 110 :
|
|
- On indique le nom d'utilisateur UNIX du compte avec la commande user :
|
|
- Le serveur demande le mot de passe du compte, on lui indique via la commande pass :
|
|
- Le serveur accepte la connexion. On consulte la liste des messages avec la commande list :
|
|
- On affiche les 20 premières lignes du message 1 avec la commande top :
|
|
Test du serveur IMAP
- On se connecte au serveur sur le port imap 143 :
|
|
- Le serveur attend un login est un mot de passe. Pour cela, on utilise la commande LOGIN <user> <password> :
|
|
- On demande la liste des répertoires grâce à la commande LIST "" "*" :
|
|
- On accède au dossier des messages reçus dans INBOX avec la commande SELECT <nom_dossier> :
|
|
- On liste les messages reçus dans le dossier INBOX avec la commande SELECT <nom_dossier> :
|
|
- On consulte le message avec l'UID 1 en saisisant la commande UID FETCH <UID_message> BODY[] :
|
|
- On ferme la connexion avec la commande LOGOUT :
|
|
Autres méthodes
On peut également vérifier que le mail a bien été acheminé.
- Via les logs stockés dans /var/log/mail.log :
Jan 30 02:29:40 alice postfix/local[13772]: C01187F9FA: to=<alice@mail.glx>, relay=local, delay=50, delays=49/0.17/0/0.14, dsn=2.0.0, status=sent (delivered to command: procmail -a "$EXTENSION") Jan 30 02:29:40 alice postfix/qmgr[13254]: C01187F9FA: removed
- En interrogeant la file d'attente :
|
|
Authentification SMTP Postfix
Jusqu'à présent Postfix accepte de délivrer les messages de n'importe quel utilisateur. La raison est simple : aucune demande de mot de passe pour se connecter.
Contrairement aux serveurs pop (courier-pop) et imap (courier-imap), la connexion au serveur SMTP s'effectue sans demande de mot de passe. Pour remédier à cette faille de sécurité propre à la configuration par défaut de Postfix, nous installeront le paquet sasl2-bin qui permettra l'authentification des utilisateurs avec le module pam (Pluggable Authentication Modules, utilisé par Linux).
|
|
Activation du module
- Editer le fichier de configuration /etc/default/saslauthd, puis remplacer :
START=no
- par :
START=yes
Par défaut, le mécanisme d'authentification utilisé est pam (paramètre MECHANISMS) ce qui nous conviens pour le moment (authentification via les comptes UNIX existants).
- Remplacer aussi la ligne :
OPTIONS="-c -m /var/run/saslauthd"
- Par :
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
- On crée le répertoire /var/spool/postfix/var/run/saslauthd avec les permissions adéquates :
|
|
- On ajoute l'utilisateur Postfix au groupe sasl :
|
|
- On crée le fichier /etc/pam.d/smtp et on y insère les éléments suivants :
@include common-auth @include common-account @include common-password @include common-session
- On démarre le daemon saslauthd :
|
|
Intégration dans Postfix
- Ajouter les lignes suivantes à la fin du fichier /etc/postfix/main.cf :
broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $mydomain smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_type = cyrus cyrus_sasl_config_path = /etc/postfix/sasl
- Créer le fichier /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd mech_list: PLAIN LOGIN
- On redémarre Postfix pour appliquer les nouveaux paramètres :
|
|
Vérification
La commande ehlo
La commande ehlo permet de s'annoncer au serveur. Certains serveur SMTP la requiert avant toute autre action. Dans le cas présent, elle nous permet de voir les méthodes d'authentification acceptées par le serveur SMTP.
- Résultat de la commande ehlo sans le module sasl d'activé :
|
|
- Résultat de la commande ehlo avec le module sasl d'activé :
|
|
Envoi sans authentification
- Tentative d'envoi sans authentification :
|
|
- Trace laissée dans /var/log/mail.log :
Jan 30 13:17:32 alice postfix/smtpd[20759]: NOQUEUE: reject: RCPT from pfalk.net.ncad.fr[10.0.0.48]: 554 5.7.1 <nicolas@cachelou.fr>: Relay access denied; from=<root@mail.glx> to=<nicolas@cachelou.fr> proto=SMTP
Le serveur refuse le destinataire avec pour motif : Relay access denied.
Le serveur autorise de transmettre les mails sans authentification pour tous les domaines renseignés dans le paramètre mydestination du fichier /etc/postfix/main.cf. |
Envoi avec authentification
- Tentative d'envoi avec authentification :
|
|
|
Le nom d'utilisateur et le mot de passe sont encodés en Base64. Plus d'informations ici |
- Trace laissée dans /var/log/mail.log :
Jan 30 14:48:59 alice postfix/smtpd[24312]: CD53F62881: client=pfalk.net.ncad.fr[10.0.0.48], sasl_method=login, sasl_username=alice@alice.lan Jan 30 14:49:05 alice postfix/cleanup[24315]: CD53F62881: message-id=<> Jan 30 14:49:05 alice postfix/qmgr[24195]: CD53F62881: from=<root@mail.glx>, size=190, nrcpt=1 (queue active) Jan 30 14:49:07 alice postfix/smtp[24316]: CD53F62881: to=<nicolas@cachelou.fr>, relay=aspmx.l.google.com[173.194.78.27]:25, delay=16, delays=14/0.13/1.2/0.56, dsn=5.7.1, status=bounced (host aspmx.l.google.com[173.194.78.27] said: 550-5.7.1 [109.190.9.125 11] Our system has detected that this message is 550-5.7.1 not RFC 2822 compliant. To reduce the amount of spam sent to Gmail, 550-5.7.1 this message has been blocked. Please review 550 5.7.1 RFC 2822 specifications for more information. dq1si3286812wib.75 - gsmtp (in reply to end of DATA command)) Jan 30 14:49:07 alice postfix/cleanup[24315]: 31F5F63799: message-id=<20140130134907.31F5F63799@alice.lan> Jan 30 14:49:07 alice postfix/qmgr[24195]: 31F5F63799: from=<>, size=2576, nrcpt=1 (queue active) Jan 30 14:49:07 alice postfix/bounce[24317]: CD53F62881: sender non-delivery notification: 31F5F63799 Jan 30 14:49:07 alice postfix/qmgr[24195]: CD53F62881: removed Jan 30 14:49:07 alice postfix/local[24318]: 31F5F63799: to=<root@mail.glx>, relay=local, delay=0.3, delays=0.05/0.12/0/0.13, dsn=2.0.0, status=sent (delivered to command: procmail -a "$EXTENSION") Jan 30 14:49:07 alice postfix/qmgr[24195]: 31F5F63799: removed
D'après les logs, l'authentification a réussi. Cependant, l'envoi du mail vers nicolas@cachelou.fr a échoué car le fournisseur du service de messagerie GMail a refusé le message. GMail n'accepte pas les messages sans objet.
Sécuriser les échanges SMTP
Cette section à deux objectifs : vous montrer des méthodes de sécurisation pour votre serveur mail, mais aussi vous sensibiliser sur la sécurité en général des applications.
Vous observerez qu'à défaut d'une connexion sécurisée, toutes les données transitent en clair sur le réseau. Il est dès lors facile pour des personnes mal intentionnées de les récupérer et d'en faire mauvaise usage.Défaut des échanges en clairs
Par défaut, tous les échanges s'effectuent en clair : aussi bien la phase d'authentification que l'envoie du message. Voici ci-dessous, une capture d'un analyseur de trame (Wireshark) lors de l'envoi d'un courriel depuis le client de messagerie Thundirbird.
On remarquera surtout le couple login et mot de passe ainsi que l'émetteur et le destinataire du message. Il est facile pour des logiciels espions installés sur le PC ou le réseau de récupérer ces données afin de réutiliser le compte mail pour diffuser du SPAM.
Dans des cas beaucoup plus grave, les données du comptes permettent de récupérer une copie des messages stockés sur le serveur de mail.
Activer TLS
- Ajouter les lignes suivantes dans le fichier de configuration de Postfix /etc/postfix/main.cf juste après la ligne readme_directory = no :
smtpd_tls_cert_file=/etc/postfix/ssl/smtpd.cert smtpd_tls_key_file=/etc/postfix/ssl/smtpd.key smtpd_use_tls=yes smtpd_tls_received_header = yes smtpd_tls_loglevel = 1 smtpd_tls_ask_ccert = yes smtpd_tls_security_level = may smtp_tls_loglevel = 1 smtp_tls_cert_file=/etc/postfix/ssl/smtpd.cert smtp_tls_key_file=/etc/postfix/ssl/smtpd.key
Les deux premières lignes concernent respectivement le certificat et la clé privée. La troisième permet d'activer le module tls sur le serveur. Les lignes 4 à 6 permettent de tracer l'usage du certificat dans les logs (pour le debuggage). La ligne 7 spécifie le niveau de tolérance en matière de sécurité du serveur. Elle sera étudié plus en détail par la suite.
Enfin le deuxième bloc concerne les informations de chiffrement pour la connexion du client (même certificat aussi bien pour le serveur que le client).
- Créer le certificat ssl dans le répertoire /etc/postfix/ssl :
|
|
|
Pour un serveur en production on prendra son IP publique ou son nom de machine (champ Common Name). |
- Redémarrer le service Postfix pour appliquer la configuration
|
|
Il se peut que malgré l'activation de TLS, l'acheminement des courriels vers le MTA du destinataire s'effectue en clair. Il est possible de forcer l'activation via une table de correspondance.
- Pour vérifier si le message reçu a été transmis chiffré, il suffit de regarder son en-tête. Par exemple voici un courriel envoyé non chiffré :
Received: from geocoucou.net.ncad.fr (mail.geocoucou.eu. [109.190.211.49])
by mx.google.com with ESMTP id g1si9649314wmg.53.2016.03.15.03.21.07
for <cacheloun@gmail.com>;
Tue, 15 Mar 2016 03:21:07 -0700 (PDT)
- Si ce dernier avait été chiffré, c'est le service ESMTPS qui serait apparu en lieu et place de ESMTP dans l'en-tête du courriel.
- Dans le fichier de configuration /etc/postfix/main.cf' - après la ligne smtpd_tls_security_level - on y ajoute la ligne suivante :
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy_map
- Cette ligne permet de forcer l’activation de TLS pour des domaines de messagerie bien définis. Dans notre cas, ces derniers seront listés dans le fichier /etc/postfix/tls_policy_map et renseigné comme ceci :
gmail.com encrypt
- Il faut générer la base et recharger la configuration de Postfix pour que les modifications soient prises en compte.
|
|
- Maintenant, si nous renvoyons un courriel vers une adresse gmail.com depuis notre serveur de messagerie, voici ce que nous observons dans les en-têtes :
Received: from geocoucou.net.ncad.fr (mail.geocoucou.eu. [2001:41d0:fe20:c101:10:46:0:49]) by mx.google.com with ESMTPS id h197si23802268wmd.118.2016.03.15.03.31.17 for <cacheloun@gmail.com> (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 15 Mar 2016 03:31:17 -0700 (PDT)
On remarquera que le service qui apparaît dans l'en-tête du courriel est ESMTPS. |
Vérification
- Se connecter au serveur Postfix depuis le port smtp 25 :
|
|
On remarquera l'apparition de la ligne StartTLS qui indique que le serveur peut chiffrer les échanges si le client le souhaite.
- Effectuer un test d'envoi en configurant le compte mail sur un client de messagerie en utilisant pour le serveur SMTP le port 25 et comme sécurité pour la connexion STARTTLS. L'adresse des serveurs POP/IMAP et SMTP correspond à l'adresse IP du serveur Postfix.
- Lors de l'envoi d'un message on observe ceci dans les logs Postfix dans le fichier /var/log/mail.log :
Jan 30 20:17:54 alice postfix/smtpd[28407]: connect from oxtrode.net.ncad.fr[10.0.0.51] Jan 30 20:17:54 alice postfix/smtpd[28407]: Anonymous TLS connection established from oxtrode.net.ncad.fr[10.0.0.51]: TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits) Jan 30 20:17:54 alice postfix/smtpd[28407]: 98A4163777: client=oxtrode.net.ncad.fr[10.0.0.51], sasl_method=PLAIN, sasl_username=alice@alice.lan Jan 30 20:17:54 alice postfix/cleanup[28410]: 98A4163777: message-id=<52EAA55B.7090404@mail.glx> Jan 30 20:17:54 alice postfix/smtpd[28407]: disconnect from oxtrode.net.ncad.fr[10.0.0.51] Jan 30 20:17:54 alice postfix/qmgr[28182]: 98A4163777: from=<alice@mail.glx>, size=726, nrcpt=1 (queue active) Jan 30 20:17:55 alice postfix/smtp[28411]: Untrusted TLS connection established to aspmx.l.google.com[173.194.78.27]:25: TLSv1.1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)
- On peut également remarquer avec l'analyseur de trame que le dialogue entre le client de messagerie et le serveur SMTP est chiffré (cipher ECDHE-RSA-AES256-SHA):
Forcer l'authentification chiffrée en StartTLS
- Dans ce mode de configuration, deux types d'échanges cohabitent : sécurisés et non sécurisés. Ceci se vérifie facilement en accédant au serveur :
|
|
- On remarque que le serveur nous informe sur deux choses :
- Il accepte l'authentification en clair dont il nous énonce les méthodes : PLAIN LOGIN.
- Il accepte les échanges chiffrés en nous indiquant StartTLS.
- Il est possible de forcer Postfix à n'accepter que les connexions chiffrées. Cependant, avec STARTTLS le serveur débutera sa conversation en clair jusqu'à ce que le client accepte STARTTLS (c.f Capture d'écran Vérification ligne 1 à 5). Pour cela, dans le fichier /etc/postfix/main.cf on va remplacer :
smtpd_tls_security_level = may
- Par :
smtpd_tls_security_level = encrypt
- On redémarre le service Postfix :
|
|
- Puis on se connecter de nouveau au serveur :
|
|
On remarque la disparition des lignes AUTH.
- Cette fois, si on tente d'envoyer un message en connexion non chiffrée, le serveur nous refuse la requête dès le mail from: :
|
|
Sécuriser les échanges IMAP
Cette section à deux objectifs : vous montrer des méthodes de sécurisation pour votre serveur mail, mais aussi vous sensibiliser sur la sécurité en général des applications.
Vous observerez qu'à défaut d'une connexion sécurisée, toutes les données transitent en clair sur le réseau. Il est dès lors facile pour des personnes mal intentionnées de les récupérer et d'en faire mauvaise usage.Défaut des échanges en clair
Tout comme pour le SMTP, tous les échanges s'effectuent en clair aussi bien la phase d'authentification que la consultation des différents dossiers. Voici, ci-dessous, une capture de trame lorsqu'on navigue dans les différents dossiers de son client de messagerie Imap.
Il est important de constater que sur cette trame le login (alice) et le mot de passe (alice) sont visibles en clair sur la capture (à la 5ème ligne). Il est toujours plus facile pour des logiciels espions installés sur le PC ou le réseau de récupérer ces données afin de consulter les messages reçus et sauvegardés sur le serveur Imap.
|
Les données transitent en clair de la machine ou est installé le client de messagerie jusqu'au serveur mail du fournisseur du service |
Activer SSL
- Installation du service courier-imap-ssl :
|
|
Le service courier-imap-ssl écoute sur le port 993. Bien que le certificat soit généré automatiquement, il est nécessaire de le recréer. Pour la génération du certificat on prendra l'IP privée du serveur.
|
Pour un serveur en production on prendra son IP publique ou son nom de machine (champ Common Name). |
- Génération du certificat :
|
|
- Création du fichier imapd.pem. Ce fichier est une fusion de imapd.cert et imapd.key :
|
|
- Modification de la configuration de courier-imap-ssl. Pour cela, vérifier les paramètres suivants dans le fichier de configuration /etc/courier/imapd-ssl :
TLS_PROTOCOL="TLS1_1:TLS1:SSL3" TLS_CERTFILE=/etc/courier/imapd.pem TLS_TRUSTCERTS=/etc/courier/imapd.pem TLS_VERIFYPEER=NONE
- On redémarre le service pour prendre en compte les nouveaux paramètres :
|
|
Vérification
- Se connecter au serveur Postfix depuis le port smtp 993 :
|
|
Le serveur répond sur le port 993.
- On peut remarquer avec l'analyseur de trames que le dialogue entre le client de messagerie et le serveur IMAP est chiffré :
Sécuriser les échanges POP
Cette section à deux objectifs : vous montrer des méthodes de sécurisation pour votre serveur mail, mais aussi vous sensibiliser sur la sécurité en général des applications.
Vous observerez qu'à défaut d'une connexion sécurisée, toutes les données transitent en clair sur le réseau. Il est dès lors facile pour des personnes mal intentionnées de les récupérer et d'en faire mauvaise usage.Défaut des échanges en clair
À l'image de SMTP et IMAP vus précédemment, tous les échanges s'effectuent en clair quelques soit le type d'échange (signalisation, authentification, données). Voici, ci-dessous, une capture de trame lorsqu'on effectue une relève POP avec son client de messagerie.
Il est important de constater que sur cette trame le login (ligne 10 : USER alice) et le mot de passe (ligne 12 : PASS alice) sont visibles en clair sur la capture. Il est toujours plus facile pour des logiciels espions installés sur le PC ou le réseau de récupérer ces données afin de consulter les messages reçus et sauvegardés sur le serveur POP.
|
Les données transitent en clair de la machine ou est installé le client de messagerie jusqu'au serveur mail du fournisseur du service |
Activer SSL
- Installation du service courier-pop-ssl :
|
|
Le service courier-pop-ssl écoute sur le port 995. Bien que le certificat soit généré automatiquement, il est nécessaire de le recréer. Pour la génération du certificat on prendra l'IP privée du serveur.
|
Pour un serveur en production on prendra son IP publique ou son nom de machine (champ Common Name). |
- Génération du certificat :
|
|
- Création du fichier .pem. Ce fichier est une fusion de popd.cert et popd.key :
|
|
- Modification de la configuration de courier-pop-ssl. Pour cela, vérifier les paramètres suivants dans le fichier de configuration /etc/courier/pop3d-ssl :
TLS_PROTOCOL="TLS1_1:TLS1:SSL3" TLS_CERTFILE=/etc/courier/popd.pem TLS_TRUSTCERTS=/etc/courier/popd.pem TLS_VERIFYPEER=NONE
- On redémarre le service pour prendre en compte les nouveaux paramètres :
|
|
Vérification
- Se connecter au serveur Postfix depuis le port smtp 995 :
|
|
Le serveur répond sur le port 995.
- On peut remarquer avec l'analyseur de trames que le dialogue entre le client de messagerie et le serveur POPs est chiffré :
Restrictions SMTP
Familles de restrictions
Ordre d'écriture
- Pour rappel, voici un exemple d'envoi de mail :
|
|
- En rouge, ce sont les paramètres qui vont permettre de restreindre l'utilisation des commandes (ehlo, mail from:, rcpt to:, data) en y appliquant des vérifications (adresses mail existantes, utilisateur authentifié, adresse IP du client, ...).
- L'ordre d'apparition de ces paramètres dans le terminal de commande ci-dessus devra être respecté lorsqu'ils seront utilisés dans le fichier de configuration de Postfix :
[...] smtpd_client_restrictions = ... smtpd_ehlo_restrictions = ... smtpd_sender_restrictions = ... smtpd_recipient_restrictions = ... smtpd_data_restrictions = ... smtpd_end_of_data_restrictions = ... [...]
Étude de cas
Les vérifications smtpd_sender_restrictions et smtpd_recipient_restrictions sont respectivement effectuées sur l'émetteur et le destinataire de chacun des messages traités par notre serveur SMTP Postfix.
- Envoi d'un courriel depuis le serveur Postfix :
Le sender est alice@mail.glx et le receiver est autre@ncad.fr.
- Réception d'un courriel depuis le serveur Postfix :
Le sender est autre@ncad.fr et le receiver est alice@mail.glx.
- Envoi d'un courrier vers une autre boîte locale :
Le sender est alice@mail.glx et le receiver est lapin-blanc@mail.glx.
Restriction sur le nombre de destinataire
- Un message peut être envoyé par un ou plusieurs destinataires. Par défaut, Postfix permet d'envoyer un message à 1000 destinataires en même temps. Il est possible de personnaliser ce paramètre en renseignant la variable smtpd_recipient_limit.
- Par exemple, nous souhaitons limiter le nombre de destinataires maximums pour un message à deux. Dans le fichier /etc/postfix/main.cf, nous allons ajouter la ligne suivante :
smtpd_recipient_limit = 2
- On applique les paramètres :
|
|
- On essaye d'envoyer un mail à plus de deux destinataires :
|
|
Restrictions sur le client
La directive smtpd_client restrictions permet de définir des restrictions de connexion au service SMTP.
- On va tout d'abord créer un fichier qui contiendra les adresses IP à blacklister. On nommera ce fichier bl_reverse et on l'enregistrera à la racine /etc/postfix/. Ce fichier contiendra les deux lignes suivantes :
10.0.0.50 REJECT Adresse IP blacklistée 10.0.0.51 DEFER
Il est également possible de renseigner un nom d'hôte à la place d'une adresse IP. |
- Nous générons la base à l'aide de la commande postmap :
|
|
- Dans le fichier de configuration /etc/postfix/main.cf nous ajoutons les deux lignes suivantes :
smtpd_client_restrictions = check_client_access hash:/etc/postfix/bl_reverse
- Maintenant, connectons nous au serveur SMTP depuis la machine 10.0.0.50 et tentons d'envoyer un courrier :
|
|
- Dans le cas ci-dessus, le serveur rejette la requête avec un code d'erreur temporaire (450). Si ce code est perçu par un serveur SMTP tentant d'acheminer un courriel, il retentera l'opération plus tard. Si le code d'erreur est renvoyé à un client de messagerie (Thunderbird, Outlook, ...), ce dernier annulera la tentative d'envoi.
- On répète maintenant l'opération depuis la machine 10.0.0.51 :
|
|
- Cette fois, le serveur renvoi un code d'erreur permanent (554). Si ce code est perçu par un serveur SMTP tentant d'acheminer un courriel, ce dernier renverra à l'émetteur un échec de remise avec le motif 554 5.7.1 <oxtrode.net.ncad.fr[10.0.0.51]>: Client host rejected: Adresse IP blacklist e. Si le code d'erreur est renvoyé à un client de messagerie, ce dernier annulera la tentative d'envoi.
- Depuis les logs Postfix, on peut observer les différentes tentatives de connexion qui ont été rejetées :
|
|
Restrictions sur le hello/ehlo
- La commande ehlo permet de s'annoncer au serveur avec un nom de domaine. Les spammeurs utilisent souvent des noms inexistants ou encore des adresses IP sans reverse DNS valide.
smtpd_helo_required = yes smtpd_helo_restrictions = reject_unknown_helo_hostname
- On applique les paramètres :
|
|
- Maintenant on tente d'envoyer un mail sans commande ehlo au démarrage de la connexion :
|
|
- On essaye cette fois-ci en utilisant un nom de domaine fictif (filtre reject_unknown_helo_hostname):
|
|
Restriction émetteur/sender
|
Les restrictions sur le destinataire s'effectuent grâce au paramètre smtpd_sender_restrictions qui est à insérer dans le fichier de configuration /etc/postfix/main.cf juste après le paramètre smtpd_helo_restrictions. |
Contrôler l'adresse mail de l'émetteur
|
Compatible uniquement avec les serveur smtp Postfix dont l'authentification est activée. |
- Par défaut les utilisateur peuvent envoyer des messages en utilisant n'importe quel adresse mail. Voici un exemple :
|
|
Ici, nous avons envoyé un mail en utilisant le compte smtp de alice à nicolas @ cachelou.fr en présentant l'adresse mail émetteur cache@fictif.tld.
- Tous d'abord, on va ajouter une base de correspondance logins utilisateurs et adresses mails. Pour cela il faudra ajouter le paramètre smtpd_sender_login_maps suivi du fichier contenant la table de correspondance. Ce paramètre devra être renseigné juste après les éléments de smtpd_helo_restrictions dans le fichier /etc/postfix/main.cf.
smtpd_sender_login_maps = hash:/etc/postfix/sender_login
- Juste en dessous de ce paramètre, nous allons indiquer à Postfix de vérifier systématiquement la correspondance entre l'adresse de l'émetteur et le login du compte mail utilisé via la table de correspondance sender_login :
smtpd_sender_restrictions = permit_mynetworks reject_sender_login_mismatch
- Nous allons renseigner dans le fichier sender_login les informations du compte alice comme ceci :
alice@mail.glx alice
- Nous générons la base à l'aide de la commande postmap :
|
|
- Nous redémarrons Postfix pour appliquer les paramètres :
|
|
- Maintenant, voici le même test avec les restrictions d'activées :
|
|
Restrictions destinataire/recipient
|
Les restrictions sur le destinataire s'effectuent grâce au paramètre smtpd_recipient_restrictions qui est à insérer dans le fichier de configuration /etc/postfix/main.cf juste après le paramètre smtpd_sender_restrictions. |
Syntaxe adresse émetteur
- Postfix reçoit du courrier électronique d'émetteurs externes (adresses autres que celles gérées par Postfix). Il est possible de vérifier si ces émetteurs se présentent avec une adresse mail valide et notamment avec :
- un nom de domaine pleinement qualifié du type mon-domaine.tld;
- un nom de domaine pleinement qualifié et mais qui en plus existe.
- Voici la syntaxe respective de ces filtres pour Postfix :
smtpd_recipient_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain,
Ces informations sont à insérer juste après la ligne du paramètre smtpd_sender_restrictions.
- Nous redémarrons Postfix pour appliquer les paramètres :
|
|
- Vérifions le fonctionnement de ces filtres, déjà le respect de la syntaxe d'un nom de domaine. Pour cela, on envoie un message en mettant comme adresse émetteur inconnu@existe-pas et à destination de notre serveur Postfix à l'adresse de destination alice@mail.glx. Ici, le nom d'hôte existe-pas n'est pas un nom de domaine. Le serveur destinataire qui est notre Postfix refusera le nom de l'émetteur à cause du premier filtre : reject_non_fqdn_sender.
|
|
- Pour le serveur émetteur, le message est bien parti. Vérifions maintenant les logs du serveur destinataire qui est notre Postfix et plus particulièrement le fichier de log /var/log/mail.log :
Feb 2 14:22:05 alice postfix/smtpd[9659]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.49]: 504 5.5.2 <inconnu@existe-pas>: Sender address rejected: need fully-qualified address; from=<inconnu@existe-pas> to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr>
Le message a bien été refusé à cause du nom d'hôte existe-pas qui n'est pas un nom de domaine Sender address rejected: need fully-qualified address.
- Maintenant, vérifions le fonctionnement du second filtre, le nom de domaine existe bien. Pour cela, on envoie un message en mettant comme adresse émetteur inconnu@existe-pas.tld et toujours comme destination alice@mail.glx. Ici, le nom de domaine existe-pas.tld n'existe pas. Le serveur destinataire qui est notre Postfix refusera le nom de l'émetteur à cause du second filtre : reject_unknown_sender_domain.
|
|
- Le message est bien partit. Vérifions maintenant les logs du serveur destinataire depuis le fichier de log /var/log/mail.log :
Feb 2 13:38:14 alice postfix/smtpd[9319]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.49]: 450 4.1.8 <inconnu@existe-pas.tld>: Sender address rejected: Domain not found; from=<inconnu@existe-pas.tld> to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr>
Le message a bien été refusé à cause de la non résolution du nom de domaine existe-pas.tld.
Syntaxe adresse destinataire
- Postfix envoi du courrier électronique à des destinataires externes (adresses autres que celles gérées par Postfix). Il est possible de vérifier si ces destinations sont valides et notamment avec :
- un nom de domaine pleinement qualifié du type mon-domaine.tld;
- un nom de domaine pleinement qualifié et mais qui en plus existe.
- Voici la syntaxe de ces filtres pour Postfix :
smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain,
- Nous redémarrons Postfix pour appliquer les paramètres :
|
|
Utilisation de blacklistes
- Il existe des blacklistes listant des IPs ou des noms d'hôtes réputés spammeur. Cela permet de bloquer tous les mails en provenance de ces hôtes suspects.
- Pour illustrer l'usage de tels blacklistes, nous utiliseront les blacklistes suivantes : sbl.spamhaus.org, cbl.abuseat.org et dul.dnsbl.sorbs.net. Il existe beaucoup plus de blacklistes et certaines sont payantes.
smtpd_recipient_restrictions = reject_rbl_client list.dsbl.org, reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, permit
Ces informations sont à insérer juste après la ligne du paramètre smtpd_sender_restriction.
- Nous redémarrons Postfix pour appliquer les paramètres :
|
|
- Dans la configuration ci-dessus, l'adresse IP va être vérifiée dans chacune de ces blacklistes. Si l'IP est présente dans l'une d'elle (présence d'un enregistrement A), alors le message ne sera pas relayé par Postfix à la boîte locale. Pour visualiser le fonctionnement de ce type de restriction, on utilisera la blackliste fictive bl.ncad.fr où l'IP 10.0.0.48 y est inscrite. Voici la résolution DNS :
|
|
D'après le résultat ci-dessus, l'IP 10.0.0.48 est blacklisté. Dans la zone bl.ncad.fr, il y a un enregistrement DNS de type A avec le nom 48.0.0.10.bl.ncad.fr pointant sur l'IP 127.0.0.2.
|
48.0.0.10 est en faites l'écriture inversé de l'IP 10.0.0.48. |
- On ajoute la blackliste au fichier de configuration /etc/postfix/main.cf :
smtpd_recipient_restrictions = reject_rbl_client list.dsbl.org, reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, reject_rbl_client bl.ncad.fr permit
- Nous redémarrons Postfix pour appliquer les paramètres :
|
|
- Nous tentons d'envoyer un mail depuis le serveur mail blacklisté avec comme IP 10.0.0.48 sur le réseau local. On observe que le message part normalement :
|
|
Feb 1 11:51:36 geocoucou postfix/smtpd[5826]: 30BC120FB8: client=localhost[127.0.0.1] Feb 1 11:51:41 geocoucou postfix/cleanup[5831]: 30BC120FB8: message-id=<20140201105136.30BC120FB8@geocoucou.net.ncad.fr> Feb 1 11:51:41 geocoucou postfix/qmgr[5823]: 30BC120FB8: from=<nicolas.cachelou@ncad.local>, size=320, nrcpt=1 (queue active) Feb 1 11:51:41 geocoucou postfix/pipe[5833]: 30BC120FB8: to=<alice@mail.glx>, relay=dfilt, delay=18, delays=17/0.13/0/0.72, dsn=2.0.0, status=sent (delivered via dfilt service) Feb 1 11:51:42 geocoucou postfix/qmgr[5823]: 30BC120FB8: removed Feb 1 11:51:42 geocoucou postfix/cleanup[5831]: D0EF1210E5: message-id=<20140201105136.30BC120FB8@geocoucou.net.ncad.fr>
- Cependant, si nous regardons dans les logs Postfix du serveur destinataire (10.0.0.44 / mail.glx), on observe que le message a été bloqué :
Feb 1 11:51:45 alice postfix/smtpd[29930]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.48]: 554 5.7.1 Service unavailable; Client host [10.0.0.48] blocked using bl.ncad.fr; from=<nicolas.cachelou@ncad.local> to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr>
|
L'émetteur recevra un mail d'échec de remise de la part de Mail Delivery System This is the mail system at host geocoucou.net.ncad.fr. I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. For further assistance, please send mail to postmaster. If you do so, please include this problem report. You can delete your own text from the attached returned message. The mail system <alice@mail.glx>: host serveur.mail.glx[10.0.0.44] said: 554 5.7.1 Service unavailable; Client host [10.0.0.48] blocked using bl.ncad.fr (in reply to RCPT TO command) Reporting-MTA: dns; geocoucou.net.ncad.fr X-Postfix-Queue-ID: 9DB5720FB8 X-Postfix-Sender: rfc822; nicolas.cachelou@ncad.local Arrival-Date: Sat, 1 Feb 2014 11:47:40 +0100 (CET) Final-Recipient: rfc822; alice@mail.glx Action: failed Status: 5.7.1 Remote-MTA: dns; serveur.mail.glx Diagnostic-Code: smtp; 554 5.7.1 Service unavailable; Client host [10.0.0.48] blocked using bl.ncad.fr |
Ecoute sur le port 587
- Par défaut le protocole smtp utilise le port 25. Cependant, il se peut que l'usage de ce port soit bloquer par le fournisseur d'accès à Internet. Dès lors, il faudra utiliser le port smtp 587. Pour cela, il suffit de rajouter la ligne suivante dans le fichier /etc/postfix/master.cf (juste en dessous de la 1er ligne smtp inet - - - - smtpd ...) :
587 inet n - y - - smtpd
- Il faut redémarrer le service Postfix pour que les modifications soient prises en compte :
|
|
Relayage SMTP
Relaie entrant
- Le relayage SMTP entrant permet de rediriger tout les courriels reçus pour un domaine de messagerie précis vers un serveur SMTP tierce.
- Dans notre exemple, notre serveur de messagerie redirigera tous les courriels reçus pour le domaine de messagerie @cachelou.ovh vers le serveur SMTP mx0.ovh.net.
Les enregistrements MX du nom de domaine cachelou.ovh pointent sur notre serveur de messagerie. |
- Dans le fichier de configuration de Postfix (/etc/postfix/main.cf), nous allons ajouter une ligne pour y renseigner les domaines pour lesquels le relayage sera actif.
relay_domains = cachelou.ovh
- Dans ce même fichier, nous allons renseigner un fichier de transport qui permettra d'établir une table de correspondance entre le nom de domaine relayé et le serveur SMTP auquel il faudra transférer les courriels reçus.
transport_maps = hash:/etc/postfix/transport
- Dans notre exemple nous allons créer le fichier /etc/postfix/transport et y renseigner la ligne suivante :
cachelou.ovh smtp:mx0.ovh.net
- Nous indiquons donc que tous les messages ayant pour domaine de messagerie @cachelou.ovh devront être relayés vers le serveur smtp mx0.ovh.net. Nous allons maintenant générer la base de correspondance à partir de ce fichier texte et qui pourra être lue par Postfix.
|
|
- Nous redémarrons le serveur de messagerie pour prendre en compte les nouveaux paramètres.
|
|
Gestion des Alias
- Jusqu'à présent, nous avons vu qu'une boîte mail est définit par deux éléments :
- une adresse de messagerie qui, dans notre cas est de la forme <login>@mail.glx;
- un répertoire de stockage situé dans le dossier /home/<login>/Maildir/.
- Néanmoins, il est possible d'ajouter une ou plusieurs adresses supplémentaires pointant vers notre boîte mail principal. Ces adresses supplémentaire sont appelé alias. Par exemple, on peut créer l'alias lapin-blanc@mail.glx pour la boîte mail alice@mail.glx. Ainsi, tous les mails reçus sur lapin-blanc@mail.glx seront en faites stockés dans la boîte alice@mail.glx.
- La gestion des alias s'effectue dans le fichier /etc/aliases. Par défaut, il existe déjà un alias postmaster redirigeant sur le compte mail de root.
# See man 5 aliases for format postmaster: root
- Nous ajoutons l'alias lapin-blanc pour le compte alice :
# See man 5 aliases for format postmaster: root lapin-blanc: alice@mail.glx
- Une fois le fichier enregistré, il faut régénérer la base des alias :
|
|
- Ensuite, nous pouvons effectuer un test de réception sur lapin-blanc@mail.glx et regarder le comportement de Postfix dans les logs :
Feb 9 13:27:54 alice postfix/smtpd[2718]: connect from geocoucou.net.ncad.fr[10.0.0.49] Feb 9 13:27:54 alice postfix/smtpd[2718]: 1282946211A: client=geocoucou.net.ncad.fr[10.0.0.49] Feb 9 13:27:54 alice postfix/cleanup[2720]: 1282946211A: message-id=<331823f91c442de1778f39d70b2b4c4e@ncad.local> Feb 9 13:27:54 alice postfix/qmgr[2663]: 1282946211A: from=<nicolas.cachelou@ncad.local>, size=1595, nrcpt=1 (queue active) Feb 9 13:27:54 alice postfix/smtpd[2718]: disconnect from geocoucou.net.ncad.fr[10.0.0.49] Feb 9 13:27:54 alice postfix/local[2721]: 1282946211A: to=<alice@mail.glx>, orig_to=<lapin-blanc@mail.glx>, relay=local, delay=0.21, delays=0.1/0.03/0/0.08, dsn=2.0.0, status=sent (delivered to command: procmail -a "$EXTENSION") Feb 9 13:27:54 alice postfix/qmgr[2663]: 1282946211A: removed
- Nous remarquons dans les logs, lors de l'acheminement du message dans le boîte mail du destinataire qu'il y a deux champs dans les logs avec d'une part l'adresse écrite par l'émetteur qui correspond à l'alias (orig_to=<lapin-blanc@mail.glx>) et l'adresse réelle où pointe le dit alias (to=<alice@mail.glx>).
Les alias peuvent également pointer vers des boîtes mails externes. On parlera aussi de redirection. |
Réécriture d'adresses
Adresse émetteur
- On va créer une base de correspondances adresse mail à remplacer / adresse mail de substitution. Pour cela, on va créer le fichier /etc/postfix/sender_canonical et le compléter comme ceci :
lapin-blanc@mail.glx alice@mail.glx @localhost @mail.glx
- D'après les lignes ci-dessus, deux règles de réécritures ont été définies. La première consiste à remplacer l'adresse émetteur lapin-blanc@mail.glx par alice@mail.glx. La seconde remplacera systématiquement toutes adresses émetteur de la forme @localhost par son équivalent en @mail.glx. On génère un fichier de base de données compréhensible par Postfix depuis le fichier sender_canonical avec la commande postmap.
|
|
- Dans le fichier de configuration de Postfix, il faudra appeler ce fichier grâce au paramètre sender_canonical_maps. Dans le fichier de configuration /etc/postfix/main.cf, on ajoutera les deux lignes suivantes.
local_header_rewrite_clients = static:all sender_canonical_maps = hash:/etc/postfix/sender_canonical
- On redémarre Postfix pour appliquer les changements.
|
|
Adresse destinataire
- On va créer une base de correspondances adresse mail à remplacer / adresse mail de substitution. Pour cela, on va créer le fichier /etc/postfix/recipient_canonical et le compléter comme ceci :
alice@mail.glx alice@geocoucou.eu @mail.glx @geocoucou.eu
Les courriels à destination de alice@mail.glx seront en faite acheminés vers alice@geocoucou.eu. Il en sera de même pour les courriels à destination de @mail.glx qui seront acheminés vers @geocoucou.eu. |
- D'après les lignes ci-dessus, deux règles de réécritures ont été définies. La première consiste à remplacer l'adresse destinataire alice@mail.glx par alice@geocoucou.eu. La seconde remplacera systématiquement toutes adresses destinataires de la forme @mail.glx par son équivalent en @geocoucou.eu. On génère un fichier de base de données compréhensible par Postfix depuis le fichier recipient_canonical avec la commande postmap.
|
|
- Dans le fichier de configuration de Postfix, il faudra appeler ce fichier grâce au paramètre recipient_canonical_maps. Dans le fichier de configuration /etc/postfix/main.cf, on ajoutera les deux lignes suivantes.
local_header_rewrite_clients = static:all recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
- On redémarre Postfix pour appliquer les changements.
|
|
Gestion des Répondeurs
Un message automatique peut être retourner à l'émetteur pour toute réception d'un mail. Cette fonction vacation appelée aussi Message d'absence ou répondeur permet de notifier l'émetteur en cas d'absence du destinataire ou pour acquitter la bonne réception de son mail.
Installation
- Installation du module vacation :
|
|
- Création de l'utilisateur vacation :
|
|
Configuration
- Le message d'absence doit être définit dans un fichier nommé .vacation.msg à la racine du répertoire de l'utilisateur. Dans notre cas, le fichier sera créée dans /home/alice/.vacation.msg. Il aura pour contenu :
Subject: Re: $SUBJECT Je suis absent du bureau jusqu'au 15 janvier 2015. Votre message sera pris en charge dès mon retour. En cas d'urgence, merci de contacter l'accueil.
La variable $SUBJECT prendra pour valeur l'objet du message fournit par l'émetteur. |
- Une fois le message enregistré, il faut régénérer la base vacation.
|
|
Un fichier .vacation.db doit être alors présent à la racine du répertoire de l'utilisateur. |
- Maintenant, il faut créer le fichier .forward pour l'appel du message d'absence après réception du message. Le fichier sera créer dans /home/alice/.forward et aura pour contenu :
\alice, "|/usr/bin/vacation alice"
Filtrage des messages
Configuration de Postfix
- Le filtrage des messages par méthode de comparaison de l'adresse de l'émetteur s'effectue grâce à la variable check_sender_access contenu dans le paramètre smtpd_recipient_restrictions dans le fichier /etc/postfix/main.cf. Voici comment doit être renseignée cette variable :
smtpd_recipient_restrictions = check_sender_access hash:/etc/postfix/block_recipient
- Cette variable a pour valeur le chemin absolue d'un fichier contenant une table des adresses mails à bloquer avec le code de status à renvoyer au serveur SMTP client. Elle doit être placé en premier.
- Pour appliquer les modifications, il faut redémarrer Postfix :
|
|
Rejet temporaire
- Postfix peut être configuré pour rejeter de manière temporaire un mail provenant d'un émetteur particulier. Pour cela, un code 450 est retourné au serveur émetteur qui tentera de renvoyer le message un peu plus tard.
- Nous souhaitons refuser temporairement les mails en provenance de nicolas.cachelou@ncad.local. Pour cela, nous allons insérer la ligne suivante dans notre fichier /etc/postfix/block_recipient :
nicolas.cachelou@ncad.local DEFER
- Il faut maintenant mapper le fichier. Son homologue .db sera créée et c'est celui-là qui sera lu par Postfix :
|
|
- Si on tente d'envoyer un message de nicolas.cachelou@ncad.local vers une boîte mail locale, par exemple alice@mail.glx; voici les logs relevés dans /var/log/mail.log :
Feb 14 19:37:51 alice postfix/smtpd[3890]: connect from geocoucou.net.ncad.fr[10.0.0.49] Feb 14 19:37:51 alice postfix/smtpd[3890]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.49]: 450 4.7.1 <nicolas.cachelou@ncad.local>: Sender address rejected: Access denied; from=<nicolas.cachelou@ncad.local> to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr> Feb 14 19:37:51 alice postfix/smtpd[3890]: disconnect from geocoucou.net.ncad.fr[10.0.0.49]
- Le code de rejet temporaire apparaît bien (450). Si on a accès au serveur SMTP émetteur on peut analyser la file des messages en attente :
|
|
- On peut également demander au serveur une vue synthétique des données sous forme de tableau :
|
|
- Nous demandons le nombre de message en attente dans la file deferred. Les colonnes indiquent le nombre de minutes d’anciennetés des messages et les lignes les domaines de messagerie concernés. Dans l'exemple, 4 envois sont en attente et son âgé entre 10 et 20 minutes pour le domaine mail.glx.
Rejet permanent
- Postfix peut être configuré pour rejeter de manière permanente un mail provenant d'un émetteur particulier. Pour cela, un code 554 est retourné au serveur émetteur qui renverra à l'émetteur un échec de livraison de son mail.
- Nous souhaitons refuser les mails en provenance de nicolas.cachelou@ncad.local. Pour cela, nous allons insérer la ligne suivante dans notre fichier /etc/postfix/block_recipient :
nicolas.cachelou@ncad.local REJECT
- Il faut maintenant mapper le fichier. Son homologue .db sera créée et c'est celui-là qui sera lu par Postfix :
|
|
- Si on tente d'envoyer un message de nicolas.cachelou@ncad.local vers une boîte mail locale, par exemple alice@mail.glx; voici les logs relevés dans /var/log/mail.log :
Feb 14 20:45:32 alice postfix/smtpd[4417]: connect from geocoucou.net.ncad.fr[10.0.0.49] Feb 14 20:45:32 alice postfix/smtpd[4417]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.49]: 554 5.7.1 <nicolas.cachelou@ncad.local>: Sender address rejected: Access denied; from=<nicolas.cachelou@ncad.local> to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr> Feb 14 20:45:32 alice postfix/smtpd[4417]: disconnect from geocoucou.net.ncad.fr[10.0.0.49]
Ajout automatique d'un destinataire caché
- Il est possible de configurer Postfix pour qu'il envoi une copie de tout ou partie des mails qu'il traite.
Conformité avec la loi... |
Pour tous les messages
- Nous souhaitons recevoir une copie de tous les messages transitant par le serveur sur l'adresse externe cacheln@ncad.fr. Pour cela, dans le fichier /etc/postfix/main.cf, nous allons ajouter la ligne suivante :
always_bcc = cacheln@ncad.fr
- Nous effectuons un test. Envoyons un message depuis la boîte externe nicolas.cachelou@ncad.local vers alice@mail.glx et voyons ce qui se passe dans les logs :
1.1 Feb 9 14:13:00 alice postfix/smtpd[3371]: connect from geocoucou.net.ncad.fr[10.0.0.49] 1.2 Feb 9 14:13:00 alice postfix/smtpd[3371]: 520C34620FD: client=geocoucou.net.ncad.fr[10.0.0.49] 1.3 Feb 9 14:13:00 alice postfix/cleanup[3376]: 520C34620FD: message-id=<b2eeb2fd98861e974eb38d29e84dc962@ncad.local> 1.4 Feb 9 14:13:00 alice postfix/qmgr[3356]: 520C34620FD: from=<nicolas.cachelou@ncad.local>, size=1568, nrcpt=2 (queue active) 1.5 Feb 9 14:13:00 alice postfix/smtpd[3371]: disconnect from geocoucou.net.ncad.fr[10.0.0.49] 1.6 Feb 9 14:13:00 alice postfix/virtual[3378]: 520C34620FD: to=<cacheln@mail.glx>, relay=virtual, delay=0.13, delays=0.07/0.02/0/0.05, dsn=2.0.0, status=sent (delivered to maildir) 2.1 Feb 9 14:13:01 alice postfix/smtp[3377]: 520C34620FD: to=<cacheln@ncad.fr>, relay=aspmx.l.google.com[173.194.66.26]:25, delay=1.6, delays=0.07/0.02/0.85/0.62, dsn=2.0.0, status=sent (250 2.0.0 OK 1391951581 lr14si5404420wic.0 - gsmtp) 2.2 Feb 9 14:13:01 alice postfix/qmgr[3356]: 520C34620FD: removed
Nous voyons que Postfix reçoit bien le message de nicolas.cachelou@ncad.local (ligne 1.4, séquences 1.x) et le délivre bien dans la boîte du destinataire locale cacheln@mail.glx (ligne 1.6). En temps normal, juste après la séquence 1.6, c'est la séquence 2.2 qui doit lui succéder : la destruction du message dans la file. Cependant, au lieu d'être détruit, nous voyons que ce même message est transmis à cacheln@ncad.fr.
Pour un émetteur particulier
- Nous souhaitons obtenir tous les message en provenance d'un émetteur particulier. Dans notre exemple, nous allons envoyer une copie de tous les messages envoyés par alice@mail.glx à la boîte mail externe cacheln@ncad.fr.
- Cette fois-ci nous utiliseront le paramètre sender_bcc_maps dans le fichier /etc/postfix/main.cf :
sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps
- Ce paramètre indique à Postfix le lieux du fichier de correspondance à consulter. Dans notre cas, voici ce que contiendra ce fichier /etc/postfix/sender_bcc_maps :
cacheln@mail.glx cacheln@ncad.fr
- La première adresse est celle de l'émetteur dont une copie des messages vont être envoyée à l'adresse qui est indiqué juste après.
Pour un destinataire particulier
- Nous souhaitons obtenir tous les message en provenance d'un destinataire particulier. Dans notre exemple, nous allons envoyer une copie de tous les messages reçus par alice@mail.glx à la boîte mail externe cacheln@ncad.fr.
- Nous utiliseront le paramètre recipient_bcc_maps dans le fichier /etc/postfix/main.cf :
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps
- Ce paramètre indique à Postfix le lieux du fichier de correspondance à consulter. Dans notre cas, voici ce que contiendra ce fichier /etc/postfix/recipient_bcc_maps :
cacheln@mail.glx cacheln@ncad.fr
- La première adresse est celle du destinataire dont une copie des messages vont être envoyée à l'adresse qui est indiqué juste après.
Personnalisation des messages d'échec de remise
- Il peut arriver que Postfix ne puisse délivrer un mail. Dans ce cas, l'émetteur en est informé. Les messages envoyés sont préformatés mais il est possible de les personnaliser. Par défaut le message renvoyé à l'émetteur est le suivant :
This is the mail system at host $myhostname. I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. For further assistance, please send mail to postmaster. If you do so, please include this problem report. You can delete your own text from the attached returned message. The mail system EOF
- Pour indiquer un autre message, il va falloir le composer en respectant la syntaxe suivante :
failure_template = <<EOF Charset: us-ascii From: <adresse_emetteur> (<nom_emetteur>) Subject: <objet_message> Postmaster-Subject: Postmaster Copy: Undelivered Mail <contenu du message> EOF
- Voici un exemple :
failure_template = <<EOF Charset: us-ascii From: ncad-mailer-daemon (Service de distribution des courriels) Subject: Echec de distribution retour emetteur Postmaster-Subject: Postmaster Copy: Undelivered Mail Message en provenance du servce mail <$myhostname> de <NCad Network>. Nous avons le regret de vous annoncer que votre message n'a pu etre transmis a au moins un ou plusieurs destinataires. Vous trouverez le mail en question en piece jointe. Pour toute assistance, merci de nous contacter a <abuse@ncad.fr>. Merci d'inclure avec votre demande la presente notification. Les pieces jointes peuvent etre supprimees. Cordialement, Le service mail NCad Network. EOF
On sauvegardera le message dans le fichier /etc/postfix/bounce_msg.
- Maintenant, il faut indiquer à Postfix l'emplacement du message que l'on souhaite envoyer. Dans le fichier /etc/postfix/main.cf on indiquera :
bounce_template_file = /etc/postfix/bounce_msg
Analyse de logs
- Cette partie est indépendante du reste de la documentation. Elle a pour but d'approfondir la réflexion autour du fonctionnement de Postfix, de mieux en comprendre les mécanismes mais surtout de savoir lire les logs.
Réception des mails
- Nous sommes dans le cas d'une configuration avec des utilisateurs locaux / UNIX. Voici comment transite le message reçu par Postfix :
- Maintenant, voici les logs relevés dans /var/log/mail.log :
Feb 8 18:09:31 alice postfix/smtpd[16827]: connect from geocoucou.net.ncad.fr[10.0.0.49] Feb 8 18:09:31 alice postfix/smtpd[16827]: 8ACDF46168D: client=geocoucou.net.ncad.fr[10.0.0.49] Feb 8 18:09:31 alice postfix/cleanup[16838]: 8ACDF46168D: message-id=<b2b5fd040529d851392e5d3efca7db6b@ncad.local> Feb 8 18:09:31 alice postfix/qmgr[15863]: 8ACDF46168D: from=<nicolas.cachelou@ncad.local>, size=1562, nrcpt=1 (queue active) Feb 8 18:09:31 alice postfix/local[16839]: 8ACDF46168D: to=<alice@mail.glx>, relay=local, delay=0.11, delays=0.04/0.01/0/0.07, dsn=2.0.0, status=sent (delivered to command: procmail -a "$EXTENSION")
Envoi des mails
A l'extérieure
- Nous envoyons un mail vers l'extérieure; c'est-à-dire un compte mail qui n'est pas géré par notre serveur Postfix :
- Maintenant, voici les logs relevés dans /var/log/mail.log :
Feb 8 20:19:22 alice postfix/smtpd[25345]: 4C21246179C: client=unknown[10.0.0.50] Feb 8 20:19:22 alice postfix/cleanup[25350]: 4C21246179C: message-id=<52F68338.4000009@mail.glx> Feb 8 20:19:22 alice postfix/qmgr[25337]: 4C21246179C: from=<cacheln@mail.glx>, size=517, nrcpt=1 (queue active) Feb 8 20:19:24 alice postfix/smtp[25351]: 4C21246179C: to=<cacheln@ncad.fr>, relay=aspmx.l.google.com[173.194.66.27]:25, delay=1.8, delays=0.25/0.01/1.1/0.42, dsn=2.0.0, status=sent (250 2.0.0 OK 1391887162 de3si3579937wib.7 - gsmtp)
Annexes
Fichier /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name biff = no append_dot_mydomain = no readme_directory = no smtpd_tls_cert_file=/etc/postfix/ssl/smtpd.cert smtpd_tls_key_file=/etc/postfix/ssl/smtpd.key smtpd_use_tls=yes smtpd_tls_received_header = yes smtpd_tls_loglevel = 1 smtpd_tls_ask_ccert = yes smtpd_tls_security_level = may #smtpd_tls_security_level = encrypt smtp_tls_loglevel = 1 smtp_tls_cert_file=/etc/postfix/ssl/smtpd.cert smtp_tls_key_file=/etc/postfix/ssl/smtpd.key myhostname = alice.lan alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydomain = mail.glx myorigin = $mydomain mydestination = localhost mail.glx relayhost = mynetworks = 127.0.0.1/32 home_mailbox = Maildir/ mailbox_command = procmail -a "$EXTENSION" recipient_delimiter = + inet_interfaces = all message_size_limit = 5120000 mailbox_size_limit = 10240000 bounce_template_file = /etc/postfix/bounce_msg broken_sasl_auth_clients = yes smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $mydomain smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_type = cyrus cyrus_sasl_config_path = /etc/postfix/sasl smtpd_helo_required = yes smtpd_helo_restrictions = reject_unknown_helo_hostname smtpd_sender_login_maps = hash:/etc/postfix/sender_login.cf smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_hostname, reject_unknown_hostname, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_rbl_client list.dsbl.org, reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net
Liens
- Postfix par Ubuntu-fr.org : http://doc.ubuntu-fr.org/postfix_mysql_tls_sasl
- Postfix par Debian.org : https://wiki.debian.org/PostfixAndSASL
- Module Courier aide Ubuntu.com : https://help.ubuntu.com/community/Courier
- Postfix chez bortzmeyer.org : http://www.bortzmeyer.org/postfix-tls.html
- Postfix depuis ses sources : http://www.howtoforge.com/virtual-users-and-domains-with-postfix-courier-mysql-and-squirrelmail-ubuntu-12.04-lts
- Postfix, fonction vacation : http://www.ducea.com/2008/11/05/howto-setup-vacation-using-postfix-on-debian-etch/