« Postfix » : différence entre les versions

De NCad Wiki
Aller à la navigation Aller à la recherche
 
(107 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
{{Serveur de Messagerie}}
[[Image:POSTFIX_Logo.png|300px|center]]
[[Image:POSTFIX_Logo.png|300px|center]]


Ligne 10 : Ligne 12 :


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.
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'''.
[[Image:Postfix.png|thumb|center|750px|Vue schématique de l'installation]]
* 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 '''[[Postfix#Analyse_de_logs|ici]]'''.
[[Image:Postfix_Architecture_Procmail.png|thumb|center|750px|Architecture de Postfix]]


== Installation ==
== Installation ==
Ligne 15 : Ligne 27 :
Il sera nécessaire d'installer les services suivants :
Il sera nécessaire d'installer les services suivants :
* '''Postfix''', qui est le MTA;
* '''Postfix''', qui est le MTA;
* '''Procmail''', qui est le MDA ''(Mail Delivery Agent)'' permettant de déliverer les mails aux utilisateurs UNIX locaux;
* '''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-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;
* '''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;
Ligne 23 : Ligne 35 :
* 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.
* 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.


== Configuration de base ==
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Prise en charge des quotas</div>
 
<div style="width:99%;padding:5px;">
 
* Par défaut, '''Postfix''' ne supporte pas les [[Postfix_Mysql#Gestion_des_quotas|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/''' :
 
{{ Box Console | objet=apt-get build-dep postfix<br />
cd /usr/src<br />
apt-get source postfix }}
 
* Avant de télécharger le patch, il est nécessaire de vérifier la version de '''Postfix''' :
 
{{ Box Console | objet=postconf mail_version<br />
mail_version = 2.9.6 }}
 
* 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''' :


<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:60px;">Configuration de base pour un usage local uniquement.<br />Tout au long de cette documentation nous utiliseront le nom de domaine fictif mail.glx. Nos adresses mails seront de la forme @mail.glx.</div>
{{ Box Console | objet=wget http://vda.sourceforge.net/VDA/postfix-vda-v11-2.9.6.patch }}


=== Fichier /etc/postfix/main.cf ===
* 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 :


* Le fichier de configuration '''main.cf''' contient les éléments de configuration sur le MTA Postfix. Nous ferons une sauvegarde du fichier existant :
{{ Box Console | objet=cd /usr/src/postfix-2.9.6/<br />
patch -p1 < ../postfix-vda-v11-2.9.6.patch }}


{{ Box Console | objet=cp /etc/postfix/main.cf /etc/postfix/main.cf.bak<br />
* Ouvrir le fichier '''/usr/src/postfix-2.9.6/debian/rules''', puis remplacer :
rm /etc/postfix/main.cf }}


* Puis nous créerons un nouveau fichier '''main.cf''' et nous y insérons les éléments suivants :
export DEB_BUILD_HARDENING=1


smtpd_banner = $myhostname ESMTP $mail_name
* Par :
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


* On indique à '''Postfix''' les destinations locales dans le paramètre '''mydestination''' ''(les noms de domaines pour lesquels Postfix doit gérer les courriers entrants)''
export DEB_BUILD_HARDENING=0


* 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. Dans l'état actuel il n'a aucune influence.
* On va pouvoir construire le nouveau package '''Postfix''' :


* 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'''.
{{ Box Console | objet=cd /usr/src/postfix-2.9.6/<br />
dpkg-buildpackage }}


* La variable '''home_mailbox''' indique où trouver le répertoire mail des utilisateurs. Dans ce cas de configuration, se sera '''/home/<user>/Maildir/'''.
* 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 :


* La variable '''inet''' indique sur quel''(s)'' interface''(s)'' réseau le serveur doit écouter. Ici il écoute sur toutes les interfaces.
{{ Box Console | objet=ls -l
<font color=green>postfix_2.9.6-1~12.04.1_i386.deb</font><br />
postfix-cdb_2.9.6-1~12.04.1_i386.deb<br />
postfix-dev_2.9.6-1~12.04.1_all.deb<br />
postfix-doc_2.9.6-1~12.04.1_all.deb<br />
postfix-ldap_2.9.6-1~12.04.1_i386.deb<br />
<font color=green>postfix-mysql_2.9.6-1~12.04.1_i386.deb</font><br />
postfix-pcre_2.9.6-1~12.04.1_i386.deb<br />
postfix-pgsql_2.9.6-1~12.04.1_i386.deb }}
<br />
{{ Box Remarque | objet=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.}}


{{ Box Attention | objet=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}}
* On procède à l'installation de ces deux packages sur le système :


=== Fichier /etc/procmailrc ===
{{ Box Console | objet=dpkg -i postfix_2.9.6-1~12.04.1_i386.deb postfix-mysql_2.9.6-1~12.04.1_i386.deb}}


* 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.
</div>
</div>


MAILDIR=$HOME/Maildir
== Configuration de base ==
DEFAULT=$MAILDIR/


{{ Box Attention | objet=Le fichier n'existe pas, il faut le créer ! }}
<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:60px;">Configuration de base pour un usage local uniquement.<br />Tout au long de cette documentation nous utiliseront le nom de domaine fictif mail.glx. Nos adresses mails seront de la forme @mail.glx.</div>


=== Création du répertoire mail ===
=== Fichier /etc/postfix/main.cf ===


Dans notre cas nous disposons de l'utilisateur UNIX '''alice''' sur notre serveur avec pour répertoire personnel '''/home/alice'''.
* Le fichier de configuration '''main.cf''' contient les éléments de configuration sur le MTA Postfix. Nous ferons une sauvegarde du fichier existant :


* Création des répertoires pour le courrier électronique de '''alice''' :
{{ Box Console | objet=cp /etc/postfix/main.cf /etc/postfix/main.cf.bak<br />
rm /etc/postfix/main.cf }}


{{ Box Console | objet=cd /home/alice<br />
* Puis nous créerons un nouveau fichier '''main.cf''' et nous y insérons les éléments suivants :
maildirmake Maildir<br />
maildirmake -f Sent Maildir<br />
maildirmake -f Queue Maildir<br />
maildirmake -f junkmail Maildir<br />
maildirmake -f virus Maildir<br />
maildirmake -f Drafts Maildir<br />
maildirmake -f Trash Maildir<br />
chown alice:alice Maildir -R<br />
chmod 700 Maildir -R }}


* Pour que cette opération s'effectue automatiquement à chaque ajout d'un nouvel utilisateur UNIX :
smtpd_banner = $myhostname ESMTP $mail_name
 
biff = no
{{ Box Console | objet=sudo maildirmake /etc/skel/Maildir<br />
sudo maildirmake /etc/skel/Maildir/.Drafts<br />
append_dot_mydomain = no
sudo maildirmake /etc/skel/Maildir/.Sent<br />
sudo maildirmake /etc/skel/Maildir/.Trash<br />
readme_directory = no
sudo maildirmake /etc/skel/Maildir/.Templates }}
<br /><br />
myhostname = alice.lan
{{ Box Remarque | objet=Nos comptes mails sont basés sur les utilisateurs UNIX du serveur.}}
alias_maps = hash:/etc/aliases
 
alias_database = hash:/etc/aliases
=== Application des paramètres ===
mydomain = mail.glx
 
myorigin = $mydomain
* Pour que les modifications soient prises en compte, il faut redémarrer '''Postfix''' :
mydestination = localhost $mydomain
 
relayhost =
{{ Box Console | objet=sudo service postfix restart }}
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


=== Test de validation du serveur ===
* On indique à '''Postfix''' les destinations locales dans le paramètre '''mydestination''' ''(les noms de domaines pour lesquels Postfix doit gérer les courriers entrants)''


==== Test du serveur SMTP ====
* 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'''.


* Nous pouvons vérifier le bon fonctionnement du serveur '''SMTP''' en s'y connectant depuis la commande '''telnet''' :
* 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'''.


{{ Box_Console | objet= telnet 127.0.0.1 25}}
* La variable '''home_mailbox''' indique où trouver le répertoire mail des utilisateurs. Dans ce cas de configuration, se sera '''/home/<user>/Maildir/'''.


* 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'''.
* La variable '''inet''' indique sur quel''(s)'' interface''(s)'' réseau le serveur doit écouter. Ici il écoute sur toutes les interfaces.


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">telnet 127.0.0.1 25</span><br />
* La variable '''message_size_limit''' indique la taille maximale d'un message - pièce jointe incluse ''(en Ko, ici 5120000/1000/1024 = 5 Mo)''.
Trying 127.0.0.1...<br />
Connected to 127.0.0.1.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix}}


* Pour valider son fonctionnement, nous allons envoyer un mail. Commençons d'abord par indiquer notre '''adresse mail émetteur''' :
* La variable '''mailbox_size_limit''' indique la taille maximale d'une boîte mail ''(en Ko, ici 10240000/1000/1024 = 10 Mo)''.


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">mail from:<root@mail.glx></span><br />
{{ Box Attention | objet=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}}
250 2.1.0 OK }}


* Le serveur acquittant avec le code '''250''', nous pouvons maintenant indiquer l'adresse de l'expéditeur :
=== Fichier /etc/procmailrc ===


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">rcpt to:<alice@mail.glx></span><br />
* 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.
250 2.1.5 OK }}


* 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''' :
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">data</span> }}
{{ Box Attention | objet=Le fichier n'existe pas, il faut le créer ! }}


* Le serveur répondra par :
=== Création du répertoire mail ===


{{ Box_Console | objet=354 End data with <CR><LF>.<CR><LF> }}
Dans notre cas nous disposons de l'utilisateur UNIX '''alice''' sur notre serveur avec pour répertoire personnel '''/home/alice'''.


* Dès lors, nous pouvons maintenant rédiger notre mail. La touche '''Entrée''' est interprété comme un '''retour à la ligne''' dans le mail.
* Création des répertoires pour la boîte mail électronique de '''alice''' :


{{ Box_Console | objet=test d'envoi / réception<br />
{{ Box Console | objet=cd /home/alice<br />
Merci ;) }}
maildirmake Maildir<br />
maildirmake -f Sent Maildir<br />
maildirmake -f Queue Maildir<br />
maildirmake -f junkmail Maildir<br />
maildirmake -f virus Maildir<br />
maildirmake -f Drafts Maildir<br />
maildirmake -f Trash Maildir<br />
chown alice:alice Maildir -R<br />
chmod 700 Maildir -R }}


* Le mail rédigé, on revient à la ligne avec la touche '''Entrée''', puis on saisie un '''point ''(.)''''' et on appui de nouveau sur la touche '''Entrée''' :
* Pour que cette opération s'effectue automatiquement à chaque ajout d'un nouvel utilisateur UNIX :


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">.</span>}}
{{ Box Console | objet=sudo maildirmake /etc/skel/Maildir<br />
sudo maildirmake /etc/skel/Maildir/.Drafts<br />
sudo maildirmake /etc/skel/Maildir/.Sent<br />
sudo maildirmake /etc/skel/Maildir/.Trash<br />
sudo maildirmake /etc/skel/Maildir/.Templates }}
<br /><br />
{{ Box Remarque | objet=Nos comptes mails sont basés sur les utilisateurs UNIX du serveur.}}
 
=== Application des paramètres ===


* Le serveur valide la mise en attente de distribution du mail et retourne son numéro d'identifiant quand le file d'attente :
* Pour que les modifications soient prises en compte, il faut redémarrer '''Postfix''' :


{{ Box_Console | objet=250 2.0.0 Ok: queued as C01187F9FA }}
{{ Box Console | objet=sudo service postfix restart }}


* On ferme la connexion avec la commande '''quit''' :
=== Test de validation du serveur ===


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">quit</span><br />
==== Test du serveur SMTP ====
221 2.0.0 Bye<br />
Connection closed by foreign host. }}


==== Test du serveur POP3 ====
* Nous pouvons vérifier le bon fonctionnement du serveur '''SMTP''' en s'y connectant avec la commande '''telnet''' :


* 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''' :
{{ Box_Console | objet= telnet 127.0.0.1 25}}


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 110</span><br />
* 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'''.
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
+OK Hello there.
}}


* On indique lenom d'utilisateur UNIX du compte avec la commande '''user''' :
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">telnet 127.0.0.1 25</span><br />
Trying 127.0.0.1...<br />
Connected to 127.0.0.1.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix}}


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">user alice</span><br />
* Pour valider son fonctionnement, nous allons envoyer un mail. Commençons d'abord par indiquer notre '''adresse mail émetteur''' :
+OK Password required }}


* Le serveur demande le mot de passe du compte, on lui renseigne via la commande '''pass''' :
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">mail from:<root@mail.glx></span><br />
250 2.1.0 OK }}


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">pass alice</span><br />
* Le serveur acquittant avec le code '''250''', nous pouvons maintenant indiquer l'adresse de l'expéditeur :
+OK logged in. }}


* Le serveur accepte la connexion. On consulte la liste des messages avec la commande '''list''' :
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">rcpt to:<alice@mail.glx></span><br />
250 2.1.5 OK }}


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">list</span><br />
* 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''' :
+OK POP3<br />
1 280<br />
. }}


* On affiche les '''20''' premières lignes du message '''1''' avec la commande '''top''' :
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">data</span> }}
 
* Le serveur répondra par :


{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">top 1 20</span><br />
{{ Box_Console | objet=354 End data with <CR><LF>.<CR><LF> }}
+OK headers follow.<br />
Return-Path: <root@mail.glx><br />
X-Original-To: alice@mail.glx<br />
Delivered-To: alice@mail.glx<br />
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])<br />
__by alice.lan (Postfix) with SMTP id A3242628A2<br />
__for <alice@mail.glx>; Thu, 30 Jan 2014 01:20:57 +0100 (CET)<br /><br />


test<br />
* 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.
.
}}


==== Test du serveur IMAP ====
{{ Box_Console | objet=test d'envoi / réception<br />
Merci ;) }}


* On se connecte au serveur sur le port '''imap 143''' :
* 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''' :


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">telnet 10.0.0.44 143</span><br />
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">.</span>}}
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
¤ OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL<br />ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc.  See COPYING for distribution information. }}


* Le serveur attend un login est un mot de passe. Pour cela, on utilise la commande '''LOGIN <user> <password>''' :
* Le serveur valide la mise en attente de distribution du mail et retourne son numéro d'identifiant dans la file d'attente :


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">01 LOGIN alice alice</span><br />
{{ Box_Console | objet=250 2.0.0 Ok: queued as C01187F9FA }}
1 OK LOGIN Ok. }}
 
* On ferme la connexion avec la commande '''quit''' :


* On demande la liste des répertoires grâce à la commande '''LIST "" "*"''' :
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">quit</span><br />
221 2.0.0 Bye<br />
Connection closed by foreign host. }}


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">2 LIST "" "*"</span><br />
==== Test du serveur POP3 ====
¤ LIST (\HasNoChildren) "." "INBOX.Queue"<br />
¤ LIST (\HasNoChildren) "." "INBOX.Drafts"<br />
¤ LIST (\HasNoChildren) "." "INBOX.Trash"<br />
¤ LIST (\HasNoChildren) "." "INBOX.junkmail"<br />
¤ LIST (\HasNoChildren) "." "INBOX.Sent"<br />
¤ LIST (\Marked \HasChildren) "." "INBOX"<br />
¤ LIST (\HasNoChildren) "." "INBOX.virus"<br />
2 OK LIST completed }}


* On accès au dossier des message reçus dans le dossier '''INBOX''' avec la commande '''SELECT <nom_dossier>''' :
* 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''' :


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">3 SELECT INBOX</span><br />
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 110</span><br />
¤ FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)<br />
Trying 10.0.0.44...
¤ OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited<br />
Connected to 10.0.0.44.
¤ 4 EXISTS<br />
Escape character is '^]'.
¤ 4 RECENT<br />
+OK Hello there.
¤ OK [UIDVALIDITY 1391044096] Ok<br />
}}
¤ OK [MYRIGHTS "acdilrsw"] ACL<br />
3 OK [READ-WRITE] Ok }}


* On liste les message reçus dans le dossier '''INBOX''' avec la commande '''SELECT <nom_dossier>''' :
* On indique le nom d'utilisateur UNIX du compte avec la commande '''user''' :


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">4 UID FETCH 1:* RFC822.SIZE</span><br />
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">user alice</span><br />
¤ 1 FETCH (UID 1 RFC822.SIZE 280)<br />
+OK Password required }}
4 OK FETCH completed. }}


* On consulte le message avec l''''UID 1''' en saisisant la commande '''UID FETCH <UID_message> BODY[]''' :
* Le serveur demande le mot de passe du compte, on lui indique via la commande '''pass''' :


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">5 UID FETCH 4 BODY[]</span><br />
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">pass alice</span><br />
¤ 4 FETCH (UID 1 BODY[] {310}<br />
+OK logged in. }}
Return-Path: <root@mail.glx><br />
X-Original-To: alice@mail.glx<br />
Delivered-To: alice@mail.glx<br />
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])<br />
___by alice.lan (Postfix) with SMTP id 511AB628A2<br />
___for <alice@mail.glx>; Thu, 30 Jan 2014 01:56:23 +0100 (CET)<br /><br />


test d'envoi / réception<br />
* Le serveur accepte la connexion. On consulte la liste des messages avec la commande '''list''' :
Merci ;)<br />
)<br />
¤ 4 FETCH (FLAGS (\Seen \Recent))<br />
5 OK FETCH completed. }}


* On ferme la connexion avec la commande '''LOGOUT''' :
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">list</span><br />
+OK POP3<br />
1 280<br />
. }}


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">6 logout</span><br />
* On affiche les '''20''' premières lignes du message '''1''' avec la commande '''top''' :
¤ BYE Courier-IMAP server shutting down<br />
6 OK LOGOUT completed<br />
Connection closed by foreign host. }}


==== Autres méthodes ====
{{ Box_Console | objet=<span style="font-family:sans-serif;color:blue">top 1 20</span><br />
+OK headers follow.<br />
Return-Path: <root@mail.glx><br />
X-Original-To: alice@mail.glx<br />
Delivered-To: alice@mail.glx<br />
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])<br />
__by alice.lan (Postfix) with SMTP id A3242628A2<br />
__for <alice@mail.glx>; Thu, 30 Jan 2014 01:20:57 +0100 (CET)<br /><br />


On peut également vérifier que le mail est bien été acheminé.
test<br />
.
}}


* Via les logs stockés dans '''/var/log/mail.log''' :
==== Test du serveur IMAP ====


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")
* On se connecte au serveur sur le port '''imap 143''' :
Jan 30 02:29:40 alice postfix/qmgr[13254]: C01187F9FA: removed


* En interrogeant la file d'attente :
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">telnet 10.0.0.44 143</span><br />
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
¤ OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL<br />ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc.  See COPYING for distribution information. }}


{{ Box Console | objet=/usr/bin/mailq }}
* Le serveur attend un login est un mot de passe. Pour cela, on utilise la commande '''LOGIN <user> <password>''' :


== Authentification SMTP Postfix ==
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">01 LOGIN alice alice</span><br />
1 OK LOGIN Ok. }}


<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;margin-bottom:25px;height:210px;">SMTP en Open Relay<br /><br />
* On demande la liste des répertoires grâce à la commande '''LIST "" "*"''' :


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.
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">2 LIST "" "*"</span><br />
<br /><br />
¤ LIST (\HasNoChildren) "." "INBOX.Queue"<br />
Cette section va justement permettre d'initier une phase d'authentification pour toute tentative d'envoi de messages via Postfix. Ceci permettra d'éviter que le serveur soit utiliser à tord par des personnes mal intentionnées pour diffuser du spam''. </div>
¤ LIST (\HasNoChildren) "." "INBOX.Drafts"<br />
 
¤ LIST (\HasNoChildren) "." "INBOX.Trash"<br />
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 ''('''P'''luggable '''A'''uthentication '''M'''odules, utilisé par Linux)''.
¤ LIST (\HasNoChildren) "." "INBOX.junkmail"<br />
¤ LIST (\HasNoChildren) "." "INBOX.Sent"<br />
¤ LIST (\Marked \HasChildren) "." "INBOX"<br />
¤ LIST (\HasNoChildren) "." "INBOX.virus"<br />
2 OK LIST completed }}


{{ Box Console | objet=sudo apt-get install sasl2-bin }}
* On accède au dossier des messages reçus dans '''INBOX''' avec la commande '''SELECT <nom_dossier>''' :


=== Activation du module ===
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">3 SELECT INBOX</span><br />
¤ FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)<br />
¤ OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited<br />
¤ 4 EXISTS<br />
¤ 4 RECENT<br />
¤ OK [UIDVALIDITY 1391044096] Ok<br />
¤ OK [MYRIGHTS "acdilrsw"] ACL<br />
3 OK [READ-WRITE] Ok }}


* Editer le fichier de configuration '''/etc/default/saslauthd''', puis remplacer :
* On liste les messages reçus dans le dossier '''INBOX''' avec la commande '''SELECT <nom_dossier>''' :


START=no
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">4 UID FETCH 1:* RFC822.SIZE</span><br />
¤ 1 FETCH (UID 1 RFC822.SIZE 280)<br />
4 OK FETCH completed. }}


* par :
* On consulte le message avec l''''UID 1''' en saisisant la commande '''UID FETCH <UID_message> BODY[]''' :


START=yes
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">5 UID FETCH 4 BODY[]</span><br />
 
¤ 4 FETCH (UID 1 BODY[] {310}<br />
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)''.
Return-Path: <root@mail.glx><br />
X-Original-To: alice@mail.glx<br />
Delivered-To: alice@mail.glx<br />
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])<br />
___by alice.lan (Postfix) with SMTP id 511AB628A2<br />
___for <alice@mail.glx>; Thu, 30 Jan 2014 01:56:23 +0100 (CET)<br /><br />
 
test d'envoi / réception<br />
Merci ;)<br />
)<br />
¤ 4 FETCH (FLAGS (\Seen \Recent))<br />
5 OK FETCH completed. }}


* Remplacer aussi la ligne :
* On ferme la connexion avec la commande '''LOGOUT''' :


OPTIONS="-c -m /var/run/saslauthd"
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">6 logout</span><br />
¤ BYE Courier-IMAP server shutting down<br />
6 OK LOGOUT completed<br />
Connection closed by foreign host. }}


* Par :
==== Autres méthodes ====


OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
On peut également vérifier que le mail a bien été acheminé.


* On crée le répertoire '''/var/spool/postfix/var/run/saslauthd''' avec les permissions adéquates :
* Via les logs stockés dans '''/var/log/mail.log''' :


{{ Box Console | objet=mkdir -p /var/spool/postfix/var/run/saslauthd<br />
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")
chown -R root:sasl /var/spool/postfix/var/run/saslauthd<br />
Jan 30 02:29:40 alice postfix/qmgr[13254]: C01187F9FA: removed
chmod 710 /var/spool/postfix/var/run/saslauthd }}


* On ajoute l'utilisateur '''Postfix''' au groupe '''sasl''' :
* En interrogeant la file d'attente :


{{ Box Console | objet=adduser postfix sasl }}
{{ Box Console | objet=/usr/bin/mailq }}


* On crée le fichier '''/etc/pam.d/smtp''' et on y insère les éléments suivants :
== Authentification SMTP Postfix ==


@include common-auth
<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;margin-bottom:25px;height:210px;">SMTP en Open Relay<br /><br />
@include common-account
@include common-password
@include common-session


* On démarre le daemon saslauthd :
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.
<br /><br />
Cette section va justement permettre d'initier une phase d'authentification pour toute tentative d'envoi de messages via Postfix. Ceci permettra d'éviter que le serveur soit utiliser à tort par des personnes mal intentionnées pour diffuser du spam''. </div>


{{ Box Console | objet=service saslauthd start }}
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 ''('''P'''luggable '''A'''uthentication '''M'''odules, utilisé par Linux)''.


=== Intégration dans Postfix ===
{{ Box Console | objet=sudo apt-get install sasl2-bin }}


* Ajouter les lignes suivantes à la fin du fichier '''/etc/postfix/main.cf''' :
=== Activation du module ===


broken_sasl_auth_clients = yes
* Editer le fichier de configuration '''/etc/default/saslauthd''', puis remplacer :
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'''
START=no


pwcheck_method: saslauthd
* par :
mech_list: PLAIN LOGIN


* On redémarre '''Postfix''' pour appliquer les nouveaux paramètres :
START=yes


{{ Box Console | objet=service postfix restart }}
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)''.


=== Vérification ===
* Remplacer aussi la ligne :


==== La commande ehlo ====
OPTIONS="-c -m /var/run/saslauthd"


La commande ehlo permet de s'annoncer au serveur. Certains serveur SMTP la requiert avant toute autre action. Dans notre cas elle nous permet de voir les méthodes d'authentification acceptés par le serveur SMTP.
* Par :


* Résultat de la commande '''ehlo''' <span style="font-family:sans-serif;color:red">sans</span> le module '''sasl''' d'activé :
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 :


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
{{ Box Console | objet=mkdir -p /var/spool/postfix/var/run/saslauthd<br />
Trying 10.0.0.44...<br />
chown -R root:sasl /var/spool/postfix/var/run/saslauthd<br />
Connected to 10.0.0.44.<br />
chmod 710 /var/spool/postfix/var/run/saslauthd }}
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">ehlo alice.lan</span><br />
250-alice.lan<br />
250-PIPELINING<br />
250-SIZE 5120000<br />
250-VRFY<br />
250-ETRN<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}


* Résultat de la commande '''ehlo''' <span style="font-family:sans-serif;color:green">avec</span> le module '''sasl''' d'activé :
* On ajoute l'utilisateur '''Postfix''' au groupe '''sasl''' :


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
{{ Box Console | objet=adduser postfix sasl }}
Trying 10.0.0.44...<br />
 
Connected to 10.0.0.44.<br />
* On crée le fichier '''/etc/pam.d/smtp''' et on y insère les éléments suivants :
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">ehlo ncad.fr</span><br />
250-alice.lan<br />
250-PIPELINING<br />
250-SIZE 5120000<br />
250-VRFY<br />
250-ETRN<br />
<span style="font-family:sans-serif;color:green">250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN</span><br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}


==== Envoi sans authentification ====
@include common-auth
@include common-account
@include common-password
@include common-session


* Tentative d'envoi sans authentification :
* On démarre le daemon saslauthd :


{{ box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
{{ Box Console | objet=service saslauthd start }}
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
mail from:<root@mail.glx><br />
250 2.1.0 Ok<br />
rcpt to:<nicolas@cachelou.fr><br />
554 5.7.1 <nicolas@cachelou.fr>: <span style="font-family:sans-serif;color:red">Relay access denied</span><br />
221 2.7.0 Error: I can break rules, too. Goodbye.<br />
Connection closed by foreign host. }}


* Trace laissée dans '''/var/mail/mail.log''' :
=== Intégration dans Postfix ===


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
* Ajouter les lignes suivantes à la fin du fichier '''/etc/postfix/main.cf''' :


Le serveur refuse le destinataire avec pour motif : '''Relay access denied'''.
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


{{ Box Remarque | objet=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. }}
* 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 :
 
{{ Box Console | objet=service postfix restart }}
 
=== Vérification ===
 
==== La commande ehlo ====


==== Envoi avec authentification ====
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.


* Tentative d'envoi avec authentification :
* Résultat de la commande '''ehlo''' <span style="font-family:sans-serif;color:red">sans</span> le module '''sasl''' d'activé :


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
Ligne 444 : Ligne 464 :
Escape character is '^]'.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">auth login YWxpY2U=</span><br />
<span style="font-family:sans-serif;color:blue">ehlo alice.lan</span><br />
334 UGFzc3dvcmQ6<br />
250-alice.lan<br />
<span style="font-family:sans-serif;color:blue">YWxpY2U=</span><br />
250-PIPELINING<br />
235 2.7.0 Authentication successful<br />
250-SIZE 5120000<br />
mail from:<root@mail.glx><br />
250-VRFY<br />
250 2.1.0 Ok<br />
250-ETRN<br />
rcpt to:<nicolas@cachelou.fr><br />
250-ENHANCEDSTATUSCODES<br />
250 2.1.5 Ok<br />
250-8BITMIME<br />
data<br />
250 DSN }}
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
250 2.0.0 Ok: queued as 8EDAD62881 }}
<br />
{{ Box Information | objet=Le nom d'utilisateur et le mot de passe sont encodés en Base64. Plus d'informations [[Debug_Messagerie#S.27authentifier|ici]] }}


* Trace laissée dans '''/var/mail/mail.log''' :
* Résultat de la commande '''ehlo''' <span style="font-family:sans-serif;color:green">avec</span> le module '''sasl''' d'activé :


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
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
Jan 30 14:49:05 alice postfix/cleanup[24315]: CD53F62881: message-id=<>
Trying 10.0.0.44...<br />
Jan 30 14:49:05 alice postfix/qmgr[24195]: CD53F62881: from=<root@mail.glx>, size=190, nrcpt=1 (queue active)
Connected to 10.0.0.44.<br />
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))
Escape character is '^]'.<br />
Jan 30 14:49:07 alice postfix/cleanup[24315]: 31F5F63799: message-id=<20140130134907.31F5F63799@alice.lan>
220 alice.lan ESMTP Postfix<br />
Jan 30 14:49:07 alice postfix/qmgr[24195]: 31F5F63799: from=<>, size=2576, nrcpt=1 (queue active)
<span style="font-family:sans-serif;color:blue">ehlo ncad.fr</span><br />
Jan 30 14:49:07 alice postfix/bounce[24317]: CD53F62881: sender non-delivery notification: 31F5F63799
250-alice.lan<br />
Jan 30 14:49:07 alice postfix/qmgr[24195]: CD53F62881: removed
250-PIPELINING<br />
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")
250-SIZE 5120000<br />
Jan 30 14:49:07 alice postfix/qmgr[24195]: 31F5F63799: removed
250-VRFY<br />
250-ETRN<br />
<span style="font-family:sans-serif;color:green">250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN</span><br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}


D'après les logs l'authentification bien 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.
==== Envoi sans authentification ====


== Sécuriser les échanges SMTP ==
* Tentative d'envoi sans authentification :


<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:180px;">Avertissement<br /><br />
{{ box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
 
Trying 10.0.0.44...<br />
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.
Connected to 10.0.0.44.<br />
Vous observerez qu'à défaut d'une connexion sécurisée, toutes les données transitent en claires 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.</div>
Escape character is '^]'.<br />
 
220 alice.lan ESMTP Postfix<br />
=== Défaut des échanges en clairs ===
mail from:<root@mail.glx><br />
250 2.1.0 Ok<br />
rcpt to:<nicolas@cachelou.fr><br />
554 5.7.1 <nicolas@cachelou.fr>: <span style="font-family:sans-serif;color:red">Relay access denied</span><br />
221 2.7.0 Error: I can break rules, too. Goodbye.<br />
Connection closed by foreign host. }}


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 couriel depuis le client de messagerie '''Thundirbird'''.
* Trace laissée dans '''/var/log/mail.log''' :


[[Image:POSTFIX_Analyse_SMTP_Send.png|thumb|center|550px|Trame d'échanges SMTP entre Thundirbird et Postfix]]
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


On remarquera surtout les 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.
Le serveur refuse le destinataire avec pour motif : '''Relay access denied'''.


Dans ces 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.
{{ Box Remarque | objet=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. }}


=== Activer TLS ===
==== Envoi avec authentification ====


* Ajouter les lignes suivantes dans le fichier de configuration de Postfix '''/etc/postfix/main.cf''' juste après la ligne '''readme_directory = no''' :
* Tentative d'envoi avec authentification :


smtpd_tls_cert_file=/etc/postfix/ssl/smtpd.cert
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
smtpd_tls_key_file=/etc/postfix/ssl/smtpd.key
Trying 10.0.0.44...<br />
smtpd_use_tls=yes
Connected to 10.0.0.44.<br />
smtpd_tls_received_header = yes
Escape character is '^]'.<br />
smtpd_tls_loglevel = 1
220 alice.lan ESMTP Postfix<br />
smtpd_tls_ask_ccert = yes
<span style="font-family:sans-serif;color:blue">auth login YWxpY2U=</span><br />
smtpd_tls_security_level = may
334 UGFzc3dvcmQ6<br />
<span style="font-family:sans-serif;color:blue">YWxpY2U=</span><br />
smtp_tls_loglevel = 1
235 2.7.0 Authentication successful<br />
smtp_tls_cert_file=/etc/postfix/ssl/smtpd.cert
mail from:<root@mail.glx><br />
smtp_tls_key_file=/etc/postfix/ssl/smtpd.key
250 2.1.0 Ok<br />
rcpt to:<nicolas@cachelou.fr><br />
250 2.1.5 Ok<br />
data<br />
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
250 2.0.0 Ok: queued as 8EDAD62881 }}
<br />
{{ Box Information | objet=Le nom d'utilisateur et le mot de passe sont encodés en Base64. Plus d'informations [[Debug_Messagerie#S.27authentifier|ici]] }}


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.
* Trace laissée dans '''/var/log/mail.log''' :


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)''.
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=<>
* Créer le certificat '''ssl''' dans le répertoire '''/etc/postfix/ssl''' :
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 ==
 
<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:180px;">Avertissement<br /><br />
 
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.</div>
 
=== Défaut des échanges en clairs ===


{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">mkdir -p /etc/postfix/ssl<br />
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'''.
cd /etc/postfix/ssl<br />
 
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509</span><br />
[[Image:POSTFIX_Analyse_SMTP_Send.png|thumb|center|550px|Trame d'échanges SMTP entre Thundirbird et Postfix]]
<span style="color:grey">Generating a 2048 bit RSA private key<br />
.................................................................................+++<br />
..........................................................................+++<br />
writing new private key to 'imap.key'<br /></span>
- - - - -<br />
<span style="color:grey">You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br /></span>
- - - - -<br />
Country Name (2 letter code) [AU]:<span style="color:blue;font-family:sans-serif">FR</span><br />
State or Province Name (full name) [Some-State]:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Locality Name (eg, city) []:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="color:blue;font-family:sans-serif">NCad Network</span><br />
Organizational Unit Name (eg, section) []:<span style="color:blue;font-family:sans-serif">Intranet Goulouxiou</span><br />
Common Name (e.g. server FQDN or YOUR name) []:<span style="color:blue;font-family:sans-serif">10.0.0.44</span><br />
Email Address []:<span style="color:blue;font-family:sans-serif">tech@ncad.fr</span> }}
<br /><br />
{{ Box Information | objet=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
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.


{{ Box Console | objet=service postfix restart }}
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.


=== Vérification ===
=== Activer TLS ===


* Se connecter au serveur '''Postfix''' depuis le port '''smtp 25''' :
* Ajouter les lignes suivantes dans le fichier de configuration de Postfix '''/etc/postfix/main.cf''' juste après la ligne '''readme_directory = no''' :


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
smtpd_tls_cert_file=/etc/postfix/ssl/smtpd.cert
Trying 10.0.0.44...<br />
smtpd_tls_key_file=/etc/postfix/ssl/smtpd.key
Connected to 10.0.0.44.<br />
smtpd_use_tls=yes
Escape character is '^]'.<br />
smtpd_tls_received_header = yes
220 alice.lan ESMTP Postfix<br />
smtpd_tls_loglevel = 1
ehlo ncad.fr<br />
smtpd_tls_ask_ccert = yes
250-alice.lan<br />
smtpd_tls_security_level = may
250-PIPELINING<br />
250-SIZE 5120000<br />
smtp_tls_loglevel = 1
250-VRFY<br />
smtp_tls_cert_file=/etc/postfix/ssl/smtpd.cert
250-ETRN<br />
smtp_tls_key_file=/etc/postfix/ssl/smtpd.key
<span style="font-family:sans-serif;color:green">250-STARTTLS</span><br />
250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}


On remarquera l'apparition de la ligne '''StartTLS''' qui indique que le serveur peut crypter les échanges si le client le souhaite.
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.


* 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 securité pour la connexion '''STARTTLS'''. L'adresse des serveurs '''POP/IMAP''' et '''SMTP''' correspond à l'adresse IP du serveur '''Postfix'''.
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)''.


* Lors de l'envoi d'un message on observe ceci dans les logs '''Postfix''' dans le fichier '''/var/log/mail.log''' :
* Créer le certificat '''ssl''' dans le répertoire '''/etc/postfix/ssl''' :
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)'':
{{ Box Console | objet=<span style="color:blue;font-family:sans-serif">mkdir -p /etc/postfix/ssl<br />
 
cd /etc/postfix/ssl<br />
[[Image:POSTFIX_Analyse_SMTP_Send_TLS.png|thumb|center|550px|Trame d'échanges SMTP entre Thundirbird et Postfix chiffrée]]
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509</span><br />
 
<span style="color:grey">Generating a 2048 bit RSA private key<br />
=== Forcer l'authentification chiffrée en StartTLS ===
.................................................................................+++<br />
 
..........................................................................+++<br />
* Dans ce mode de configuration, deux types d'échanges cohabitent : <span style="color:green">sécurisés</span> et <span style="color:red">non sécurisés</span>. Ceci se vérifie facilement en accédant au serveur :
writing new private key to 'imap.key'<br /></span>
- - - - -<br />
<span style="color:grey">You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br /></span>
- - - - -<br />
Country Name (2 letter code) [AU]:<span style="color:blue;font-family:sans-serif">FR</span><br />
State or Province Name (full name) [Some-State]:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Locality Name (eg, city) []:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="color:blue;font-family:sans-serif">NCad Network</span><br />
Organizational Unit Name (eg, section) []:<span style="color:blue;font-family:sans-serif">Intranet Goulouxiou</span><br />
Common Name (e.g. server FQDN or YOUR name) []:<span style="color:blue;font-family:sans-serif">10.0.0.44</span><br />
Email Address []:<span style="color:blue;font-family:sans-serif">tech@ncad.fr</span> }}
<br /><br />
{{ Box Information | objet=Pour un serveur en production on prendra son IP publique ou son nom de machine (champ Common Name). }}


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
* Redémarrer le service '''Postfix''' pour appliquer la configuration
Trying 10.0.0.44...<br />
 
Connected to 10.0.0.44.<br />
{{ Box Console | objet=service postfix restart }}
Escape character is '^]'.<br />
 
220 alice.lan ESMTP Postfix<br />
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
ehlo ncad.fr<br />
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Forcer TLS pour les envois</div>
250-alice.lan<br />
 
250-PIPELINING<br />
<div style="width:99%;padding:5px;">
250-SIZE 5120000<br />
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.
250-VRFY<br />
 
250-ETRN<br />
* 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é :
<span style="font-family:sans-serif;color:green">250-STARTTLS</span><br />
<span style="font-family:sans-serif;color:red">250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br /></span>
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}


* On remarque que le serveur nous informe sur deux choses :
Received: from geocoucou.net.ncad.fr (mail.geocoucou.eu. [109.190.211.49])
** Il accepte l''''authentification en clair''' dont il nous énonce les méthodes : <span style="color:red">PLAIN LOGIN</span>.
        by mx.google.com with <span style="color:red;font-family:sans-serif">ESMTP</span> id g1si9649314wmg.53.2016.03.15.03.21.07
** Il accepte les '''échanges chiffrés''' en nous indiquant <span style="color:green">StartTLS</span>.
        for <cacheloun@gmail.com>;
        Tue, 15 Mar 2016 03:21:07 -0700 (PDT)


* 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 [[Postfix#V.C3.A9rification_2|Vérification]] ligne 1 à 5)''. Pour cela, dans le fichier '''/etc/postfix/main.cf''' on va remplacer :
* 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.


smtpd_tls_security_level = may
* Dans le fichier de configuration '''/etc/postfix/main.cf'''' - après la ligne '''smtpd_tls_security_level''' - on y ajoute la ligne suivante :


* Par :
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy_map


smtpd_tls_security_level = encrypt
* 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 :


* On redémarre le service Postfix :
gmail.com      encrypt


{{ Box Console | objet=sudo service postfix restart }}
* Il faut générer la base et recharger la configuration de '''Postfix''' pour que les modifications soient prises en compte.


* Puis on se connecter de nouveau au serveur :
{{ Box Console | objet=postmap /etc/postfix/tls_policy_map<br />
service postfix reload }}


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
* 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 <span style="color:green;font-family:sans-serif">ESMTPS</span> id h197si23802268wmd.118.2016.03.15.03.31.17
        for <cacheloun@gmail.com>
        <span style="color:green;font-family:sans-serif">(version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);</span>
        Tue, 15 Mar 2016 03:31:17 -0700 (PDT)
 
{{ Box Remarque | objet=On remarquera que le service qui apparaît dans l'en-tête du courriel est  '''ESMTPS'''. }}
 
</div></div>
 
=== Vérification ===
 
* Se connecter au serveur '''Postfix''' depuis le port '''smtp 25''' :
 
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
Trying 10.0.0.44...<br />
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Connected to 10.0.0.44.<br />
Ligne 634 : Ligne 681 :
250-ETRN<br />
250-ETRN<br />
<span style="font-family:sans-serif;color:green">250-STARTTLS</span><br />
<span style="font-family:sans-serif;color:green">250-STARTTLS</span><br />
250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br />
250-ENHANCEDSTATUSCODES<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250-8BITMIME<br />
250 DSN }}
250 DSN }}


On remarque la disparition des lignes '''AUTH'''.
On remarquera l'apparition de la ligne '''StartTLS''' qui indique que le serveur peut chiffrer les échanges si le client le souhaite.


* 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:''' :
* 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'''.


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
* Lors de l'envoi d'un message on observe ceci dans les logs '''Postfix''' dans le fichier '''/var/log/mail.log''' :
Trying 10.0.0.44...<br />
Jan 30 20:17:54 alice postfix/smtpd[28407]: connect from oxtrode.net.ncad.fr[10.0.0.51]
Connected to 10.0.0.44.<br />
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)
Escape character is '^]'.<br />
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
220 alice.lan ESMTP Postfix<br />
Jan 30 20:17:54 alice postfix/cleanup[28410]: 98A4163777: message-id=<52EAA55B.7090404@mail.glx>
mail from:<alice@mail.glx><br />
Jan 30 20:17:54 alice postfix/smtpd[28407]: disconnect from oxtrode.net.ncad.fr[10.0.0.51]
<span style="font-family:sans-serif;color:red">530 5.7.0 Must issue a STARTTLS command first</span> }}
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)


== Sécuriser les échanges IMAP ==
* 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)'':


<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:180px;">Avertissement<br /><br />
[[Image:POSTFIX_Analyse_SMTP_Send_TLS.png|thumb|center|550px|Trame d'échanges SMTP entre Thundirbird et Postfix chiffrée]]


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.
=== Forcer l'authentification chiffrée en StartTLS ===
Vous observerez qu'à défaut d'une connexion sécurisée, toutes les données transitent en claires 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.</div>


=== Défaut des échanges en clair ===
* Dans ce mode de configuration, deux types d'échanges cohabitent : <span style="color:green">sécurisés</span> et <span style="color:red">non sécurisés</span>. Ceci se vérifie facilement en accédant au serveur :


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'''.
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
 
Trying 10.0.0.44...<br />
[[Image:POSTFIX_Analyse_IMAP.png|thumb|center|550px|Trame d'échanges Imap entre Thundirbird et Postfix]]
Connected to 10.0.0.44.<br />
 
Escape character is '^]'.<br />
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'''.
220 alice.lan ESMTP Postfix<br />
 
ehlo ncad.fr<br />
{{ Box Attention | objet=Les données transitent en clair de la machine ou est installé le client de messagerie jusqu'au serveur mail du fournisseur du service }}
250-alice.lan<br />
250-PIPELINING<br />
250-SIZE 5120000<br />
250-VRFY<br />
250-ETRN<br />
<span style="font-family:sans-serif;color:green">250-STARTTLS</span><br />
<span style="font-family:sans-serif;color:red">250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br /></span>
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}
 
* On remarque que le serveur nous informe sur deux choses :
** Il accepte l''''authentification en clair''' dont il nous énonce les méthodes : <span style="color:red">PLAIN LOGIN</span>.
** Il accepte les '''échanges chiffrés''' en nous indiquant <span style="color:green">StartTLS</span>.


=== Activer SSL ===
* 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 [[Postfix#V.C3.A9rification_2|Vérification]] ligne 1 à 5)''. Pour cela, dans le fichier '''/etc/postfix/main.cf''' on va remplacer :


* Installation du service '''courier-imap-ssl''' :
smtpd_tls_security_level = may


{{Box Console | objet=sudo apt-get install courier-imap-ssl}}
* Par :


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.
smtpd_tls_security_level = encrypt


{{ Box Information | objet=Pour un serveur en production on prendra son IP publique ou son '''nom de machine''' (champ Common Name). }}
* On redémarre le service Postfix :


* Génération du certificat :
{{ Box Console | objet=sudo service postfix restart }}


{{Box Console | objet=cd /etc/courier/<br />
* Puis on se connecter de nouveau au serveur :
openssl req -new -outform PEM -out imapd.cert -newkey rsa:2048 -nodes -keyout imapd.key -keyform PEM -days 365 -x509<br />
<span style="color:grey">Generating a 2048 bit RSA private key<br />
.................................................................................+++<br />
..........................................................................+++<br />
writing new private key to 'imap.key'<br /></span>
- - - - -<br />
<span style="color:grey">You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br /></span>
- - - - -<br />
Country Name (2 letter code) [AU]:<span style="color:blue;font-family:sans-serif">FR</span><br />
State or Province Name (full name) [Some-State]:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Locality Name (eg, city) []:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="color:blue;font-family:sans-serif">NCad Network</span><br />
Organizational Unit Name (eg, section) []:<span style="color:blue;font-family:sans-serif">Intranet Goulouxiou</span><br />
Common Name (e.g. server FQDN or YOUR name) []:<span style="color:blue;font-family:sans-serif">10.0.0.44</span><br />
Email Address []:<span style="color:blue;font-family:sans-serif">tech@ncad.fr</span> }}


* Création du fichier '''imapd.pem'''. Ce fichier est une fusion de '''imapd.cert''' et '''imapd.key''' :
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
 
Trying 10.0.0.44...<br />
{{Box Console | objet=cd /etc/courier<br />
Connected to 10.0.0.44.<br />
touch imapd.pem<br />
Escape character is '^]'.<br />
cat imapd.cert > imapd.pem<br />
220 alice.lan ESMTP Postfix<br />
cat imapd.key >> imapd.pem}}
ehlo ncad.fr<br />
250-alice.lan<br />
250-PIPELINING<br />
250-SIZE 5120000<br />
250-VRFY<br />
250-ETRN<br />
<span style="font-family:sans-serif;color:green">250-STARTTLS</span><br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN }}


On remarque la disparition des lignes '''AUTH'''.


* 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''' :
* 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:''' :


TLS_PROTOCOL="TLS1_1:TLS1:SSL3"
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
TLS_CERTFILE=/etc/courier/imap.pem
Trying 10.0.0.44...<br />
TLS_TRUSTCERTS=/etc/courier/imap.pem
Connected to 10.0.0.44.<br />
TLS_VERIFYPEER=NONE
Escape character is '^]'.<br />
 
220 alice.lan ESMTP Postfix<br />
* On redémarre le service pour prendre en compte les nouveaux paramètres :
mail from:<alice@mail.glx><br />
<span style="font-family:sans-serif;color:red">530 5.7.0 Must issue a STARTTLS command first</span> }}


{{ Box Console | objet=service courier-imap-ssl restart }}
== Sécuriser les échanges IMAP ==


=== Vérification ===
<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:180px;">Avertissement<br /><br />


* Se connecter au serveur '''Postfix''' depuis le port '''smtp 25''' :
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.</div>


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 993</span><br />
=== Défaut des échanges en clair ===
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
}}


Le serveur répond sur le port 993.
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'''.


* On peut remarquer avec l'analyseur de trames que le dialogue entre le '''client de messagerie''' et le '''serveur IMAP''' est '''chiffré''' :
[[Image:POSTFIX_Analyse_IMAP.png|thumb|center|550px|Trame d'échanges Imap entre Thundirbird et Postfix]]


[[Image:POSTFIX_Analyse_IMAP_Send_SSL.png|thumb|center|550px|Trame d'échanges IMAP entre Thundirbird et Courier-Imap-SSL chiffrée]]
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'''.


== Sécuriser les échanges POP ==
{{ Box Attention | objet=Les données transitent en clair de la machine ou est installé le client de messagerie jusqu'au serveur mail du fournisseur du service }}


<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:180px;">Avertissement<br /><br />
=== Activer SSL ===


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.
* Installation du service '''courier-imap-ssl''' :
Vous observerez qu'à défaut d'une connexion sécurisée, toutes les données transitent en claires 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.</div>


=== Défaut des échanges en clair ===
{{Box Console | objet=sudo apt-get install courier-imap-ssl}}


À 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.
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.


[[Image:POSTFIX_Analyse_POP.png|thumb|center|550px|Trame d'échanges POP entre Thundirbird et Postfix]]
{{ Box Information | objet=Pour un serveur en production on prendra son IP publique ou son '''nom de machine''' (champ Common Name). }}
 
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'''.
 
{{ Box Attention | objet=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''' :
 
{{Box Console | objet=sudo apt-get install 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.
 
{{ Box Information | objet=Pour un serveur en production on prendra son IP publique ou son nom de machine (champ Common Name). }}


* Génération du certificat :
* Génération du certificat :


{{Box Console | objet=cd /etc/courier/<br />
{{Box Console | objet=cd /etc/courier/<br />
openssl req -new -outform PEM -out popd.cert -newkey rsa:2048 -nodes -keyout popd.key -keyform PEM -days 365 -x509<br />
openssl req -new -outform PEM -out imapd.cert -newkey rsa:2048 -nodes -keyout imapd.key -keyform PEM -days 365 -x509<br />
<span style="color:grey">Generating a 2048 bit RSA private key<br />
<span style="color:grey">Generating a 2048 bit RSA private key<br />
.................................................................................+++<br />
.................................................................................+++<br />
..........................................................................+++<br />
..........................................................................+++<br />
writing new private key to 'popd.key'<br /></span>
writing new private key to 'imap.key'<br /></span>
- - - - -<br />
- - - - -<br />
<span style="color:grey">You are about to be asked to enter information that will be incorporated<br />
<span style="color:grey">You are about to be asked to enter information that will be incorporated<br />
Ligne 787 : Ligne 823 :
Email Address []:<span style="color:blue;font-family:sans-serif">tech@ncad.fr</span> }}
Email Address []:<span style="color:blue;font-family:sans-serif">tech@ncad.fr</span> }}


* Création du fichier '''.pem'''. Ce fichier est une fusion de '''popd.cert''' et '''popd.key''' :
* Création du fichier '''imapd.pem'''. Ce fichier est une fusion de '''imapd.cert''' et '''imapd.key''' :


{{Box Console | objet=cd /etc/courier<br />
{{Box Console | objet=cd /etc/courier<br />
touch imapd.pem<br />
touch imapd.pem<br />
cat popd.cert > popd.pem<br />
cat imapd.cert > imapd.pem<br />
cat popd.key >> popd.pem}}
cat imapd.key >> imapd.pem}}




* Modification de la configuration de '''courier-pop-ssl'''. Pour cela, vérifier les paramètres suivants dans le fichier de configuration '''/etc/courier/imapd-ssl''' :
* 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_PROTOCOL="TLS1_1:TLS1:SSL3"
  TLS_CERTFILE=/etc/courier/imap.pem
  TLS_CERTFILE=/etc/courier/imapd.pem
  TLS_TRUSTCERTS=/etc/courier/imap.pem
  TLS_TRUSTCERTS=/etc/courier/imapd.pem
  TLS_VERIFYPEER=NONE
  TLS_VERIFYPEER=NONE


* On redémarre le service pour prendre en compte les nouveaux paramètres :
* On redémarre le service pour prendre en compte les nouveaux paramètres :


{{ Box Console | objet=service courier-pop-ssl restart }}
{{ Box Console | objet=service courier-imap-ssl restart }}


=== Vérification ===
=== Vérification ===


* Se connecter au serveur '''Postfix''' depuis le port '''smtp 25''' :
* Se connecter au serveur '''Postfix''' depuis le port '''smtp 993''' :


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 995</span><br />
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 993</span><br />
Trying 10.0.0.44...
Trying 10.0.0.44...
Connected to 10.0.0.44.
Connected to 10.0.0.44.
Ligne 816 : Ligne 852 :
}}
}}


Le serveur répond sur le port '''995'''.
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 POPs''' est '''chiffré''' :
* On peut remarquer avec l'analyseur de trames que le dialogue entre le '''client de messagerie''' et le '''serveur IMAP''' est '''chiffré''' :


[[Image:POSTFIX_Analyse_POP_Releve_SSL.png|thumb|center|550px|Trame d'échanges POP entre Thundirbird et Courier-pop-SSL chiffrée]]
[[Image:POSTFIX_Analyse_IMAP_Send_SSL.png|thumb|center|550px|Trame d'échanges IMAP entre Thundirbird et Courier-Imap-SSL chiffrée]]


== Restrictions SMTP ==
== Sécuriser les échanges POP ==


=== Familles de restrictions ===
<div style="text-align:center;color:red;font-family:cursive;font-size:14px;background-color:#DDDDDD;border-radius:5px;width:550px;margin:auto;height:180px;">Avertissement<br /><br />


==== Ordre d'écriture ====
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.</div>


* Pour rappel, voici un exemple d'envoi de mail :
=== Défaut des échanges en clair ===


{{ Box Console | objet=telnet 10.0.0.44 587<br />
À 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.
Trying 10.0.0.44...<br />
 
Connected to 10.0.0.44.<br />
[[Image:POSTFIX_Analyse_POP.png|thumb|center|550px|Trame d'échanges POP entre Thundirbird et Postfix]]
Escape character is '^]'.<br />
 
220 alice.lan ESMTP Postfix<br />
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'''.
ehlo ncad.fr <span style="color:red">''(smtpd_helo_restrictions)''</span><br />
 
250-alice.lan<br />
{{ Box Attention | objet=Les données transitent en clair de la machine ou est installé le client de messagerie jusqu'au serveur mail du fournisseur du service }}
250-PIPELINING<br />
 
250-SIZE 5120000<br />
=== Activer SSL ===
250-VRFY<br />
 
250-ETRN<br />
* Installation du service '''courier-pop-ssl''' :
250-STARTTLS<br />
 
250-AUTH PLAIN LOGIN<br />
{{Box Console | objet=sudo apt-get install courier-pop-ssl}}
250-AUTH=PLAIN LOGIN<br />
 
250-ENHANCEDSTATUSCODES<br />
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.
250-8BITMIME<br />
250 DSN<br />
AUTH LOGIN YWxpY2U=<br />
334 UGFzc3dvcmQ6<br />
YWxpY2U=<br />
235 2.7.0 Authentication successful<br />
mail from:<alice@mail.glx> <span style="color:red">''(smtpd_sender_restrictions)''</span><br />
250 2.1.0 Ok<br />
rcpt to:<nicolas@cachelou.fr> <span style="color:red">''(smtpd_recipient_restrictions)''</span><br />
250 2.1.5 Ok<br />
data<br />
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
250 2.0.0 Ok: queued as EA0F262846<br />
quit<br />
221 2.0.0 Bye<br />
Connection closed by foreign host. }}


* En <span style="color:red">rouge</span>, ce sont les paramètres qui vont permettre de restreindre l'utilisation des commandes ''(ehlo, mail from:, rcpt to:)'' en y appliquant des vérifications ''(adresses mail existantes, utilisateur authentifié, ...)''.
{{ Box Information | objet=Pour un serveur en production on prendra son IP publique ou son nom de machine (champ Common Name). }}


* 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''' :
* Génération du certificat :


<em>[...]</em>
{{Box Console | objet=cd /etc/courier/<br />
smtpd_ehlo_restrictions = ...
openssl req -new -outform PEM -out popd.cert -newkey rsa:2048 -nodes -keyout popd.key -keyform PEM -days 365 -x509<br />
smtpd_sender_restrictions = ...
<span style="color:grey">Generating a 2048 bit RSA private key<br />
smtpd_recipient_restrictions = ...
.................................................................................+++<br />
<em>[...]</em>
..........................................................................+++<br />
writing new private key to 'popd.key'<br /></span>
- - - - -<br />
<span style="color:grey">You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br /></span>
- - - - -<br />
Country Name (2 letter code) [AU]:<span style="color:blue;font-family:sans-serif">FR</span><br />
State or Province Name (full name) [Some-State]:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Locality Name (eg, city) []:<span style="color:blue;font-family:sans-serif">Paris</span><br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="color:blue;font-family:sans-serif">NCad Network</span><br />
Organizational Unit Name (eg, section) []:<span style="color:blue;font-family:sans-serif">Intranet Goulouxiou</span><br />
Common Name (e.g. server FQDN or YOUR name) []:<span style="color:blue;font-family:sans-serif">10.0.0.44</span><br />
Email Address []:<span style="color:blue;font-family:sans-serif">tech@ncad.fr</span> }}


==== Étude de cas ====
* Création du fichier '''.pem'''. Ce fichier est une fusion de '''popd.cert''' et '''popd.key''' :


Les vérifications <span style="color:green">smtpd_sender_restrictions</span> et <span style="color:blue">smtpd_recipient_restrictions</span> sont respectivement effectuées sur l'émetteur et le destinataire de chacun des messages traités par notre serveur '''SMTP Postfix'''.
{{Box Console | objet=cd /etc/courier<br />
cat popd.cert > popd.pem<br />
cat popd.key >> popd.pem}}


* Envoi d'un courriel depuis le serveur '''Postfix''' :


[[Image:POSTFIX_Send.png|center]]
* 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''' :


<p style="text-align:center;font-family:cursive">Le <span style="color:green">sender</span> est '''alice@mail.glx''' et le <span style="color:blue">receiver</span> est '''autre@ncad.fr'''.</p>
TLS_PROTOCOL="TLS1_1:TLS1:SSL3"
TLS_CERTFILE=/etc/courier/popd.pem
TLS_TRUSTCERTS=/etc/courier/popd.pem
TLS_VERIFYPEER=NONE


* Réception d'un courriel depuis le serveur '''Postfix''' :
* On redémarre le service pour prendre en compte les nouveaux paramètres :


[[Image:POSTFIX_Receive.png|center]]
{{ Box Console | objet=service courier-pop-ssl restart }}


<p style="text-align:center;font-family:cursive">Le <span style="color:green">sender</span> est '''autre@ncad.fr''' et le <span style="color:blue">receiver</span> est '''alice@mail.glx'''.</p>
=== Vérification ===


* Envoi d'un courrier vers une autre '''boîte locale''' :
* Se connecter au serveur '''Postfix''' depuis le port '''smtp 995''' :


[[Image:POSTFIX_Local.png|center]]
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 995</span><br />
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
}}


<p style="text-align:center;font-family:cursive">Le <span style="color:green">sender</span> est '''alice@mail.glx''' et le <span style="color:blue">receiver</span> est '''lapin-blanc@mail.glx'''.</p>
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 sur le hello/ehlo ===
[[Image:POSTFIX_Analyse_POP_Releve_SSL.png|thumb|center|550px|Trame d'échanges POP entre Thundirbird et Courier-pop-SSL chiffrée]]


* 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.
== Restrictions SMTP ==


smtpd_helo_required = yes
=== Familles de restrictions ===
smtpd_helo_restrictions =
  reject_unknown_helo_hostname


* On applique les paramètres :
==== Ordre d'écriture ====


{{ Box Console | objet=service postfix restart }}
* Pour rappel, voici un exemple d'envoi de mail :
 
* Maintenant on tente d'envoyer un mail sans commande '''ehlo''' au démarrage de la connexion :


{{ Box Console | objet=telnet 10.0.0.44 587<br />
{{ Box Console | objet=telnet 10.0.0.44 587<br />
Ligne 915 : Ligne 955 :
Connected to 10.0.0.44.<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
220 alice.lan ESMTP Postfix <span style="color:red">''(smtpd_client_restrictions)''</span><br />
mail from:<alice@mail.glx><br />
ehlo ncad.fr <span style="color:red">''(smtpd_helo_restrictions)''</span><br />
<span style="color:red">503 5.5.1 Error: send HELO/EHLO first</span> }}
250-alice.lan<br />
 
250-PIPELINING<br />
* On essaye cette fois-ci en utilisant un nom de domaine fictif ''(filtre reject_unknown_helo_hostname)'':
250-SIZE 5120000<br />
 
250-VRFY<br />
{{ Box Console | objet=telnet 10.0.0.44 587<br />
250-ETRN<br />
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
ehlo quoi.tld<br />
250-alice.lan<br />
250-PIPELINING<br />
250-SIZE 5120000<br />
250-VRFY<br />
250-ETRN<br />
250-STARTTLS<br />
250-STARTTLS<br />
250-AUTH PLAIN LOGIN<br />
250-AUTH PLAIN LOGIN<br />
Ligne 938 : Ligne 968 :
250-8BITMIME<br />
250-8BITMIME<br />
250 DSN<br />
250 DSN<br />
mail from:<root@mail.glx><br />
AUTH LOGIN YWxpY2U=<br />
334 UGFzc3dvcmQ6<br />
YWxpY2U=<br />
235 2.7.0 Authentication successful<br />
mail from:<alice@mail.glx> <span style="color:red">''(smtpd_sender_restrictions)''</span><br />
250 2.1.0 Ok<br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
rcpt to:<nicolas@cachelou.fr> <span style="color:red">''(smtpd_recipient_restrictions)''</span><br />
<span style="color:red">450 4.7.1 <quoi.tld>: Helo command rejected: Host not found</span> }}
250 2.1.5 Ok<br />
 
data <span style="color:red">''(smtpd_data_restrictions)''</span><br />
=== Restriction émetteur/sender ===
354 End data with <CR><LF>.<CR><LF><br />
test<br />
. <span style="color:red">''(smtpd_end_of_data_restrictions)''</span><br />
250 2.0.0 Ok: queued as EA0F262846<br />
quit<br />
221 2.0.0 Bye<br />
Connection closed by foreign host. }}


{{ Box Information | objet=Les restrictions sur le destinataire s'effectuent grâce au paramètre <span style="color:grey">smtpd_sender_restrictions</span> qui est à insérer dans le fichier de configuration <span style="color:grey">/etc/postfix/main.cf</span> juste après le paramètre <span style="color:grey">smtpd_helo_restrictions</span>. }}
* En <span style="color:red">rouge</span>, 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''' :
 
<em>[...]</em>
smtpd_client_restrictions = ...
smtpd_ehlo_restrictions = ...
smtpd_sender_restrictions = ...
smtpd_recipient_restrictions = ...
smtpd_data_restrictions = ...
smtpd_end_of_data_restrictions = ...
<em>[...]</em>
 
==== Étude de cas ====


==== Contrôler l'adresse mail de l'émetteur ====
Les vérifications <span style="color:green">smtpd_sender_restrictions</span> et <span style="color:blue">smtpd_recipient_restrictions</span> sont respectivement effectuées sur l'émetteur et le destinataire de chacun des messages traités par notre serveur '''SMTP Postfix'''.


{{ Box Attention | objet=Compatible uniquement avec les serveur smtp Postfix dont l'authentification est activée. }}
* Envoi d'un courriel depuis le serveur '''Postfix''' :


* Par défaut les utilisateur peuvent envoyer des messages en utilisant n'importe quel adresse mail. Voici un exemple :
[[Image:POSTFIX_Send.png|center]]


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
<p style="text-align:center;font-family:cursive">Le <span style="color:green">sender</span> est '''alice@mail.glx''' et le <span style="color:blue">receiver</span> est '''autre@ncad.fr'''.</p>
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">AUTH LOGIN YWxpY2U=</span><br />
334 UGFzc3dvcmQ6<br />
<span style="font-family:sans-serif;color:blue">YWxpY2U=</span><br />
235 2.7.0 Authentication successful<br />
<span style="font-family:sans-serif;color:blue">mail from:<cache@fictif.tld></span><br />
250 2.1.0 Ok<br />
<span style="font-family:sans-serif;color:blue">rcpt to:<nicolas@cachelou.fr></span><br />
250 2.1.5 Ok<br />
<span style="font-family:sans-serif;color:blue">data</span><br />
354 End data with <CR><LF>.<CR><LF><br />
<span style="font-family:sans-serif;color:blue">test</span><br />
<span style="font-family:sans-serif;color:blue">.</span><br />
<span style="font-family:sans-serif;color:green">250 2.0.0 Ok: queued as 7CBDD62846</span><br />
<span style="font-family:sans-serif;color:blue">quit</span><br />
221 2.0.0 Bye<br />
Connection closed by foreign host. }}


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'''.
* Réception d'un courriel depuis le serveur '''Postfix''' :


* 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'''.
[[Image:POSTFIX_Receive.png|center]]


smtpd_sender_login_maps = hash:/etc/postfix/sender_login
<p style="text-align:center;font-family:cursive">Le <span style="color:green">sender</span> est '''autre@ncad.fr''' et le <span style="color:blue">receiver</span> est '''alice@mail.glx'''.</p>


* 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''' :
* Envoi d'un courrier vers une autre '''boîte locale''' :
 
[[Image:POSTFIX_Local.png|center]]
 
<p style="text-align:center;font-family:cursive">Le <span style="color:green">sender</span> est '''alice@mail.glx''' et le <span style="color:blue">receiver</span> est '''lapin-blanc@mail.glx'''.</p>


smtpd_sender_restrictions =
  reject_sender_login_mismatch


* Nous allons renseigner dans le fichier '''sender_login''' les informations du compte '''alice''' comme ceci :
=== Restriction sur le nombre de destinataire ===


alice@mail.glx alice
* 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.


* Nous générons la base à l'aide de la commande '''postmap''' :
* 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 :


{{ Box Console | objet=sudo postmap sender_login }}
smtpd_recipient_limit = 2


* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
* On applique les paramètres :


{{ Box Console | objet=sudo service postfix restart }}
{{ Box Console | objet=service postfix restart }}


* Maintenant, voici le même test avec les restrictions d'activées :
* On essaye d'envoyer un mail à plus de deux destinataires :


{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
{{ Box Console | objet=telnet 10.0.0.44 25<br />
Trying 10.0.0.44...<br />
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">AUTH LOGIN YWxpY2U=</span><br />
mail from:<cacheln@mail.glx><br />
334 UGFzc3dvcmQ6<br />
<span style="font-family:sans-serif;color:blue">YWxpY2U=</span><br />
235 2.7.0 Authentication successful<br />
<span style="font-family:sans-serif;color:blue">mail from:<cache@fictif.tld></span><br />
250 2.1.0 Ok<br />
250 2.1.0 Ok<br />
<span style="font-family:sans-serif;color:blue">rcpt to:<nicolas@cachelou.fr></span><br />
rcpt to:<cacheln@ncad.fr><br />
<span style="font-family:sans-serif;color:red">553 5.7.1 <cache@fictif.tld>: Sender address rejected: not owned by user alice@mail.glx</span> }}
250 2.1.5 Ok<br />
rcpt to:<nicolas@cachelou.fr><br />
250 2.1.5 Ok<br />
rcpt to:<tech@ncad.fr><br />
<font color=red>452 4.5.3 Error: too many recipients</font> }}


=== Restrictions destinataire/recipient ===
=== Restrictions sur le client ===


{{ Box Information | objet=Les restrictions sur le destinataire s'effectuent grâce au paramètre <span style="color:grey">smtpd_recipient_restrictions</span> qui est à insérer dans le fichier de configuration <span style="color:grey">/etc/postfix/main.cf</span> juste après le paramètre <span style="color:grey">smtpd_sender_restrictions</span>. }}
La directive '''smtpd_client restrictions''' permet de définir des restrictions de connexion au service SMTP.


==== Syntaxe adresse émetteur ====
* 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


* '''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 :
{{ Box Remarque | objet=Il est également possible de renseigner un nom d'hôte à la place d'une adresse IP. }}
** 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 :
* Nous générons la base à l'aide de la commande '''postmap''' :


smtpd_recipient_restrictions =
{{ Box Console | objet=postmap /etc/postfix/bl_reverse }}
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,


Ces informations sont à insérer juste après la ligne du paramètre '''smtpd_sender_restrictions'''.
* Dans le fichier de configuration '''/etc/postfix/main.cf''' nous ajoutons les deux lignes suivantes :


* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
smtpd_client_restrictions =
  check_client_access hash:/etc/postfix/bl_reverse


{{ Box Console | objet=sudo service postfix restart }}
* Maintenant, connectons nous au serveur SMTP depuis la machine '''10.0.0.50''' et tentons d'envoyer un courrier :


<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Pour mieux comprendre...</div>
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">mail from:<root@mail.glx></span><br />
250 2.1.0 Ok<br />
<span style="font-family:sans-serif;color:blue">rcpt to:<alice@mail.glx></span><br />
<span style="font-family:sans-serif;color:red">450 4.7.1 <ncad.net.ncad.fr[10.0.0.50]>: Client host rejected: Access denied</span>}}


<div style="width:99%;padding:5px;">
* 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.


* 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.tld''' n'est pas un nom de domaine. Le serveur <span style="color:red">destinataire</span> qui est notre '''Postfix''' refusera le nom de l'émetteur à cause du premier filtre : '''reject_non_fqdn_sender'''.
* On répète maintenant l'opération depuis la machine '''10.0.0.51''' :


{{ Box Console | objet=telnet 10.0.0.49 25<br />
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
Trying 10.0.0.49...<br />
Trying 10.0.0.44...<br />
Connected to 10.0.0.49.<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
Escape character is '^]'.<br />
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)<br />
220 alice.lan ESMTP Postfix<br />
mail from:<inconnu@existe-pas><br />
<span style="font-family:sans-serif;color:blue">mail from:<root@mail.glx></span><br />
250 2.1.0 Ok<br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
<span style="font-family:sans-serif;color:blue">rcpt to:<alice@mail.glx></span><br />
250 2.1.5 Ok<br />
<span style="font-family:sans-serif;color:red">554 5.7.1 <oxtrode.net.ncad.fr[10.0.0.51]>: Client host rejected: Adresse IP blacklist  e</span>}}
data<br />
 
354 End data with <CR><LF>.<CR><LF><br />
* 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.
test<br />
 
.<br />
* Depuis les logs Postfix, on peut observer les différentes tentatives de connexion qui ont été rejetées :
<font color=green>250 2.0.0 Ok: queued as 1EAF620F9E</font> }}


* 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''' :
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">cat /var/log/mail.log &#124; grep "Client host rejected"</span><br />
Jan 24 14:38:48 alice postfix/smtpd[31423]: NOQUEUE: reject: RCPT from<br />
ncad.net.ncad.fr[10.0.0.50]: 450 4.7.1 <ncad.net.ncad.fr[10.0.0.50]>:<br />
Client host rejected: Access denied; from=<root@mail.glx> to=<alice@mail.glx><br />
proto=ESMTP


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
Jan 24 14:58:00 alice postfix/smtpd[31667]: NOQUEUE: reject: RCPT from<br />
<inconnu@existe-pas>: <font color=red>Sender address rejected: need fully-qualified address</font>; from=<inconnu@existe-pas> to=<alice@mail.glx>  
oxtrode.net.ncad.fr[10.0.0.51]: 554 5.7.1 <ncad.net.ncad.fr[10.0.0.51]>:<br />
proto=ESMTP helo=<geocoucou.net.ncad.fr>
Client host rejected: Adresse IP blacklist  e; from=<root@mail.glx> to=<alice@mail.glx> proto=ESMTP
}}


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'''.
=== Restrictions sur le hello/ehlo ===


* 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 n'existe pas. Le serveur destinataire qui est notre '''Postfix''' refusera le nom de l'émetteur à cause du second filtre : '''reject_unknown_sender_domain'''.
* 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.


{{ Box Console | objet=telnet 10.0.0.49 25<br />
smtpd_helo_required = yes
Trying 10.0.0.49...<br />
smtpd_helo_restrictions =
Connected to 10.0.0.49.<br />
  reject_unknown_helo_hostname
Escape character is '^]'.<br />
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)<br />
mail from:<inconnu@existe-pas.tld><br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
250 2.1.5 Ok<br />
data<br />
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
250 2.0.0 Ok: queued as 1F99B20F7F }}


* Le message est bien partit. Vérifions maintenant les logs du serveur destinataire depuis le fichier de log '''/var/log/mail.log''' :
* On applique les paramètres :


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
{{ Box Console | objet=service postfix restart }}
<inconnu@existe-pas.tld>: <font color=red>Sender address rejected: Domain not found</font>; 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'''.
* Maintenant on tente d'envoyer un mail sans commande '''ehlo''' au démarrage de la connexion :


</div></div>
{{ Box Console | objet=telnet 10.0.0.44 587<br />
 
Trying 10.0.0.44...<br />
==== Syntaxe adresse destinataire ====
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
mail from:<alice@mail.glx><br />
<span style="color:red">503 5.5.1 Error: send HELO/EHLO first</span> }}


* 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 :
* On essaye cette fois-ci en utilisant un nom de domaine fictif ''(filtre reject_unknown_helo_hostname)'':
** 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 :
{{ Box Console | objet=telnet 10.0.0.44 587<br />
 
Trying 10.0.0.44...<br />
smtpd_recipient_restrictions =
Connected to 10.0.0.44.<br />
  reject_non_fqdn_recipient,
Escape character is '^]'.<br />
  reject_unknown_recipient_domain,
220 alice.lan ESMTP Postfix<br />
 
ehlo quoi.tld<br />
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
250-alice.lan<br />
 
250-PIPELINING<br />
{{ Box Console | objet=sudo service postfix restart }}
250-SIZE 5120000<br />
250-VRFY<br />
250-ETRN<br />
250-STARTTLS<br />
250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN<br />
mail from:<root@mail.glx><br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
<span style="color:red">450 4.7.1 <quoi.tld>: Helo command rejected: Host not found</span> }}


==== Utilisation de blacklistes ====
=== Restriction émetteur/sender ===


* 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.
{{ Box Information | objet=Les restrictions sur le destinataire s'effectuent grâce au paramètre <span style="color:grey">smtpd_sender_restrictions</span> qui est à insérer dans le fichier de configuration <span style="color:grey">/etc/postfix/main.cf</span> juste après le paramètre <span style="color:grey">smtpd_helo_restrictions</span>. }}


* 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.
==== Contrôler l'adresse mail de l'émetteur ====


smtpd_recipient_restrictions =
{{ Box Attention | objet=Compatible uniquement avec les serveur smtp Postfix dont l'authentification est activée. }}
  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'''.
* Par défaut les utilisateur peuvent envoyer des messages en utilisant n'importe quel adresse mail. Voici un exemple :


* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
Trying 10.0.0.44...<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
220 alice.lan ESMTP Postfix<br />
<span style="font-family:sans-serif;color:blue">AUTH LOGIN YWxpY2U=</span><br />
334 UGFzc3dvcmQ6<br />
<span style="font-family:sans-serif;color:blue">YWxpY2U=</span><br />
235 2.7.0 Authentication successful<br />
<span style="font-family:sans-serif;color:blue">mail from:<cache@fictif.tld></span><br />
250 2.1.0 Ok<br />
<span style="font-family:sans-serif;color:blue">rcpt to:<nicolas@cachelou.fr></span><br />
250 2.1.5 Ok<br />
<span style="font-family:sans-serif;color:blue">data</span><br />
354 End data with <CR><LF>.<CR><LF><br />
<span style="font-family:sans-serif;color:blue">test</span><br />
<span style="font-family:sans-serif;color:blue">.</span><br />
<span style="font-family:sans-serif;color:green">250 2.0.0 Ok: queued as 7CBDD62846</span><br />
<span style="font-family:sans-serif;color:blue">quit</span><br />
221 2.0.0 Bye<br />
Connection closed by foreign host. }}


{{ Box Console | objet=sudo service postfix restart }}
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'''.


<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
* 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'''.
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Pour mieux comprendre...</div>
 
smtpd_sender_login_maps = hash:/etc/postfix/sender_login


<div style="width:99%;padding:5px;">
* 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''' :
* 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''' :


{{ Box Console | objet=nslookup 48.0.0.10.bl.ncad.fr<br />
smtpd_sender_restrictions =
Server:        10.0.0.46<br />
  permit_mynetworks
Address:        10.0.0.46#53<br /><br />
  reject_sender_login_mismatch


Name:   48.0.0.10.bl.ncad.fr<br />
* Nous allons renseigner dans le fichier '''sender_login''' les informations du compte '''alice''' comme ceci :
Address: <span style="color:red">127.0.0.2</span> }}


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'''.
alice@mail.glx alice


{{ Box Information | objet=48.0.0.10 est en faites l'écriture inversé de l'IP 10.0.0.48. }}
* Nous générons la base à l'aide de la commande '''postmap''' :


* On ajoute la blackliste au fichier de configuration '''/etc/postfix/main.cf''' :
{{ Box Console | objet=sudo postmap sender_login }}


smtpd_recipient_restrictions =
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
  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,
  <font style="color:red">reject_rbl_client bl.ncad.fr</font>
  permit
 
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :


{{ Box Console | objet=sudo service postfix restart }}
{{ Box Console | objet=sudo service postfix restart }}


* 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 :
* Maintenant, voici le même test avec les restrictions d'activées :


{{ Box Console | objet=telnet 10.0.0.48 25<br />
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">telnet 10.0.0.44 25</span><br />
Trying 127.0.0.1...<br />
Trying 10.0.0.44...<br />
Connected to 127.0.0.1.<br />
Connected to 10.0.0.44.<br />
Escape character is '^]'.<br />
Escape character is '^]'.<br />
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)<br />
220 alice.lan ESMTP Postfix<br />
ehlo ncad.fr<br />
<span style="font-family:sans-serif;color:blue">AUTH LOGIN YWxpY2U=</span><br />
250-geocoucou.net.ncad.fr<br />
334 UGFzc3dvcmQ6<br />
250-PIPELINING<br />
<span style="font-family:sans-serif;color:blue">YWxpY2U=</span><br />
250-SIZE 10240000<br />
235 2.7.0 Authentication successful<br />
250-VRFY<br />
<span style="font-family:sans-serif;color:blue">mail from:<cache@fictif.tld></span><br />
250-ETRN<br />
250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN<br />
mail from:<nicolas.cachelou@ncad.me><br />
250 2.1.0 Ok<br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
<span style="font-family:sans-serif;color:blue">rcpt to:<nicolas@cachelou.fr></span><br />
250 2.1.5 Ok<br />
<span style="font-family:sans-serif;color:red">553 5.7.1 <cache@fictif.tld>: Sender address rejected: not owned by user alice@mail.glx</span> }}
data<br />
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
<font style="color:green">250 2.0.0 Ok: queued as 30BC120FB8</font> }}


Feb  1 11:51:36 geocoucou postfix/smtpd[5826]: 30BC120FB8: client=localhost[127.0.0.1]
=== Restrictions destinataire/recipient ===
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.me>, 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, <font style="color:green">status=sent</font> (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é :
{{ Box Information | objet=Les restrictions sur le destinataire s'effectuent grâce au paramètre <span style="color:grey">smtpd_recipient_restrictions</span> qui est à insérer dans le fichier de configuration <span style="color:grey">/etc/postfix/main.cf</span> juste après le paramètre <span style="color:grey">smtpd_sender_restrictions</span>. }}


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
==== Syntaxe adresse émetteur ====
Service unavailable; <font style="color:red">Client host [10.0.0.48] blocked using bl.ncad.fr</font>; from=<nicolas.cachelou@ncad.me>
to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr>


{{ Box Information | objet=L'émetteur recevra un mail d'échec de remise de la part de Mail Delivery System
* '''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 :
This is the mail system at host geocoucou.net.ncad.fr.
** un nom de domaine pleinement qualifié du type '''mon-domaine.tld''';
** un nom de domaine pleinement qualifié et mais qui en plus '''existe'''.
I'm sorry to have to inform you that your message could not
 
be delivered to one or more recipients. It's attached below.
* Voici la syntaxe respective de ces filtres pour Postfix :
 
For further assistance, please send mail to postmaster.
  smtpd_recipient_restrictions =
  reject_non_fqdn_sender,
If you do so, please include this problem report. You can
  reject_unknown_sender_domain,
delete your own text from the attached returned message.
 
Ces informations sont à insérer juste après la ligne du paramètre '''smtpd_sender_restrictions'''.
                  The mail system
 
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
<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.me
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
}}


{{ Box Console | objet=sudo service postfix restart }}


</div></div>
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Pour mieux comprendre...</div>


=== Ecoute sur le port 587 ===
<div style="width:99%;padding:5px;">


* 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/main.cf''' ''(juste en dessous de la 1er ligne '''smtp inet - - - - smtpd''' ...)'' :
* 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 <span style="color:red">destinataire</span> qui est notre '''Postfix''' refusera le nom de l'émetteur à cause du premier filtre : '''reject_non_fqdn_sender'''.


587    inet    n      -       y      -       -      smtpd
{{ Box Console | objet=telnet 10.0.0.49 25<br />
Trying 10.0.0.49...<br />
Connected to 10.0.0.49.<br />
Escape character is '^]'.<br />
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)<br />
mail from:<inconnu@existe-pas><br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
250 2.1.5 Ok<br />
data<br />
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
<font color=green>250 2.0.0 Ok: queued as 1EAF620F9E</font> }}


* Il faut redémarrer le service '''Postfix''' pour que les modifications soient prises en compte :
* 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''' :


{{ Box Console | objet=sudo service postfix restart}}
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>: <font color=red>Sender address rejected: need fully-qualified address</font>; from=<inconnu@existe-pas> to=<alice@mail.glx>
proto=ESMTP helo=<geocoucou.net.ncad.fr>


== Personnalisation des messages d'échec de remise ==
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'''.


* 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.
* 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'''.


=== Undelivered Mail Returned to Sender ===
{{ Box Console | objet=telnet 10.0.0.49 25<br />
 
Trying 10.0.0.49...<br />
* Par défaut le message renvoyé à l'émetteur est le suivant :
Connected to 10.0.0.49.<br />
 
Escape character is '^]'.<br />
This is the mail system at host $myhostname.
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)<br />
mail from:<inconnu@existe-pas.tld><br />
I'm sorry to have to inform you that your message could not
250 2.1.0 Ok<br />
be delivered to one or more recipients. It's attached below.
rcpt to:<alice@mail.glx><br />
250 2.1.5 Ok<br />
For further assistance, please send mail to postmaster.
data<br />
354 End data with <CR><LF>.<CR><LF><br />
If you do so, please include this problem report. You can
test<br />
delete your own text from the attached returned message.
.<br />
250 2.0.0 Ok: queued as 1F99B20F7F }}
                    The mail system
EOF


* Pour indiquer un autre message, il va falloir le composer en respectant la syntaxe suivante :
* Le message est bien partit. Vérifions maintenant les logs du serveur destinataire depuis le fichier de log '''/var/log/mail.log''' :


  failure_template = <<EOF
  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
  Charset: us-ascii
  <inconnu@existe-pas.tld>: <font color=red>Sender address rejected: Domain not found</font>; from=<inconnu@existe-pas.tld> to=<alice@mail.glx>  
  From: <adresse_emetteur> (<nom_emetteur>)
  proto=ESMTP helo=<geocoucou.net.ncad.fr>
  Subject: <objet_message>
 
Postmaster-Subject: Postmaster Copy: Undelivered Mail
Le message a bien été refusé à cause de la non résolution du nom de '''domaine existe-pas.tld'''.
<contenu du message>
 
EOF
</div></div>
 
==== Syntaxe adresse destinataire ====


* Voici un exemple :
* 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'''.


failure_template = <<EOF
* Voici la syntaxe de ces filtres pour Postfix :
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'''.
smtpd_recipient_restrictions =
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,


* Maintenant, il faut indiquer à '''Postfix''' l'emplacement du message que l'on souhaite envoyer. Dans le fichier '''/etc/postfix/main.cf''' on indiquera :
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :


bounce_template_file = /etc/postfix/bounce_msg
{{ Box Console | objet=sudo service postfix restart }}


== Annexes ==
==== Utilisation de blacklistes ====


=== Fichier /etc/postfix/main.cf ===
* 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.


  smtpd_banner = $myhostname ESMTP $mail_name
* 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.
biff = no
 
  smtpd_recipient_restrictions =
append_dot_mydomain = no
  reject_rbl_client list.dsbl.org,
  reject_rbl_client sbl.spamhaus.org,
readme_directory = no
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client dul.dnsbl.sorbs.net,
smtpd_tls_cert_file=/etc/postfix/ssl/smtpd.cert
  permit
smtpd_tls_key_file=/etc/postfix/ssl/smtpd.key
 
  smtpd_use_tls=no
Ces informations sont à insérer juste après la ligne du paramètre '''smtpd_sender_restriction'''.
smtpd_tls_received_header = yes
 
smtpd_tls_loglevel = 1
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
smtpd_tls_ask_ccert = yes
 
{{ Box Console | objet=sudo service postfix restart }}
smtpd_tls_security_level = may
 
#smtpd_tls_security_level = encrypt
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
smtp_tls_loglevel = 1
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Pour mieux comprendre...</div>
smtp_tls_cert_file=/etc/postfix/ssl/smtpd.cert
 
smtp_tls_key_file=/etc/postfix/ssl/smtpd.key
<div style="width:99%;padding:5px;">
* 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''' :
myhostname = alice.lan
 
alias_maps = hash:/etc/aliases
{{ Box Console | objet=nslookup 48.0.0.10.bl.ncad.fr<br />
  alias_database = hash:/etc/aliases
Server:        10.0.0.46<br />
  mydomain = mail.glx
Address:        10.0.0.46#53<br /><br />
  myorigin = $mydomain
 
  mydestination = localhost mail.glx
Name:  48.0.0.10.bl.ncad.fr<br />
  relayhost =
Address: <span style="color:red">127.0.0.2</span> }}
  mynetworks = 127.0.0.1/32
 
  home_mailbox = Maildir/
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'''.
  mailbox_command = procmail -a "$EXTENSION"
 
  recipient_delimiter = +
{{ Box Information | objet=48.0.0.10 est en faites l'écriture inversé de l'IP 10.0.0.48. }}
inet_interfaces = all
 
message_size_limit = 5120000
* On ajoute la blackliste au fichier de configuration '''/etc/postfix/main.cf''' :
mailbox_size_limit = 10240000
 
   
  smtpd_recipient_restrictions =
bounce_template_file = /etc/postfix/bounce_msg
  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,
  <font style="color:red">reject_rbl_client bl.ncad.fr</font>
  permit
 
* Nous redémarrons '''Postfix''' pour appliquer les paramètres :
 
{{ Box Console | objet=sudo service postfix restart }}
 
* 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 :
 
{{ Box Console | objet=telnet 10.0.0.48 25<br />
Trying 127.0.0.1...<br />
Connected to 127.0.0.1.<br />
Escape character is '^]'.<br />
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)<br />
ehlo ncad.fr<br />
250-geocoucou.net.ncad.fr<br />
250-PIPELINING<br />
250-SIZE 10240000<br />
250-VRFY<br />
250-ETRN<br />
250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250 DSN<br />
mail from:<nicolas.cachelou@ncad.local><br />
250 2.1.0 Ok<br />
rcpt to:<alice@mail.glx><br />
250 2.1.5 Ok<br />
data<br />
354 End data with <CR><LF>.<CR><LF><br />
test<br />
.<br />
<font style="color:green">250 2.0.0 Ok: queued as 30BC120FB8</font> }}
 
  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, <font style="color:green">status=sent</font> (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; <font style="color:red">Client host [10.0.0.48] blocked using bl.ncad.fr</font>; from=<nicolas.cachelou@ncad.local>
  to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr>
 
{{ Box Information | objet=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.
   
   
  broken_sasl_auth_clients = yes
I'm sorry to have to inform you that your message could not
  smtpd_sasl_auth_enable = yes
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
}}
 
 
</div></div>
 
=== 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 :
 
{{ Box Console | objet=sudo service postfix restart}}
 
== 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'''.
 
{{ Box Remarque | objet=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'''.
 
{{ Box Console | objet=postmap /etc/postfix/transport }}
 
* Nous redémarrons le serveur de messagerie pour prendre en compte les nouveaux paramètres.
 
{{ Box Console | objet=service postfix restart }}
 
== 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 :
 
{{ Box Console | objet=newaliases }}
 
* 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: <font color=green>to=<alice@mail.glx></font>,
  <font color=red>orig_to=<lapin-blanc@mail.glx></font>, 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>)''.
 
{{ Box Remarque | objet=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'''.
 
{{ Box Console | objet=postmap /etc/postfix/sender_canonical }}
 
* 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.
 
{{ Box Console | objet=service postfix restart}}
 
=== 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
 
{{ Box Remarque | objet=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'''.
 
{{ Box Console | objet=postmap /etc/postfix/recipient_canonical }}
 
* 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.
 
{{ Box Console | objet=service postfix restart}}
 
== 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''' :
 
{{ Box Console | objet=sudo apt-get install vacation }}
 
* Création de l'utilisateur '''vacation''' :
 
{{ Box Console | objet=sudo useradd -m vacation -s /bin/nologin -c "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.
 
{{ Box Remarque | objet=La variable <font color=grey>$SUBJECT</font> 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.
 
{{ Box Console | objet=vacation -I }}
 
 
{{ Box Remarque | objet=Un fichier <font color=grey>.vacation.db</font> 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''' :
 
{{ Box Console | objet=sudo postfix restart }}
 
=== 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''' :
 
{{ Box Console | objet=postmap block_recipient}}
 
* 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]: <font color=orange>450 4.7.1</font>
  <nicolas.cachelou@ncad.local>: <font color=orange>Sender address rejected: Access denied</font>; 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]
 
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Pour aller plus loin...</div>
 
<div style="width:99%;padding:5px;">
 
* 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 :
 
{{ Box Console | objet=mailq<br />
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------<br />
89A7A210DA    1375 Fri Feb 14 19:32:47  nicolas.cachelou@ncad.local<br />
(host serveur.mail.glx[10.0.0.44] <font color=orange>said: 450 4.7.1</font> <nicolas.cachelou@ncad.local>: <font color=orange>Sender address rejected: Access denied</font> (in<br />
reply to RCPT TO command))<br />
_                                        alice@mail.glx<br /><br />
 
8027C21140    1375 Fri Feb 14 19:36:11  nicolas.cachelou@ncad.local<br />
(host serveur.mail.glx[10.0.0.44] <font color=orange>said: 450 4.7.1</font> <nicolas.cachelou@ncad.local>: <font color=orange>Sender address rejected: Access denied</font> (in<br />
reply to RCPT TO command))<br />
_                                        alice@mail.glx<br /><br />
 
230FB211BC    1375 Fri Feb 14 19:37:49  nicolas.cachelou@ncad.local<br />
(host serveur.mail.glx[10.0.0.44] <font color=orange>said: 450 4.7.1</font> <nicolas.cachelou@ncad.local>: <font color=orange>Sender address rejected: Access denied</font> (in<br />
reply to RCPT TO command))<br />
_                                        alice@mail.glx<br /><br />
 
B1E7D210E3    1375 Fri Feb 14 19:33:39  nicolas.cachelou@ncad.local<br />
(host serveur.mail.glx[10.0.0.44] <font color=orange>said: 450 4.7.1</font> <nicolas.cachelou@ncad.local>: <font color=orange>Sender address rejected: Access denied</font> (in<br />
reply to RCPT TO command))<br />
_                                        alice@mail.glx<br /><br />
 
-- 6 Kbytes in 4 Requests. }}
 
* On peut également demander au serveur une vue synthétique des données sous forme de tableau :
 
{{ Box Console | objet=qshape deferred <pipe> head<br />
                                        T  5 10 20 40 80 160 320 640 1280 1280+<br />
                                  TOTAL  4  0  0  4  0  0  0  0  0    0    0<br />
                              mail.glx  4  0  0  4  0  0  0  0  0    0    0 }}
 
* 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'''.
 
</div></div>
 
=== 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''' :
 
{{ Box Console | objet=postmap block_recipient}}
 
* 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]: <font color=red>554 5.7.1</font>
  <nicolas.cachelou@ncad.local>: <font color=red>Sender address rejected: Access denied</font>; 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.
 
{{ Box Legislation | objet=Sur un serveur en production, ce type d'activité est assimilé à de l’interception de mail. Dans le cadre d'une entreprise, l'employeur est en droit de consulter les mails professionnels de ses salariés sauf si dans l'objet il est clairement indiqué qu'il est à caractère personnel. }}
 
=== 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 :
 
<span style="background-color:darkblue;color:#FFFFFF">1.1</span> Feb  9 14:13:00 alice postfix/smtpd[3371]: connect from geocoucou.net.ncad.fr[10.0.0.49]
<span style="background-color:darkblue;color:#FFFFFF">1.2</span> Feb  9 14:13:00 alice postfix/smtpd[3371]: 520C34620FD: client=geocoucou.net.ncad.fr[10.0.0.49]
<span style="background-color:darkblue;color:#FFFFFF">1.3</span> Feb  9 14:13:00 alice postfix/cleanup[3376]: 520C34620FD: message-id=<b2eeb2fd98861e974eb38d29e84dc962@ncad.local>
<span style="background-color:darkblue;color:#FFFFFF">1.4</span> Feb  9 14:13:00 alice postfix/qmgr[3356]: 520C34620FD: from=<nicolas.cachelou@ncad.local>, size=1568, nrcpt=2
  (queue active)
<span style="background-color:darkblue;color:#FFFFFF">1.5</span> Feb  9 14:13:00 alice postfix/smtpd[3371]: disconnect from geocoucou.net.ncad.fr[10.0.0.49]
<span style="background-color:darkblue;color:#FFFFFF">1.6</span> 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)
<span style="background-color:darkred;color:#FFFFFF">2.1</span> 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)
<span style="background-color:darkred;color:#FFFFFF">2.2</span> 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 : <font color=red>la destruction du message dans la file</font>. 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''' :
 
[[Image:POSTFIX_Reception_UNIX.png|thumb|750px|center|Réception d'un mail]]
 
* Maintenant, voici les logs relevés dans '''/var/log/mail.log''' :
 
Feb  8 18:09:31 alice postfix/<font color=red>smtpd</font>[16827]: connect from geocoucou.net.ncad.fr[10.0.0.49]
Feb  8 18:09:31 alice postfix/<font color=red>smtpd</font>[16827]: <font color=purple>8ACDF46168D</font>:
  client=geocoucou.net.ncad.fr[10.0.0.49]
Feb  8 18:09:31 alice postfix/<font color=red>cleanup</font>[16838]: <font color=purple>8ACDF46168D</font>:
  message-id=<b2b5fd040529d851392e5d3efca7db6b@ncad.local>
Feb  8 18:09:31 alice postfix/<font color=red>qmgr</font>[15863]: <font color=purple>8ACDF46168D</font>: from=<nicolas.cachelou@ncad.local>,
  size=1562, nrcpt=1 (queue active)
Feb  8 18:09:31 alice postfix/<font color=red>local</font>[16839]: <font color=purple>8ACDF46168D</font>: to=<alice@mail.glx>, <font color=red>relay=local</font>,
  delay=0.11, delays=0.04/0.01/0/0.07, dsn=2.0.0, status=sent <font color=red>(delivered to command: procmail</font>
  -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''' :
 
[[Image:POSTFIX_Envoi_Externe.png|thumb|750px|center|Envoi d'un mail]]
 
* Maintenant, voici les logs relevés dans '''/var/log/mail.log''' :
 
Feb  8 20:19:22 alice postfix/<font color=red>smtpd</font>[25345]: <font color=purple>4C21246179C</font>: client=unknown[10.0.0.50]
Feb  8 20:19:22 alice postfix/<font color=red>cleanup</font>[25350]: <font color=purple>4C21246179C</font>:
  message-id=<52F68338.4000009@mail.glx>
Feb  8 20:19:22 alice postfix/<font color=red>qmgr</font>[25337]: <font color=purple>4C21246179C</font>: from=<cacheln@mail.glx>,
  size=517, nrcpt=1 (queue active)
Feb  8 20:19:24 alice postfix/<font color=red>smtp</font>[25351]: <font color=purple>4C21246179C</font>: 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_local_domain = $mydomain
  smtpd_sasl_security_options = noanonymous
  smtpd_sasl_security_options = noanonymous
  broken_sasl_auth_clients = yes
  broken_sasl_auth_clients = yes
  smtpd_sasl_type = cyrus
  smtpd_sasl_type = cyrus
  cyrus_sasl_config_path = /etc/postfix/sasl
  cyrus_sasl_config_path = /etc/postfix/sasl
   
   
  smtpd_helo_required = yes
  smtpd_helo_required = yes
  smtpd_helo_restrictions =
  smtpd_helo_restrictions =
   reject_unknown_helo_hostname
   reject_unknown_helo_hostname
   
   
  smtpd_sender_login_maps = hash:/etc/postfix/sender_login.cf
  smtpd_sender_login_maps = hash:/etc/postfix/sender_login.cf
  smtpd_sender_restrictions =
  smtpd_sender_restrictions =
   reject_sender_login_mismatch
  permit_mynetworks,
   
   reject_sender_login_mismatch
  smtpd_recipient_restrictions =
   
   permit_mynetworks,
  smtpd_recipient_restrictions =
   permit_sasl_authenticated,
   permit_mynetworks,
   reject_unauth_destination,
   permit_sasl_authenticated,
   reject_non_fqdn_hostname,
   reject_unauth_destination,
   reject_unknown_hostname,
   reject_non_fqdn_hostname,
   reject_non_fqdn_sender,
   reject_unknown_hostname,
   reject_unknown_sender_domain,
   reject_non_fqdn_sender,
   reject_rbl_client list.dsbl.org,
   reject_unknown_sender_domain,
   reject_rbl_client sbl.spamhaus.org,
   reject_rbl_client list.dsbl.org,
   reject_rbl_client cbl.abuseat.org,
   reject_rbl_client sbl.spamhaus.org,
   reject_rbl_client dul.dnsbl.sorbs.net
   reject_rbl_client cbl.abuseat.org,
   reject_rbl_client dul.dnsbl.sorbs.net
 
== Liens ==


== 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/'''


* http://ferry.eof.eu.org/lesjournaux/jar/public_html/x4295.html
[[Category:Serveur de Messagerie]]
* https://help.ubuntu.com/community/Courier
* https://wiki.debian.org/PostfixAndSASL
* http://doc.ubuntu-fr.org/postfix_mysql_tls_sasl
* http://www.bortzmeyer.org/postfix-tls.html

Dernière version du 6 juillet 2024 à 12:23

.:[ Serveur de Messagerie ]:.

Installation >> Postfix avec MySQL

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 | DKIM Proxy | OpenDKIM | Mailman | Maildrop | DANE | SPF


Clients de messagerie : Configurer Thundirbird | Configurer Roundcube


Pour aller plus loin : Commandes messagerie | DNSBL | MX Backup
POSTFIX Logo.png

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.
Vue schématique de l'installation
  • 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.
Architecture de Postfix

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;

apt-get install postfix courier-pop courier-imap procmail

  • 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.
Prise en charge des quotas
  • 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/ :

apt-get build-dep postfix
cd /usr/src
apt-get source postfix

  • Avant de télécharger le patch, il est nécessaire de vérifier la version de Postfix :

postconf mail_version
mail_version = 2.9.6

  • 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 :

wget http://vda.sourceforge.net/VDA/postfix-vda-v11-2.9.6.patch

  • 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 :

cd /usr/src/postfix-2.9.6/
patch -p1 < ../postfix-vda-v11-2.9.6.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 :

cd /usr/src/postfix-2.9.6/
dpkg-buildpackage

  • 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 :

ls -l postfix_2.9.6-1~12.04.1_i386.deb
postfix-cdb_2.9.6-1~12.04.1_i386.deb
postfix-dev_2.9.6-1~12.04.1_all.deb
postfix-doc_2.9.6-1~12.04.1_all.deb
postfix-ldap_2.9.6-1~12.04.1_i386.deb
postfix-mysql_2.9.6-1~12.04.1_i386.deb
postfix-pcre_2.9.6-1~12.04.1_i386.deb
postfix-pgsql_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 :

dpkg -i postfix_2.9.6-1~12.04.1_i386.deb postfix-mysql_2.9.6-1~12.04.1_i386.deb

Configuration de base

Configuration de base pour un usage local uniquement.
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 :

cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
rm /etc/postfix/main.cf

  • 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 :

cd /home/alice
maildirmake Maildir
maildirmake -f Sent Maildir
maildirmake -f Queue Maildir
maildirmake -f junkmail Maildir
maildirmake -f virus Maildir
maildirmake -f Drafts Maildir
maildirmake -f Trash Maildir
chown alice:alice Maildir -R
chmod 700 Maildir -R

  • Pour que cette opération s'effectue automatiquement à chaque ajout d'un nouvel utilisateur UNIX :

sudo maildirmake /etc/skel/Maildir
sudo maildirmake /etc/skel/Maildir/.Drafts
sudo maildirmake /etc/skel/Maildir/.Sent
sudo maildirmake /etc/skel/Maildir/.Trash
sudo maildirmake /etc/skel/Maildir/.Templates



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 :

sudo service postfix restart

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 :

telnet 127.0.0.1 25

  • 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.

telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 alice.lan ESMTP Postfix

  • Pour valider son fonctionnement, nous allons envoyer un mail. Commençons d'abord par indiquer notre adresse mail émetteur :

mail from:<root@mail.glx>
250 2.1.0 OK

  • Le serveur acquittant avec le code 250, nous pouvons maintenant indiquer l'adresse de l'expéditeur :

rcpt to:<alice@mail.glx>
250 2.1.5 OK

  • 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 :

data

  • Le serveur répondra par :

354 End data with <CR><LF>.<CR><LF>

  • 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.

test d'envoi / réception
Merci ;)

  • 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 :

250 2.0.0 Ok: queued as C01187F9FA

  • On ferme la connexion avec la commande quit :

quit
221 2.0.0 Bye
Connection closed by foreign host.

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 :

telnet 10.0.0.44 110
Trying 10.0.0.44... Connected to 10.0.0.44. Escape character is '^]'. +OK Hello there.

  • On indique le nom d'utilisateur UNIX du compte avec la commande user :

user alice
+OK Password required

  • Le serveur demande le mot de passe du compte, on lui indique via la commande pass :

pass alice
+OK logged in.

  • Le serveur accepte la connexion. On consulte la liste des messages avec la commande list :

list
+OK POP3
1 280
.

  • On affiche les 20 premières lignes du message 1 avec la commande top :

top 1 20
+OK headers follow.
Return-Path: <root@mail.glx>
X-Original-To: alice@mail.glx
Delivered-To: alice@mail.glx
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])
__by alice.lan (Postfix) with SMTP id A3242628A2
__for <alice@mail.glx>; Thu, 30 Jan 2014 01:20:57 +0100 (CET)

test
.

Test du serveur IMAP

  • On se connecte au serveur sur le port imap 143 :

telnet 10.0.0.44 143
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
¤ OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information.

  • Le serveur attend un login est un mot de passe. Pour cela, on utilise la commande LOGIN <user> <password> :

01 LOGIN alice alice
1 OK LOGIN Ok.

  • On demande la liste des répertoires grâce à la commande LIST "" "*" :

2 LIST "" "*"
¤ LIST (\HasNoChildren) "." "INBOX.Queue"
¤ LIST (\HasNoChildren) "." "INBOX.Drafts"
¤ LIST (\HasNoChildren) "." "INBOX.Trash"
¤ LIST (\HasNoChildren) "." "INBOX.junkmail"
¤ LIST (\HasNoChildren) "." "INBOX.Sent"
¤ LIST (\Marked \HasChildren) "." "INBOX"
¤ LIST (\HasNoChildren) "." "INBOX.virus"
2 OK LIST completed

  • On accède au dossier des messages reçus dans INBOX avec la commande SELECT <nom_dossier> :

3 SELECT INBOX
¤ FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
¤ OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited
¤ 4 EXISTS
¤ 4 RECENT
¤ OK [UIDVALIDITY 1391044096] Ok
¤ OK [MYRIGHTS "acdilrsw"] ACL
3 OK [READ-WRITE] Ok

  • On liste les messages reçus dans le dossier INBOX avec la commande SELECT <nom_dossier> :

4 UID FETCH 1:* RFC822.SIZE
¤ 1 FETCH (UID 1 RFC822.SIZE 280)
4 OK FETCH completed.

  • On consulte le message avec l'UID 1 en saisisant la commande UID FETCH <UID_message> BODY[] :

5 UID FETCH 4 BODY[]
¤ 4 FETCH (UID 1 BODY[] {310}
Return-Path: <root@mail.glx>
X-Original-To: alice@mail.glx
Delivered-To: alice@mail.glx
Received: from pfalk.net.ncad.fr (pfalk.net.ncad.fr [10.0.0.48])
___by alice.lan (Postfix) with SMTP id 511AB628A2
___for <alice@mail.glx>; Thu, 30 Jan 2014 01:56:23 +0100 (CET)

test d'envoi / réception
Merci ;)
)
¤ 4 FETCH (FLAGS (\Seen \Recent))
5 OK FETCH completed.

  • On ferme la connexion avec la commande LOGOUT :

6 logout
¤ BYE Courier-IMAP server shutting down
6 OK LOGOUT completed
Connection closed by foreign host.

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 :

/usr/bin/mailq

Authentification SMTP Postfix

SMTP en Open Relay

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.

Cette section va justement permettre d'initier une phase d'authentification pour toute tentative d'envoi de messages via Postfix. Ceci permettra d'éviter que le serveur soit utiliser à tort par des personnes mal intentionnées pour diffuser du spam.

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).

sudo apt-get install sasl2-bin

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 :

mkdir -p /var/spool/postfix/var/run/saslauthd
chown -R root:sasl /var/spool/postfix/var/run/saslauthd
chmod 710 /var/spool/postfix/var/run/saslauthd

  • On ajoute l'utilisateur Postfix au groupe sasl :

adduser postfix 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 :

service saslauthd start

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 :

service postfix restart

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é :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo alice.lan
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

  • Résultat de la commande ehlo avec le module sasl d'activé :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo ncad.fr
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN

250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Envoi sans authentification

  • Tentative d'envoi sans authentification :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<root@mail.glx>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
554 5.7.1 <nicolas@cachelou.fr>: Relay access denied
221 2.7.0 Error: I can break rules, too. Goodbye.
Connection closed by foreign host.

  • 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 :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
auth login YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<root@mail.glx>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 8EDAD62881


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

Avertissement

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.

Trame d'échanges SMTP entre Thundirbird et Postfix

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 :

mkdir -p /etc/postfix/ssl
cd /etc/postfix/ssl
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Generating a 2048 bit RSA private key
.................................................................................+++
..........................................................................+++
writing new private key to 'imap.key'
- - - - -
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
- - - - -
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Network
Organizational Unit Name (eg, section) []:Intranet Goulouxiou
Common Name (e.g. server FQDN or YOUR name) []:10.0.0.44
Email Address []:tech@ncad.fr



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

service postfix restart

Forcer TLS pour les envois

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.

postmap /etc/postfix/tls_policy_map
service postfix reload

  • 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 :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo ncad.fr
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

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):
Trame d'échanges SMTP entre Thundirbird et Postfix chiffrée

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 :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo ncad.fr
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

  • 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 :

sudo service postfix restart

  • Puis on se connecter de nouveau au serveur :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo ncad.fr
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

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: :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<alice@mail.glx>
530 5.7.0 Must issue a STARTTLS command first

Sécuriser les échanges IMAP

Avertissement

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.

Trame d'échanges Imap entre Thundirbird et Postfix

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 :

sudo apt-get install 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 :

cd /etc/courier/
openssl req -new -outform PEM -out imapd.cert -newkey rsa:2048 -nodes -keyout imapd.key -keyform PEM -days 365 -x509
Generating a 2048 bit RSA private key
.................................................................................+++
..........................................................................+++
writing new private key to 'imap.key'
- - - - -
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
- - - - -
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Network
Organizational Unit Name (eg, section) []:Intranet Goulouxiou
Common Name (e.g. server FQDN or YOUR name) []:10.0.0.44
Email Address []:tech@ncad.fr

  • Création du fichier imapd.pem. Ce fichier est une fusion de imapd.cert et imapd.key :

cd /etc/courier
touch imapd.pem
cat imapd.cert > imapd.pem
cat imapd.key >> imapd.pem


  • 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 :

service courier-imap-ssl restart

Vérification

  • Se connecter au serveur Postfix depuis le port smtp 993 :

telnet 10.0.0.44 993
Trying 10.0.0.44... Connected to 10.0.0.44. Escape character is '^]'.

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é :
Trame d'échanges IMAP entre Thundirbird et Courier-Imap-SSL chiffrée

Sécuriser les échanges POP

Avertissement

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.

Trame d'échanges POP entre Thundirbird et Postfix

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 :

sudo apt-get install 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 :

cd /etc/courier/
openssl req -new -outform PEM -out popd.cert -newkey rsa:2048 -nodes -keyout popd.key -keyform PEM -days 365 -x509
Generating a 2048 bit RSA private key
.................................................................................+++
..........................................................................+++
writing new private key to 'popd.key'
- - - - -
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
- - - - -
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Network
Organizational Unit Name (eg, section) []:Intranet Goulouxiou
Common Name (e.g. server FQDN or YOUR name) []:10.0.0.44
Email Address []:tech@ncad.fr

  • Création du fichier .pem. Ce fichier est une fusion de popd.cert et popd.key :

cd /etc/courier
cat popd.cert > popd.pem
cat popd.key >> popd.pem


  • 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 :

service courier-pop-ssl restart

Vérification

  • Se connecter au serveur Postfix depuis le port smtp 995 :

telnet 10.0.0.44 995
Trying 10.0.0.44... Connected to 10.0.0.44. Escape character is '^]'.

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é :
Trame d'échanges POP entre Thundirbird et Courier-pop-SSL chiffrée

Restrictions SMTP

Familles de restrictions

Ordre d'écriture

  • Pour rappel, voici un exemple d'envoi de mail :

telnet 10.0.0.44 587
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix (smtpd_client_restrictions)
ehlo ncad.fr (smtpd_helo_restrictions)
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<alice@mail.glx> (smtpd_sender_restrictions)
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr> (smtpd_recipient_restrictions)
250 2.1.5 Ok
data (smtpd_data_restrictions)
354 End data with <CR><LF>.<CR><LF>
test
. (smtpd_end_of_data_restrictions)
250 2.0.0 Ok: queued as EA0F262846
quit
221 2.0.0 Bye
Connection closed by foreign host.

  • 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 :
POSTFIX Send.png

Le sender est alice@mail.glx et le receiver est autre@ncad.fr.

  • Réception d'un courriel depuis le serveur Postfix :
POSTFIX Receive.png

Le sender est autre@ncad.fr et le receiver est alice@mail.glx.

  • Envoi d'un courrier vers une autre boîte locale :
POSTFIX Local.png

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 :

service postfix restart

  • On essaye d'envoyer un mail à plus de deux destinataires :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<cacheln@mail.glx>
250 2.1.0 Ok
rcpt to:<cacheln@ncad.fr>
250 2.1.5 Ok
rcpt to:<nicolas@cachelou.fr>
250 2.1.5 Ok
rcpt to:<tech@ncad.fr>
452 4.5.3 Error: too many recipients

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 :

postmap /etc/postfix/bl_reverse

  • 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 :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<root@mail.glx>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
450 4.7.1 <ncad.net.ncad.fr[10.0.0.50]>: Client host rejected: Access denied

  • 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 :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<root@mail.glx>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
554 5.7.1 <oxtrode.net.ncad.fr[10.0.0.51]>: Client host rejected: Adresse IP blacklist e

  • 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 :

cat /var/log/mail.log | grep "Client host rejected"
Jan 24 14:38:48 alice postfix/smtpd[31423]: NOQUEUE: reject: RCPT from
ncad.net.ncad.fr[10.0.0.50]: 450 4.7.1 <ncad.net.ncad.fr[10.0.0.50]>:
Client host rejected: Access denied; from=<root@mail.glx> to=<alice@mail.glx>
proto=ESMTP

Jan 24 14:58:00 alice postfix/smtpd[31667]: NOQUEUE: reject: RCPT from
oxtrode.net.ncad.fr[10.0.0.51]: 554 5.7.1 <ncad.net.ncad.fr[10.0.0.51]>:
Client host rejected: Adresse IP blacklist e; from=<root@mail.glx> to=<alice@mail.glx> proto=ESMTP

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 :

service postfix restart

  • Maintenant on tente d'envoyer un mail sans commande ehlo au démarrage de la connexion :

telnet 10.0.0.44 587
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
mail from:<alice@mail.glx>
503 5.5.1 Error: send HELO/EHLO first

  • On essaye cette fois-ci en utilisant un nom de domaine fictif (filtre reject_unknown_helo_hostname):

telnet 10.0.0.44 587
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
ehlo quoi.tld
250-alice.lan
250-PIPELINING
250-SIZE 5120000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:<root@mail.glx>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
450 4.7.1 <quoi.tld>: Helo command rejected: Host not found

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 :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
AUTH LOGIN YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<cache@fictif.tld>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 7CBDD62846
quit
221 2.0.0 Bye
Connection closed by foreign host.

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 :

sudo postmap sender_login

  • Nous redémarrons Postfix pour appliquer les paramètres :

sudo service postfix restart

  • Maintenant, voici le même test avec les restrictions d'activées :

telnet 10.0.0.44 25
Trying 10.0.0.44...
Connected to 10.0.0.44.
Escape character is '^]'.
220 alice.lan ESMTP Postfix
AUTH LOGIN YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<cache@fictif.tld>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
553 5.7.1 <cache@fictif.tld>: Sender address rejected: not owned by user alice@mail.glx

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 :

sudo service postfix restart

Pour mieux comprendre...
  • 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.

telnet 10.0.0.49 25
Trying 10.0.0.49...
Connected to 10.0.0.49.
Escape character is '^]'.
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)
mail from:<inconnu@existe-pas>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 1EAF620F9E

  • 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.

telnet 10.0.0.49 25
Trying 10.0.0.49...
Connected to 10.0.0.49.
Escape character is '^]'.
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)
mail from:<inconnu@existe-pas.tld>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 1F99B20F7F

  • 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 :

sudo service postfix restart

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 :

sudo service postfix restart

Pour mieux comprendre...
  • 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 :

nslookup 48.0.0.10.bl.ncad.fr
Server: 10.0.0.46
Address: 10.0.0.46#53

Name: 48.0.0.10.bl.ncad.fr
Address: 127.0.0.2

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 :

sudo service postfix restart

  • 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 :

telnet 10.0.0.48 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)
ehlo ncad.fr
250-geocoucou.net.ncad.fr
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:<nicolas.cachelou@ncad.local>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 30BC120FB8

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 :

sudo service postfix restart

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.

postmap /etc/postfix/transport

  • Nous redémarrons le serveur de messagerie pour prendre en compte les nouveaux paramètres.

service postfix restart

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 :

newaliases

  • 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.

postmap /etc/postfix/sender_canonical

  • 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.

service postfix restart

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.

postmap /etc/postfix/recipient_canonical

  • 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.

service postfix restart

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 :

sudo apt-get install vacation

  • Création de l'utilisateur vacation :

sudo useradd -m vacation -s /bin/nologin -c "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.

vacation -I


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 :

sudo postfix restart

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 :

postmap block_recipient

  • 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]
Pour aller plus loin...
  • 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 :

mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
89A7A210DA 1375 Fri Feb 14 19:32:47 nicolas.cachelou@ncad.local
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.local>: Sender address rejected: Access denied (in
reply to RCPT TO command))
_ alice@mail.glx

8027C21140 1375 Fri Feb 14 19:36:11 nicolas.cachelou@ncad.local
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.local>: Sender address rejected: Access denied (in
reply to RCPT TO command))
_ alice@mail.glx

230FB211BC 1375 Fri Feb 14 19:37:49 nicolas.cachelou@ncad.local
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.local>: Sender address rejected: Access denied (in
reply to RCPT TO command))
_ alice@mail.glx

B1E7D210E3 1375 Fri Feb 14 19:33:39 nicolas.cachelou@ncad.local
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.local>: Sender address rejected: Access denied (in
reply to RCPT TO command))
_ alice@mail.glx

-- 6 Kbytes in 4 Requests.

  • On peut également demander au serveur une vue synthétique des données sous forme de tableau :

qshape deferred <pipe> head

                                        T  5 10 20 40 80 160 320 640 1280 1280+
TOTAL 4 0 0 4 0 0 0 0 0 0 0
mail.glx 4 0 0 4 0 0 0 0 0 0 0
  • 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 :

postmap block_recipient

  • 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.
ICON Balance.png

Conformité avec la loi...

Sur un serveur en production, ce type d'activité est assimilé à de l’interception de mail. Dans le cadre d'une entreprise, l'employeur est en droit de consulter les mails professionnels de ses salariés sauf si dans l'objet il est clairement indiqué qu'il est à caractère personnel.

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 :
Réception d'un mail
  • 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 :
Envoi d'un mail
  • 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