Le système du courrier électronique : SMTP/POP3/IMAPv4

8 février 2007

Télécharger en PDF


Le courrier électronique, aussi simple soit-il à utiliser, repose sur un fonctionnement plus compliqué que celui du web. Pour la plupart des utilisateurs son fonctionnement est transparent, ce qui signifie qu'il n'est pas nécessaire de comprendre comment le courrier électronique fonctionne pour pouvoir l'utiliser.



Table des matières

I.Principes de SMTP/POP3/IMAP 2

1.Introduction 2

2.Envoi d'un mail 2

3.Contenu d'un mail 3

a)Entête 3

b)Corps 3

c)Enveloppe 3

4.Mails sortants 4

a)Principe 4

b)Exemple de session SMTP 4

5.Réception du courrier 5

a)Introduction 5

b)Le protocole POP3 6

c)Exemple de session POP 6

d)Le protocole IMAP 7

e)Exemple de session IMAP 8

6.Interaction du mail avec le DNS 9

II.Configurer Sendmail 10

1.Installation 10

2.Configuration 10

3.Envoyer un mail avec Sendmail 11

4.Test de règles de réécriture 11

5.Fichier d'alias et mailing list 12

6.Masquerading 12

7.Adresses d'utilisateurs virtuels 13

8.Retransmission de mails sans le Smart Host 14

9.Renvoi de mails d'un serveur à un autre 14

10.Prise en compte des modificiations 14

11.Relai sécurisé 14

12.Contrôle d'accès SMTP : /etc/mail/access 15

13.Anti-spam 16

14.Antivirus 17

a)Configuration 18

b)Intégration aux serveur mails 18

1Sendmail 18

15.Authentification SMTP 19

a)Installation 19

b)Configuration 19

c)Obliger les connexions authentifiées 20

d)Interdire EXPN/VRFY sauf pour les utilisateurs authentifiés 20

e)Utiliser Sendmail pour relayer ou envoyer du courrier par SMTP AUTH 21

16.SMTP TLS : SMTP sécurisé 21

a)Configuration 21

b)Test 22

c)Obliger les connexions sécurisées pour l'authentification textuelle 22

17.PGPSendmail 22

III.Serveur POP/IMAP : dovecot 22

1.Installation 22

2.Configuration 23

3.Lancement de dovecot 24

4.Configuration de Dovecot over SSL 24

Génération de certificats avec dovecot 24

IV.Et iptables dans tout ça 25

V.Bibliographie 25



I.Principes de SMTP/POP3/IMAP

1.Introduction


Le système de courrier électronique s'appuie sur plusieurs composantes formant ainsi des modules, qui coopèrent les uns avec les autres. Cette architecture permet une grande souplesse, par exemple, le remplacement d'un seul module par un élément plus récent suffit à faire évoluer le système de courrier électronique. Les composantes sont au nombre de quatre :


2.Envoi d'un mail

Le processus d'envoi d'un mail est le suivant :



3.Contenu d'un mail

a)Entête

Cette partie contient toutes les informations qui vont permettre au courrier électronique d'être acheminé jusqu'à son destinataire. Chaque ligne de l'en-tête est composée de

mot-clé : arguments

b)Corps

Cette partie contient les données du courrier électronique. Il s'agit de texte, codé soit sur 7 bits (protocole SMTP : Simple Mail Transfer Protocol) ce qui interdit l'utilisation des caractères accentués, soit sur 8 bits (protocole ESMTP : Extended Simple Mail Protocol) et dans ce dernier cas, le problème précédent ne se pose plus.

c)Enveloppe

Il convient donc de véhiculer une nouvelle information avec un message. Cette information par analogie avec la poste, s'appelle l'enveloppe. Elle sert à router les messages.


Relai ouvert


A l'origine, les systèmes SMTP ne sont pas prévus pour demander une authentification. Cependant, dans ce cas, il est simple de se faire passer pour un autre. C'est pour cela que les FAI autorisent seulement la plage d'IP de leurs abonnés.

Lorsque le serveur de messagerie d'une organisation est mal configurée et permet à des personnes appartenant à des réseaux quelconques d'envoyer des courriers électronique, on parle alors de relais ouvert (en anglais open relay). Ceux sont en général, les sources de SPAM.



4.Mails sortants

a)Principe


SMTP signifie Simple Mail Transfert Protocol. Il s'agit donc du protocole de transfert de courrier électronique le plus basique, aussi bien dans ses spécificités que dans son utilisation. Tout envoi de courrier électronique commence par l'établissement d'un canal de communication entre les deux correspondants que sont l'expéditeur et le destinataire. SMTP est un protocole application, au dessus de la couche Transport TCP.

Après l'ouverture du canal, des commandes spécifiques permettent de traiter le courrier à envoyer, mais il existe aussi un certain nombre de commandes qui effectuent des actions propres au suivi de la communication entre les deux entités.

Chaque commande invoquée est suivie d'une réponse, composée d'un code numérique, et d'un message. Par exemple, le code numérique « 250 » est utilisé pour signifier « OK », tandis que « 500 » signifiera « commande inconnue ».



b)Exemple de session SMTP


Voici un exemple de session SMTP :

[machine]$ telnet serveur 25

Trying x.y.z.w...

Connected to serveur.

Escape character is '^]'.

220 serveur ESMTP Sendmail 8.11.2/8.11.2; Thu, 3 Jan 2004 13:52:55

+0100

HELO serveur

250 serveur Hello machine [x.y.z.w], pleased to meet you

HELP

214-2.0.0 This is sendmail version 8.11.2

214-2.0.0 Topics:

214-2.0.0 HELO EHLO MAIL RCPT DATA

214-2.0.0 RSET NOOP QUIT HELP VRFY

214-2.0.0 EXPN VERB ETRN DSN AUTH

214-2.0.0 STARTTLS

214-2.0.0 For more info use "HELP <topic>".

214-2.0.0 To report bugs in the implementation send email to

214-2.0.0 sendmail-bugs@sendmail.org.

214-2.0.0 For local information send email to Postmaster at your site.

214 2.0.0 End of HELP info

MAIL FROM: emetteur@domaine.fr

250 2.1.0 emetteur@domaine.fr... Sender ok

RCPT TO: <destinataire>

250 2.1.5 <destinataire>... Recipient ok

DATA

354 Enter mail, end with "." on a line by itself

Subject: Essai de mail


Ceci est le corps du message ...

.

250 2.0.0 g03CsNl07973 Message accepted for delivery

NOOP

250 2.0.0 OK

QUIT

221 2.0.0 serveur closing connection

Connection closed by foreign host.

[machine]$


Exemple de session ESMTP


Voici un exemple de session ESMTP :

[machine]$ telnet serveur 25

Trying x.y.z.w...

Connected to serveur.

Escape character is '^]'.

220 serveur ESMTP Sendmail 8.11.2/8.11.2; Thu, 3 Jan 2004 14:00:03

+0100

ehlo serveur

250-serveur Hello machine [x.y.z.w], pleased to meet you

250-ENHANCEDSTATUSCODES

250-8BITMIME

250-SIZE 5000000

250-DSN

250-ONEX

250-ETRN

250-XUSR

250 HELP

MAIL FROM: emetteur@domaine.fr

250 2.1.0 emetteur@domaine.fr... Sender ok

RCPT TO: <destinataire>

250 2.1.5 <destinataire>... Recipient ok

DATA

354 Enter mail, end with "." on a line by itself

message ...

.

250 2.0.0 g03D1tl10892 Message accepted for delivery

QUIT

221 2.0.0 serveur closing connection

Connection closed by foreign host.

[machine]$


5.Réception du courrier

a)Introduction

POP : Post Office Protocol

IMAP : Internet Message Access Protocol


Le protocole POP est le plus ancien et le plus largement répandu. Très simple, il possède environ une dizaine de commandes alors que le protocole IMAP est plus récent et propose plus de

fonctionnalités que POP.

Si on utilise une connexion POP pour lire ses messages, on récupère les courriers directement sur un serveur POP qui les stocke pour l'utilisateur (serveur du fournisseur d'accès par exemple). On peut également laisser une copie des courriers sur le serveur POP, pour pouvoir être ensuite récupérés d'un autre endroit.

Si on utilise une connexion IMAP, on consulte directement la boîte aux lettres à distance, ce qui permet d'en avoir une seule et unique copie, où que l'on soit dans le monde.


b)Le protocole POP3

Ce protocole est défini par la RFC1939. Généralement, ce protocole est utilisé en mode offline, c'est à dire que le client ramène dans sa boite aux lettres locale son courrier stocké sur le serveur depuis sa dernière relève. Le courrier est alors lu après l'avoir rapatrié, hors connection, en local. Lorsque le client souhaite effacer son courrier, il doit rendre un "flag" de suppression actif pour le message ç supprimer. C'est seulement à la fin de la connexion, que le courrier ainsi marqué sera effacé du disque du serveur. Par contre, il n'y a qu'une seule boite aux lettres sur le serveur.


En général, le serveur POP écoute le port 110 de la machine.


La syntaxe des commandes du protocole POP est la suivante:

[ commande ] [ argument ] [ argument ] ( retour chariot )


Les commandes peuvent être :


Les réponses retournent +OK en début de ligne si tout ce passe bien sinon retournent - ERR en

cas de problème.


c)Exemple de session POP

[utilisateur]$ telnet serveur 110

Trying x.y.z.w...

Connected to serveur.

Escape character is '^]'.

+OK POP3 Welcome to GNU POP3 Server Version 0.9.8 <11965.1010143243@serveur>

USER utilisateur

+OK

PASS motdepasse

+OK opened mailbox for utilisateur

STAT

+OK 1 369

LIST 1

+OK 1 369

RETR 1

+OK

Return-Path: <utilisateur@domaine.fr>

Received: (from nom@machine)

by serveur (8.11.2/8.11.2) id g04BKZJ10755

for utilisateur; Fri, 4 Jan 2002 12:20:35 +0100

Date: Fri, 4 Jan 2002 12:20:35 +0100

From: utilisateur@domaine.fr

Message-Id: <200201041120.g04BKZJ10755@serveur>

To: utilisateur2@domaine.fr

Subject: Essai de mail

Bonjour utilisateur

.

DELE 1

+OK Message 1 marked

QUIT

+OK

Connection closed by foreign host.

[utilisateur]$


d)Le protocole IMAP

Ce protocole est définie par la RFC2060. Il permet la gestion de plusieurs boites aux lettres sur plusieurs serveurs à partir de plusieurs clients. Il permet également la consultation de messages MIME. Le mode online supporté veut dire que le client et le serveur sont connecté pendant toute la durée de la manipulation du courrier électronique. Le client peut donc consulter son courrier en restant connecté.

De ce fait, on peut créer toute une arborescence de boites aux lettres à partir de la principale (inbox). Par exemple, l'utilisateur toto peut avoir des sous boites aux lettres, une pour les messages personnels, une pour les message du travail, une pour la cuisine, ....


La syntaxe des commandes du protocole IMAP est la suivante:

[ tag ] [ commande ] [ argument ] [ argument ] ( retour chariot )


Le tag est un code alphanumérique que vous pouvez choisir à votre guise. En générale, on utilise un code croissant pour identifier temporellement les commandes.

Les commandes principales sont:


Le serveur peut retourner plusieurs types de réponses:


e)Exemple de session IMAP

[utilisateur]$ telnet serveur 143

Trying x.y.z.w...

Connected to serveur.

Escape character is '^]'.

* OK gip Cyrus IMAP4 v2.0.16 server ready

a001 LOGIN utilisateur motdepasse

a001 OK User logged in

a002 select inbox

* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)

* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]

* 7 EXISTS

* 1 RECENT

* OK [UNSEEN 1]

* OK [UIDVALIDITY 1004181443]

* OK [UIDNEXT 3652]

a002 OK [READ-WRITE] Completed

a003 FETCH 7 FULL

* 7 FETCH (FLAGS (\Recent) INTERNALDATE " 4-Jan-2004 12:43:40 +0100" RFC822.SIZE

636 ENVELOPE ("Fri, 4 Jan 2004 12:43:40 +0100" "essai de mail IMAP" ((NIL NIL

"utilisateur" "domaine.fr")) ((NIL NIL "utilisateur" "domaine.fr")) ((NIL NIL "utilisateur"

"domaine .fr")) ((NIL NIL "destinataire" "domaine2.fr")) NIL NIL NIL

"<200201041143.g04Bhe018099@domaine.fr>") BODY ("TEXT" "PLAIN"

("CHARSET" "us-ascii") NIL NIL "7BIT" 11 1))

a003 OK Completed

a004 FETCH 7 body

* 7 FETCH (BODY ("TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "7BIT" 11 1))

a004 OK Completed

a005 FETCH 7 BODY[TEXT]

* 7 FETCH (FLAGS (\Recent \Seen) BODY[TEXT] {11}

Voila un message...

)

a005 OK Completed

a006 logout

* BYE LOGOUT received

a006 OK Completed

Connection closed by foreign host.

[utilisateur]$


6.Interaction du mail avec le DNS



L'envoie de courrier à user@site peut se faire de deux façons:


Si la première méthode est simple à l'esprit à mettre en oeuvre, il n'en est pas de même dans la réalité, car elle nécessite la maintenance d'un MTA sur chaque machine du réseau. C'est pour cela que dans la pratique, on utilise généralement la deuxième méthode.


C'est à ce niveau que le DNS intervient, car il permet de connaître ces machines postales. Il est en effet capable de stocker dans sa base de données ce type d'informations? Il s'agit en l'occurrence des RR de type MX.

Au lieu de contacter le DNS pour obtenir l'adresse IP de la machine destinatrice, on va le contacter pour lui demander le MX de la station destinatrice, puis l'adresse IP de cette dernière et c'est à lui que sendmail se connectera pour transmettre le message.


Dans la pratique, l'utilisation d'un MX présente plusieurs avantages :

domaine.fr IN MX 10 serveur_courrier_entrant

Le domaine domaine.fr a donc un MX et on peut donc utiliser l'adresse (username)@domaine.fr qui dirigera les courriers vers machine.domaine.fr.


domaine.fr IN MX 10 machine1

domaine.fr IN MX 20 machine2



II.Configurer Sendmail

1.Installation

[root]# apt-get install sendmail


2.Configuration

Dans le fichier /etc/mail/sendmail.mc :

divert(-1)dnl

		#
		#  This file contains definitions for my mailserver
		#
		divert(0)dnl
		#inclusion pour le préprocesseur m4
		include(`/usr/share/sendmail/cf/m4/cf.m4')dnl  
		#infos sur l'OS de du serveur mail
		OSTYPE(`linux')dnl 
		# défini le serveur mail vers lequel renvoyer le courrier 

# vers les domaines que l'on ne gère pas

define(`SMART_HOST',`titan.prive.iut-amiens.fr')

# rediriger le courrier

FEATURE(redirect)dnl

# toujours ajouter le nom de domaine

# s'il n'est pas spécifié par l'utilisateur

FEATURE(always_add_domain)dnl

#active le fichier trusted-users :

#utilisateur autorisé à se faire passer pour un autre

FEATURE(use_ct_file)dnl

# accepter les maisl provenant de domaines

# dont on ne peut pas vérifier le nom DNS

FEATURE(`accept_unresolvable_domains')dnl

# écoute sur toutes les interfaces de la machine

DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp')dnl

# défini le nom de la zone DNS dont on sert les mails

LOCAL_DOMAIN(`tp9-pc01.prive.iut-amiens.fr')dnl

#définir le fichier des alias

define(`ALIAS_FILE',`/etc/mail/aliases')

#autoriser Sendmail à recevoir le courrier en local

		MAILER(local)
		MAILER(procmail)
		#et par le protocole SMTP
		MAILER(smtp)


Commenter (dnl) les lignes EXPOSED_USER et DAEMON_OPTIONS

3.Envoyer un mail avec Sendmail


[user]# /usr/sbin/sendmail user@domaine.tld

entête du mail


contenu du mail

4.Test de règles de réécriture


Pour tester le résultat du traitement d'une adresse email pour vérifier qu'elle est bien reconnue, vous pouvez essayer ceci, par exemple pour un mail au root le plus proche (ce qui est en gras est à taper):

[user]$ /usr/sbin/sendmail -bt

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)

Enter <ruleset> <address>

> /tryflags ES

> /try smtp root

> Trying envelope sender address root for mailer smtp

canonify input: root

Canonify2 input: root

Canonify2 returns: root

canonify returns: root

1 input: root

1 returns: root

EnvFromSMTP input: root

PseudoToReal input: root

PseudoToReal returns: root

MasqSMTP input: root

MasqSMTP returns: root < @ *LOCAL* >

MasqEnv input: root < @ *LOCAL* >

MasqHdr input: root < @ *LOCAL* >

MasqHdr returns: root < @ localhost . localdomain . >

MasqEnv returns: root < @ localhost . localdomain . >

EnvFromSMTP returns: root < @ localhost . localdomain . >

final input: root < @ localhost . localdomain . >

final returns: root @ localhost . localdomain

Rcode = 0, addr = root@localhost.localdomain

> /try smtp sharevb@sharevb.net

> Trying envelope sender address sharevb@sharevb.net for mailer smtp

canonify input: sharevb @ sharevb . net

Canonify2 input: sharevb < @ sharevb . net >

Canonify2 returns: sharevb < @ sharevb . net . >

canonify returns: sharevb < @ sharevb . net . >

1 input: sharevb < @ sharevb . net . >

1 returns: sharevb < @ sharevb . net . >

EnvFromSMTP input: sharevb < @ sharevb . net . >

PseudoToReal input: sharevb < @ sharevb . net . >

PseudoToReal returns: sharevb < @ sharevb . net . >

MasqSMTP input: sharevb < @ sharevb . net . >

MasqSMTP returns: sharevb < @ sharevb . net . >

MasqEnv input: sharevb < @ sharevb . net . >

MasqHdr input: sharevb < @ sharevb . net . >

MasqHdr returns: sharevb < @ sharevb . net . >

MasqEnv returns: sharevb < @ sharevb . net . >

EnvFromSMTP returns: sharevb < @ sharevb . net . >

final input: sharevb < @ sharevb . net . >

final returns: sharevb @ sharevb . net

Rcode = 0, addr = sharevb@sharevb.net

> /quit


5.Fichier d'alias et mailing list


On peut donner des alias au noms des utilisateurs locaux ou créer des mailing list.

Dans le fichier /etc/aliases :


Exécuter la commande newaliases après chaque modification du fichier /etc/aliases.

6.Masquerading


Le masquerading est le fait de changer le nom de domaine sortant à l'envoi du mail. Cela permet de changer un nom de domaine qui n'existe pas sur internet. Par exemple, si l'on a un domaine gestion.domaine.fr et que seul domaine.fr est accessible par Internet, il est nécessaire de masquerader afin que lorsqu'un membre de gestion.domaine.fr envoie un mail à l'extérieur, il puisse reevoir une réponse.


Dans le fichier /etc/mail/sendmail.mc :

#changer les noms de domaines

#dans les commandes SMTP (RCPT TO, MAIL FROM)

FEATURE(masquerade_envelope)dnl

#changer les noms de domaines même lorsqu'ils sont précédés

#du nom de machine (*.domaine.tld)

FEATURE(masquerade_entire_domain)dnl

#et aussi dans le contenu du mail

FEATURE(allmasquerade)dnl

MASQUERADE_DOMAIN(nom_domaine_interne.tld)dnl

MASQUERADE_AS(`nom_domaine_externe.tld')dnl


#se limiter aux domaines spécifiés par MASQUERADE_DOMAIN

FEATURE(limited_masquerade)dnl

#ne pas changer le domaine en paramètre

MASQUERADE_EXCEPTION(`nom_autre_domaine.tld')dnl


#active le fichier local-host-names

FEATURE(use_cw_file)dnl


#redirection de mails locaux vers externe

FEATURE(`genericstable',`hash -o /etc/mail/genericstable.db')dnl


Le fichier local-host-names permet d'indiquer l'ensemble des machines pour lequelles on sert de serveur mail. Dans le fichier /etc/mail/local-host-names :

# local-host-names - include all aliases for your machine here.

nom_domaine.local1.tld

nom_domaine.local2.tld

...


Le fichier /etc/mail/genericstable permet de rediriger le courrier des utlisateurs locaux vers l'extérieur. Dans le fichier /etc/mail/genericstable selon le format suivant :

nom_utilisateur_local: user@fai.tld

7.Adresses d'utilisateurs virtuels


Tout comme, il nécessaire de masquerader les mails sortants pour se rendre visible de l'extérieur, il est nécessaire (ou du moins intéressant) de donner des adresses virtuelles afin que dans l'exemple précédent, truc@domaine.fr redevienne truc@gestion.domaine.fr pour que l'utilisateur interne truc puisse recevoir ses mails.On peut aussi renvoyer explicitement un message d'erreur ou donner un alias (nom de domaine compris, contrairement à aliases).


Dans le fichier /etc/mail/sendmail.mc :

FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl


Dans le fichier /etc/mail/virtusertable :

#un alias simple

alias@domaine.fr utilisateur_local

#un alias avec domaine

alias@domaine.fr utilisateur@autre_domaine.com

#à définir pour chaque utilisateur

#si on utilise l'erreur de l'avant dernière ligne

utilisateur@domaine.fr utilisateur

#masquerading inverse

utilisateur@domaine.fr utilisateur@interne.domaine.fr

# aucune autre adresse n'existe

@domaine.fr error:nouser L'utilisateur n'existe pas !!

# ou tous les autres adresses vers un utilisateur

#@domaine.fr utilisateur_local

8.Retransmission de mails sans le Smart Host

On peut explicitement définir une liste de serveur SMTP vers lesquels envoyer le courrier sortant vers des domaines connus. Par exemple, un serveur SMTP pour domaine.fr peut renvoyer le courrier vers des serveurs de sous domaines comme gestion.domaine.fr.


Dans le fichier /etc/mail/sendmail.mc :

FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl


Dans le fichier /etc/mail/mailertable :

autre_domaine.tld smtp:serveur_smtp.autre_domaine.tld

9.Renvoi de mails d'un serveur à un autre


On peut faire une redirection explicite d'un email sur un autre mail par le biais des utilisateurs virtuels.


Dans le fichier /etc/mail/virtusertable :

utilisateur1@domaine.fr utilisateur1

utilisateur2@domaine.fr utilisateur2

utilisateur3@domaine.fr utilisateur3

...

@domaine.fr %1@autre_domaine.com

10.Prise en compte des modificiations

A chaque modification des fichiers sendmail.mc, virtusertable, mailertable...et de tous les fichiers possibles dans /etc/mail, vous devez exécuter :

[root]# cd /etc/mail

[root]# make

[root]# service sendmail restart



11.Relai sécurisé

Il peut arriver que vous deviez transmettre des mails directement de a.fr vers b.uk ou c.de sans pour autant être en contacte avec l'admin de ces domaines.

Il existe les options suivantes pour Sendmail.mc :

Les options suivantes sont en général, de mauvaises idées :

12.Contrôle d'accès SMTP : /etc/mail/access

Pour activer le contrôle d'accès à SMTP sur sendmail, il est nécessaire de définir dans le fichier sendmail.mc :

FEATURE(`access_db',`hash -o /etc/mail/access.db')dnl

Ce fichier permet de définir individuellement les domaines autorisés à relayer des mails ou les domaines vers lesquels on peut relayer. On peut aussi préciser des règles d'accès pour le domaine que l'on sert. Ceci permet de créer des règles anti-spam rudimentaire ou de forcer certains utilisateurs à utiliser certaines fonctionnalités TLS.

Chaque ligne se compose d'un nom de domaine, d'hôte ou d'utilisateur et d'une action :

key action

key peut être :

action peut être ;



On peut aussi préfixer chaque ligne par :

Ne pas oublier de refaire un make dans le dossier /etc/mail et de relancer sendmail.



13.Anti-spam

Voilà bien une plaie de la messagerie : le SPAM. Un anti spam est souvent nécessaire et devient incontournable si l'on fait relai vers certains domaines afin de ne relayer que du courrier utile.

# apt-get install spamassassin

activer le démarrage du service au démarrage de la machine (/etc/default/spamassassin et directive ENABLE=1).

# /etc/init.d/spamassassin start

Dans le fichier /etc/mail/spamassassin/local.cf :

#entête à ajouter dans le sujet des mails de spam 
rewrite_header Subject [SPAM]
#langue française
lang fr
#ajouter au sujet
rewrite_subject 1
#mettre le message de spam en attachement message/rfc822 sans le modifier
# et réexpédier le mail rapportant le spam
report_safe 1
#nombre de points au dessus duquel un mail est considéré comme un spam
required_score 4.2
#indique la liste des langues de mail autorisée en entrée
ok_languages fr
#indique la liste des langues de mail autorisée en entrée
ok_locales en
#activer l'apprentissage par le méthode de Bayès
bayes_auto_learn 1
#utiliser la méthode de Bayès
use_bayes 1
#délai d'attente pour les requête DNS
rbl_timeout 1
skip_rbl_checks 1
#ne pas utiliser razor 2
use_razor2 0
#désactive le test de la longueur du Message-Id
score MSGID_FROM_MTA_SHORT 0.0 0.0 0.0 0.0

Pour un utilisateur particulier, on utilisera le fichier .procmailrc. Pour tout le monde, on modifiera le fichier /etc/procmailrc.

Dans le fichier procmailrc :
# SpamAssassin sample procmailrc
# ==============================

# The following line is only used if you use a system-wide /etc/procmailrc.
# See procmailrc(5) for infos on what it exactly does, the short version:
#  * It ensures that the correct user is passed to spamd if spamc is used
#  * The folders the mail is filed to later on is owned by the user, not
#    root.
DROPPRIVS=yes

# Pipe the mail through spamassassin (replace 'spamassassin' with 'spamc'
# if you use the spamc/spamd combination)
#
# The condition line ensures that only messages smaller than 250 kB
# (250 * 1024 = 256000 bytes) are processed by SpamAssassin. Most spam
# isn't bigger than a few k and working with big messages can bring
# SpamAssassin to its knees.
#
# The lock file ensures that only 1 spamassassin invocation happens
# at 1 time, to keep the load down.
#
:0fw: spamassassin.lock
* < 256000
| spamassassin

# Mails with a score of 15 or higher are almost certainly spam (with 0.05%
# false positives according to rules/STATISTICS.txt). Let's put them in a
# different mbox. (This one is optional.)
:0:
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
almost-certainly-spam

# All mail tagged as spam (eg. with a score higher than the set threshold)
# is moved to "probably-spam".
:0:
* ^X-Spam-Status: Yes
probably-spam

# Work around procmail bug: any output on stderr will cause the "F" in "From"
# to be dropped.  This will re-add it.
# NOTE: This is probably NOT needed in recent versions of procmail
:0
* ^^rom[ ]
{
  LOG="*** Dropped F off From_ header! Fixing up. "
  
  :0 fhw
  | sed -e '1s/^/F/'
}

14.Antivirus


ClamAV a été conçu dans le but de scanner les mails d'un serveur mail pour Linux/Unix et est sous licence GPL.

[root]# apt-get update

[root]# apt-get install clamav

a)Configuration

A l'installation, il est nécessaire de choisir cron pour la mise à jour de la base.

b)Intégration aux serveur mails

1Sendmail

[root]# apt-get install clamav-milter

Dans le fichier /etc/mail/sendmail.mc, vérifier que les lignes suivantes ci trouvent :

INPUT_MAIL_FILTER(`clmilter',`S=local:/var/run/clamav/clmilter.sock',F=,T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS',`clmilter')dnl

Recompilez le fichier sendmail.mc avec les macros m4 :

[root]# m4 sendmail.mc > sendmail.cf

Editiez ensuite /etc/clamav/clamd.conf et verifiez qu'il contient les lignes :

#Automatically Generated by clamav-base postinst
#To reconfigure clamd run #dpkg-reconfigure clamav-base
#Please read /usr/share/doc/clamav-base/README.Debian.gz for details
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket
User clamav
AllowSupplementaryGroups
ScanMail
ScanArchive
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
ArchiveMaxFileSize 10M
ArchiveMaxCompressionRatio 250
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogFile /var/log/clamav/clamav.log
LogTime
LogFileMaxSize 0
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/lib/clamav
SelfCheck 3600
ScanOLE2
ScanPE
DetectBrokenExecutables
ScanHTML
ArchiveBlockMax

Editiez enfin /etc/default/clmilter et verifiez qu'il contient les lignes :

SOCKET=local:/var/run/clamav/clmilter.sock

Il ne reste plus qu'a relancer sendmail. Pour cela vous devez d'abord regénérer son fichier de configuration /etc/mail/sendmail.cf :

root@localhost# m4 sendmail.mc > sendmail.cf

Puis relancez sendmail.

[root]# apt-get install clamav-testfiles

ClamAV est maintenant opérationnel: vous pouvez essayer de vous envoyer le fichier /usr/share/clamav-testfiles/clam.zip (qui contiens une signature de virus) par mail, le serveur vous renverra une erreur 571 vous indiquant que le fichier contiens un virus.



15.Authentification SMTP

a)Installation

[root]# apt-get install sendmail-bin sasl2-bin openssl libsasl2-modules

sendmail -d0.1 -bv root | grep SASL

et vérifier que SASL s'affiche bien.

b)Configuration

Dans le fichier /usr/lib/sasl2/Sendmail.conf :

#synchroniser les bases systèmes et sasldb2

auto_transition: true

#utiliser le démon d'authentification

pwcheck_method: saslauthd

#autre méthode d'authentification par sasldb2

auxprop_plugin: sasldb

#autorisé les authentifications textuelles

allowplaintext: 1

#une liste des méthodes possibles

mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN



Dans le fichier /etc/default/saslauthd :

# This needs to be uncommented before saslauthd will be run automatically

START=yes



# You must specify the authentication mechanisms you wish to use.

# This defaults to "pam" for PAM support, but may also include

# "shadow" or "sasldb", like this:

# MECHANISMS="pam shadow"



MECHANISMS="pam shadow sasldb"



Exécuter /etc/init.d/saslauthd start



Dans le fichier /etc/mail/sendmail.mc :

dnl on peut simplement utiliser la configuration par défaut en mettant seulement la ligne suivante

dnl include(`/etc/mail/sasl/sasl.m4')dnl

dnl pour les MTA non standard
define(`confAUTH_OPTIONS', `A')dnl
dnl indique les méthodes d'authentification autorisées pour le relai de mails
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl liste des méthodes d'authentification autorisées
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

Exécuter sendmailconfig et répondre Y à toutes les questions.

Vérifier que vous avez la ligne suivante dans la réponse de sendmail lors du EHLO :

250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN

c)Obliger les connexions authentifiées

Dans le fichier /etc/mail/sendmail.mc, remplacer :

DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp')dnl

par

DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, M=Ea')dnl


Ensuite faire un make dans /etc/mail et relancer sendmail.

d)Interdire EXPN/VRFY sauf pour les utilisateurs authentifiés

Dans sendmail.mc :

#interdire EXPN/VRFY

define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn')dnl

#règle pour autoriser

LOCAL_CONFIG
F{trusty}/etc/mail/trusted-domains

LOCAL_RULESETS
Scheck_expn
R$* $@ $>check_expn_and_vrfy $1

Scheck_vrfy
R$* $@ $>check_expn_and_vrfy $1

Scheck_expn_and_vrfy
R$* $: < $&{client_name} >
R< $={trusty} > $@ OK
R< $+ $={trusty} > $@ OK
R$* $: $&{auth_type}
R$={TrustAuthMech} $@ OK
R$* $#error $@ 5.7.1 $: 550 EXPN/VRFY failed for $&{client_name}

e)Utiliser Sendmail pour relayer ou envoyer du courrier par SMTP AUTH

  1. Passer en root

  2. Aller dans le dossier de votre sendmail.mc, habituellement /etc/mail/.

  3. Créer un dossier auth sûr:

      # mkdir auth
      # chmod 700 auth
      
  4. Créer un fichier auth/auth-info avec les informations d'authentification :

      AuthInfo:serveur_mail.domaine.tld "U:root" "I:utilisateur" "P:mot_de_passe"
  5. Générer la db d'authentification et la rendre lisible uniquement de root:

      # cd auth
      # makemap hash client-info < client-info
      # chmod 600 client-info*
      # cd ..
      
  6. Ajouter le ligne suivante à votre sendmail.mc :

dnl indique le fichier servant à Sendmail pour s'authentifier lors du relayage
define(`confDEF_AUTH_INFO', `/etc/mail/auth/auth-info')dnl
      
  1. Genérer sendmail.cf:

      # m4 sendmail.mc > sendmail.cf
      
  2. Redémarrer sendmail



16.SMTP TLS : SMTP sécurisé

a)Configuration

Pour que Sendmail puisse utiliser STARTTLS en serveur ou en client vous devez mettre ceci dans votre sendmail.mc :

dnl on peut simplement utiliser la configuration par défaut en mettant seulement la ligne suivante

dnl include(`/etc/mail/tls/starttls.m4')dnl

dnl chemin du dossier contenant tous les certificats
define(`confCACERT_PATH', `/etc/mail/certs')dnl
dnl nom du certificat CA signant le certificat du serveur
define(`confCACERT', `/etc/mail/certs/CAcert.pem')dnl
dnl nom des fichiers contenant les certificats et clés privées pour le serveur
dnl en tant que serveur
define(`confSERVER_CERT', `/etc/mail/certs/MYcert.pem')dnl
define(`confSERVER_KEY', `/etc/mail/certs/MYkey.pem')dnl
dnl en tant que relai
define(`confCLIENT_CERT', `/etc/mail/certs/MYcert.pem')dnl
define(`confCLIENT_KEY', `/etc/mail/certs/MYkey.pem')dnl

Ensuite :

  1. Installer le certificat de l'autorité de certification CA qui signe le certificat du serveur dans le fichier /etc/mail/certs/CAcert.pem.

  2. Installer un ou plusieurs serveurs d'autorités de certifaction pour vérifier la validité des certificats clients et faire un lien vers leur hash pour chacun d'eux :

    C=nom_fichier_certificat_CA
    ln -s $C `openssl x509 -noout -hash < $C`.0
  3. Installer le certificat du serveur (dont le CN est le FQDN du serveur et dont la clé privée n'est pas cryptée) dans les fichiers /etc/mail/certs/MYcert.pem (pour le certificat) et /etc/mail/certs/MYkey.pem (chmod 700) (pour la clé privée)

b)Test

Lancer sendmailconfig et répondre Y à toutes les questions. Vérifier qu'à la connexion EHLO, il se trouve bien une ligne :

250-STARTTLS

c)Obliger les connexions sécurisées pour l'authentification textuelle

dnl indique que l'authentification est obligatoire 
dnl et que LOGIN et PLAIN nécessitent STARTTLS
define(`confAUTH_OPTIONS', `A p y')dnl

17.PGPSendmail

Ce logiciel permet de faire un pont PGP entre deux serveurs SMTP, de façon à crypter les messages de manière transparente et ceci en fonction de l'expéditeur.

http://www.atnf.csiro.au/people/rgooch/PGPsendmail.html



III.Serveur POP/IMAP : dovecot

1.Installation

[root]# apt-get install dovecot

2.Configuration


# Protocoles que l'on veut servir :

# imap imaps pop3 pop3s

protocols = imap imaps pop3 pop3s


# IP ou nom d'hôte de l'interface sur laquelle servir le protocole spécifié

# sous la forme hôte_ou_IP:port

# ou * pour toutes les interfaces

imap_listen = *

pop3_listen = *

imaps_listen = *

pop3s_listen = *


# Ne pas désactiver SSL/TLS.

ssl_disable = no


# certificat SSL/TLS et clé privée encodée PEM X.509. Ces fichiers ne doivent

# pouvoir être lus que par root

ssl_cert_file = /etc/ssl/certs/dovecot.pem

ssl_key_file = /etc/ssl/private/dovecot.pem


# désactive les commandes à authentification textuelle plain (comme LOGIN)

# sauf sur l'interface lo

#disable_plaintext_auth = yes


# Grant access to these extra groups for mail processes. Typical use would be

# to give "mail" group write access to /var/mail to be able to create dotlocks.

mail_extra_groups = mail


##

## Authentication processes

##


# Nom du processus d'authentification

auth = default


# Indique la méthode d'authentification pour IMAP/POP

# Liste de méthodes séparées par des espaces :

# anonymous plain digest-md5 cram-md5

#

# anonymous - Pas d'authentification

# plain - Mot de passe circulant en clair. (très courant)

# digest-md5 and cram-md5 - mots de passes encryptés (plus rare).

# il n'y a pas beaucoup de client qui le supporte et la base de mot de passe

# locale doit être en texte clair ou encrypté de façon réversible

#

# Voir auth.txt pour plus de détails

auth_mechanisms = plain


# Base d'utilisateur contenant le chemin des mails et les UID/GID

# http://wiki.dovecot.org/Authentication

# http://wiki.dovecot.org/VirtualUsers

# passwd: /etc/passwd ou similaire, en utilisant getpwnam()

# passwd-file <path>: fichier à la passwd dans le chemin spécifié

auth_userdb = passwd


# Base de mots de passes contenant uniquements les mots de passes utilisateurs

# http://wiki.dovecot.org/Authentication

# passwd: /etc/passwd ou similaire, en utilisant getpwnam()

# shadow: /etc/shadow ou similaire, en utilisant getspnam()

# pam [<service> | *]: PAM authentication

# passwd-file <path>: fichier à la passwd dans le chemin spécifié

auth_passdb = pam


# utilisateur autorisé à accéder à la base d'utilisateurs et de mots de passes

auth_user = root


3.Lancement de dovecot


[root]# /etC/init.d/dovecot start

4.Configuration de Dovecot over SSL

Vous allez également générer des clefs pour pouvoir utiliser imap et pop en ssl (imaps et pops), et donc configurer votre serveur de mail pour qu'il utilise ssl.

Dans le fichier /etc/dovecot/dovecot.conf :


protocols = imap imaps pop3 pop3s

ssl_disable=no

#chemin du fichier de la paire de clé privée/publique .KEY. Peut être dans /etc/pki/dovecot/private

ssl_key_file = /chemin/vers/fichier.key #ou fichier.pem

# chemin du fichier certificats signé (ou autosigné). Peut être dans /etc/pki/dovecot/certs

ssl_cert_file = /chemin/vers/fichier.crt #ou fichier.pem


Génération de certificats avec dovecot


On se place dans le dossier /etc/pki/dovecot : (on prépare le terrain, peu générer des erreurs)


[root]# rm dovecot.pem

[root]# rm private/dovecot.pem

[root]# mkdir private certs


On édite le fichier dovecot-openssl.cnf :


[ req ]

default_bits = taille_clé #1024

encrypt_key = yes

distinguished_name = nom du demandeur du certificat

x509_extensions = cert_type

prompt = no


[ nom du demandeur ]

# country (2 letter code)

C=pays

# State or Province Name (full name)

ST=province

# Locality Name (eg. city)

L=ville

# Organization (eg. company)

O=entreprise

# Organizational Unit Name (eg. section)

OU=service ou section de l'entreprise

# Common Name (*.example.com is also possible)

CN=nom du serveur

# E-mail contact

emailAddress=email de l'administrateur


[ cert_type ]

nsCertType = server


On peut utiliser le script : mkcert.sh


[root]# cd /usr/share/doc/dovecot-x.xx.xx/examples/mkcert.sh


IV.Et iptables dans tout ça

Sendmail, comme tous les serveurs SMTP, écoute sur le port TCP 25 ce qui donne :

[root]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT

[root]# iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT

De plus, il peut aussi écouter sur le port TCP 587 (port MSA : Mail Submission Agent), un MTA pour réseau local obligeant l'authentification :

[root]# iptables -A INPUT -p tcp --dport 587 -j ACCEPT

[root]# iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

V.Bibliographie

Sendmail SMTP

Sendmail Consortium

Configurer sendmail

Sendmail SMTP STARTTLS

SMTP STARTTLS in sendmail/Secure Switch



Sendmail SMTP AUTH

http://linux.derkeiler.com/Mailing-Lists/Debian/2003-07/0304.html

http://www.sendmail.org/%7Eca/email/auth.html
http://www.jonfullmer.com/smtpauth/
http://www.joreybump.com/code/howto/smtpauth.html
http://server.1und1.com/root_server/bs/suse72/howtos/1.html
http://info.ccone.at/INFO/Mail-Archives/redhat/Jan-2002/msg02936.html
http://www.howtoforge.com/howto_sendmail_smtp_auth_tls



Serveur IMAP/POP

Dovecot

sharevb