« Postfix » : différence entre les versions

De NCad Wiki
Aller à la navigation Aller à la recherche
Ligne 659 : Ligne 659 :
         Tue, 15 Mar 2016 03:31:17 -0700 (PDT)
         Tue, 15 Mar 2016 03:31:17 -0700 (PDT)


On remarquera que le service apparaissant dans l'en-tête du courriel est '''ESMTPS'''.
{{ Box Remarque | objet=On remarquera que le service qui apparaît dans l'en-tête du courriel est '''ESMTPS'''. }}


</div></div>
</div></div>

Version du 15 mars 2016 à 11:52

.:[ 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 | Signature DKIM | Mailman | Maildrop


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_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.me>
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.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, 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.me> 
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.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


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/main.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.me>
Feb  9 13:27:54 alice postfix/qmgr[2663]: 1282946211A: from=<nicolas.cachelou@ncad.me>, 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.me. Pour cela, nous allons insérer la ligne suivante dans notre fichier /etc/postfix/block_recipient :
nicolas.cachelou@ncad.me           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.me 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.me>: Sender address rejected: Access denied; from=<nicolas.cachelou@ncad.me> 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.me
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.me>: 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.me
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.me>: 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.me
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.me>: 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.me
(host serveur.mail.glx[10.0.0.44] said: 450 4.7.1 <nicolas.cachelou@ncad.me>: 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.me. Pour cela, nous allons insérer la ligne suivante dans notre fichier /etc/postfix/block_recipient :
nicolas.cachelou@ncad.me           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.me 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.me>: Sender address rejected: Access denied; from=<nicolas.cachelou@ncad.me> 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.me 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.me>
1.4 Feb  9 14:13:00 alice postfix/qmgr[3356]: 520C34620FD: from=<nicolas.cachelou@ncad.me>, 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.me (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.me>
Feb  8 18:09:31 alice postfix/qmgr[15863]: 8ACDF46168D: from=<nicolas.cachelou@ncad.me>,
 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