Exim sur une lenny

(Exim4 à la manière RogerYerbanga) - http://www.exim.org -

Avant-propos

Oui ! Je reconnais que ce document est "assez long", mais il traite quand même d'un service très important de l'internet avec les services annexes, et j'ai moi même dû lire des documents beaucoup plus longs et en anglais en plus pour arriver à l'écrire. Au début, je voulais faire un truc court et rapide mais, à chaque fois j'ai cherché à mieux expliquer et ça donne donc finalement une longue page. Ce document est donc pour ceux qui veulent vraiment comprendre comment ça fonctionne : prenez votre courage à deux mains voire deux mains et deux pieds, et lisez le jusqu'à la fin. Pour ceux qui sont pressés, faîtes un copier/coller, enlevez les commentaires et démarrer exim, et le deboggage qui va avec. (Mais je vous assure qu'il n'y'aura pas beaucoup choses à modifier) Cependant, avec un peu de courage (inch'Allah), je récrirai certainement une autre documentation plus digeste et décomposée en plusieurs parties.

JC : A toi l'honneur ;-)

Introduction

Exim est un serveur de messagerie électronique (Mail Transfer Agent) utilisé sur de nombreux systèmes UNIX. Son choix est justifié par le fait qu’il est très complet avec de nombreux paramètres, qu’il permet de faire du maildir (livraison des mails dans un répertoire), qu’il permet de choisir notre méthode de gestion des utilisateurs (soit base de données mysql, ldap, passwd, …), il est robuste (peut gérer des grands systèmes avec des milliers d’utilisateurs et de mails par jour), il est capable de rejeter les mails dans la session SMTP ce qui génère moins de trafic, et il est assez aisé à configurer, et il est très bien documenté.

Exim tourne grâce et/ou avec un certain nombre de fichiers qu’on peut classer en 4 groupes :

- Les binaires qui sont les exécutables de exim et qui définissent le fonctionnement global de exim.

- Les fichiers de configurations sur lesquels se basent les binaires et qui déterminent la manière dont exim tourne sur notre système

- Les fichiers logs, des fichiers journaux qui donnent des détails sur le processus d’exécution de Exim.

- Et les mails qu’il délivre aux utilisateurs dans leur répertoire ou fichier respectif.

Dans ce document, j'expliquerai beaucoup plus la configuration de exim ainsi que les tests à faire pour valider sa configuration de exim.

1- Prérequis

Pour son installation, sur une debian lenny, il suffit juste de faire : aptitude install exim4-daemon-heavy L'installation est donc très facile;-) Cependant, pour qu'exim tourne, il lui faut obligatoirement un anti-virus (on fait appel à clamav), et un antispam est optionnel, mais fortement recommandé, le standard de fait est spamassassin, possible de mettre du mailman pour ceux qui veulent gérer des listes de diffusion. Exim utilise sa-exim pour contrôler sa manière de causer avec des programmes comme spamassassin, et préciser comment on traite les spams en fonction de leur score ; il est également à installer. Un autre programme interessant est greylistd, qui permet de faire du greylisting à la sauce debian.

Sur une lenny, l'installation de ces paquets se fait juste avec aptitude install <nomdupaquet> Il faut cependant faire attention pour clamav et s'assurer que les deux paquets clamav-freshclam et clamav-daemon.

1.1- ClamAV

- http://www.clamav.net/ -

Deux sous-programmes :

- clamav-freshclam : qui se charge des mises à jour de la base de définitions des virus

- clamav-daemon : qui fait le vrai boulot, scanne les fichiers à la recherche de virus

Les fichiers de configurations sont dans /etc/clamav et sont :

- /etc/clamav/clamd.conf : C’est le principal fichier de configuration, c’est lui qui précise les paramètres comme le type de fichiers à scanner ou ne pas scanner et les options qui vont avec, les fichiers où écrire les logs, la taille maximale des fichiers à scanner, …

Pour ce fichier, les options à retenir sont :

Mettre un # devant la ligne commençant par LocalSocket pour la commenter
Ajouter la ligne : TCPSocket 3310
Ajouter la ligne : TCPAddr 127.0.0.1
Vérifier la ligne : User clamav
Vérifier la ligne LogFile : LogFile /var/log/clamav/clamd.log
Vérifier ou activer les lignes :
LogTime true
ScanPE true
ScanOLE2 true
ScanHTML true
ScanMail yes
ScanArchive true
Mais : Ne pas activer l’option MailFollowURLs
MailFollowURLs false

- /etc/clamav/freshclam.conf : C’est le fichier de configuration de freshclam. Il précise les paramètres de mise à jour automatique de l’antivirus (toutes les 2h), les serveurs proxy, si nécessaire, le nombre de tentatives de mise à jour, et les fichiers logs.

Pour ce fichier, les options à retenir en plus de la config par défaut sont :

DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogFileMaxSize 10M
LogTime true
DatabaseDirectory /var/lib/clamav/
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror db.XY.clamav.net # Où XY représente le country code de votre pays
DatabaseMirror database.clamav.net

Quelques outils pour vérifier que clamav fonctionne bien

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SCAN /home/roger/
/home/roger/: OK
Connection closed by foreign host.

/etc/clamav/freshclam.conf: OK
/etc/clamav/freshclam.conf.old: OK
/etc/clamav/clamd.conf: OK
/etc/clamav/clamd.conf.old: OK

----------- SCAN SUMMARY -----------
Known viruses: 514191
Engine version: 0.94.2
Scanned directories: 4
Scanned files: 4
Infected files: 0
Data scanned: 0.00 MB
Time: 1.786 sec (0 m 1 s)

1.2- SpamAssassin

- http://www.spamassassin.org/ -

La configuration par défaut de spamassassin fonctionne assez bien, même si des config plus sophistiquées avec des règles spécifiques sont possibles. Une doc sur spamassassin pourrait être bientôt rédigée.

Quelques options tout de même du fichier local.cf

# le score à partir duquel un message est classé comme spam. Par défaut, c’est 5, mais j’ai déjà vu des configurations avec 7.
required_score 5.0
# Mettre ces 2 paramètres à 1 pour dire à SA de faire attention aux mots ou séquences de mots souvent présents dans les spams et de les apprendre lui-même. La commande sa-learn permet de faire apprendre manuellement.
use_bayes 1
bayes_auto_learn 1
# permet de spécifier des réseaux auxquels on a confiance, donc des réseaux non spammeurs.
trusted_networks 10.196.1/24 <IPserveurencoursdeconfiguration>
# (In SpamAssassin 3.2.x, it will no longer be necessary to specify 127.0.0.1; it'll automatically be trusted implicitly.)

Pour tester

1.3- Greylist

Pas forcément necessaire, mais interessant pour faire du greylisting : rejet de mail temporairement avec écriture d'informations (expéditeur, récepteur, serveur d'envoi) dans une base de données, puis demande de ressayer plus tard.

Permet avec spamassassin de lutter contre les spams.

Pour installer : aptitude install greylistd // et répondre oui ou non aux questions qu'il vous pose.

Puis ouvrir le fichier /etc/greylistd/whitelist-hosts et rajouter sur 2 lignes différentes les IP du serveur mail de Montreal et de Dakar, puis d'autres serveurs auxquels vous avez assez confiance en matière de spam.

2- Installation de exim

Tout simplement : aptitude install exim4-daemon-heavy sa-exim

3- Configuration de exim

Il est possible de travailler avec l'installation par défaut de exim, mais vu qu'on aime pas les choses par défaut et qu'on comprend bien le fonctionnement de exim et son fichier de conf, on élimine la config par défaut pour créer notre propre fichier de configuration.

3.1 - Destruction de la configuration par défaut

mv /etc/exim4/exim4.conf.template /etc/exim4/exim4.conf.template.orig

Il est possible de supprimer tout ce qu'il y'a dans le répertoire /etc/exim4, à part le fichier sa-exim.conf

3.2 - Fichier de conf de exim

Dans le cas de notre installation, il s'appelle /etc/exim4/exim4.conf.template. Mais il poourrait s'appeler n'importe quoi d'autre y compris prog ou fou ;-) Il faut donc le recréér puisqu'on vient juste d'être malin en le supprimant.

La structure du fichier de configuration de exim ressemble à s'y méprendre au traitement qu'effectue un MTA sur un mail qu'il reçoit. Ce fichier est divisé en plusieurs sections, la première définit les options globales, tandis que les autres plus ou moins optionnelles commencent par begin <nomdesection> . Les commentaires, les macros, les affectations, les inclusions sont disponibles, et la syntaxe ressamble à du langage de script shell. Le commentaire dans ce fichier est le caractère # en début de ligne.En général, on a 7 parties, et chaque partie à part la section globale correspond aux différentes actions réalisées sur un message :

3.2.1 - Section globale

La section qui précise les paramètres globaux :

# Donner les paramètres d'une base de données à exim.
#hide mysql_servers = <IPServeurMySQL>/<nomdebasededonnées>/<UtilisateurAyantDroitDeSelect>/<Motdepasse>
# Exemple :
hide mysql_servers = 127.0.0.1/mail/admin/passefacileàcracker

# Quelques paramètres pour Mailman dans la section principale
MAILMAN_HOME=/usr/lib/mailman
MAILMAN_VAR=/var/lib/mailman
MAILMAN_WRAP=MAILMAN_HOME/mail/mailman
MAILMAN_USER=list
MAILMAN_GROUP=list
domainlist MM_DOMAINS = domain1 : domain2 : domain3

# Pour faire du routage de mail manuel vers des serveurs qu'on veut
# Mettre dans un fichier les domaines qu'on veut router manuellement
# Par exemple, si je veux que les mails envoyés à auf.org passent d'abord par un serveur précis :
# pas de requête DNS pour savoir vers quel serveur envoyer
domainlist MR_DOMAINS = /etc/exim4/manual_route
# Il est clair que ce fichier (/etc/exim4/manual_route) est à créer et doit contenir les domaines à
# router manuellement ; un domaine par ligne.
# Pour ceux qui ne font ni de l'authentification mysql, ni du mailman, ni du routage manuel, pas besoin de ces paramètres.

# Le canonical name de votre serveur :
# Je conseille de prendre le nom qui est déclaré dans le DNS, qui correspond au reverse et qui est
# souvent celui qui se trouve dans /etc/mailname
primary_hostname = <NomPrincipalDeVotreServeurDeMail>

# Le ou les domaines locaux
# Choisir l'une des deux lignes suivantes en fonction que vous gérez plusieurs dizaines de domaines ou juste deux trois domaines
domainlist local_domains = /etc/exim4/local_domains
domainlist local_domains = @ : <domainegéré1> : <domainegéré2> : <domainegéré3>
# Si vous décidez de choisir la première méthode, il faudra créer le fichier /etc/exim4/local_domains, et inscrire les différents domaines : une par ligne.
# Pour la deuxième option, le @ signifie le nom de la machine.

# Les domaines pour lesquels on sert de relay. C'est mis dans un fichier, mais si on n'a que peut de domaines qui ne changeront pas souvent,
# il est conseillé de les mettre directement sur la ligne comme dans l'option 2 du local_domains.
domainlist relay_to_domains = /etc/exim4/relay_to_domains

# Les clients, les IP qui ont le droit sans s'authentifier d'utiliser ce serveur pour envoyer des mails
# Fichier à créer, sinon mettre les réseaux (exemple : 10.196.1.0/24) directement sur la ligne
hostlist   relay_from_hosts = /etc/exim4/relay_from_hosts

# On définit deux ACL qu'on utilisera pour traiter les mails.

# acl_check_rcpt qui analyse les entêtes pour faire des vérifications sur l'emetteur et surtout le recepteur
acl_smtp_rcpt = acl_check_rcpt

# qui analyse les données
acl_smtp_data = acl_check_data
# Ces deux acls seront décrites plus loin dans la section des acls.

# Comment on appelle l'antivirus
av_scanner = clamd:127.0.0.1 3310
# C'est pour cela qu'il est important de tester que le port 3310 répond
# Il est possible de préciser un autre serveur Antivirus avec : av_scanner = clamd:<IPServerAV> 3310

# Comment on appelle l'antispam
spamd_address = 127.0.0.1 783
# Possible d'interroger un autre serveur Anti-spam si on a le droit en précisant son IP
# Exemple : spamd_address = 196.200.41.41 783
# Exemple : av_scanner = clamd:41.41.200.196 3310 # Pour clamav

# Dire à tout le monde qu'on fait du TLS, même à ceux qui ne veulent pas
tls_advertise_hosts = *

# Les fichiers où trouver les certificat et clé TLS pour exim
# Le certificat et la clé privé peuvent être mis dans un fichier unique
tls_certificate = /etc/exim4/keys/exim.crt
tls_privatekey = /etc/exim4/keys/exim.pem
# Ces fichiers et répertoires sont donc à créér avec la PKI.

# Les ports écoutés par exim
daemon_smtp_ports = 25 : 587

# Le domaine principal de messagerie
qualify_domain = <VotreDomainePrincipal>

# Faire des requêtes de reverse DNS sur toutes les requêtes reçues. Possible de restreindre à certains réseaux ou tout simplement supprmier
host_lookup = *

# Faire des requêtes rfc 1413 pour identifier la connexion pour toutes connexion SMTP, avec un timeout à 5s
rfc1413_hosts = *
rfc1413_query_timeout = 5s

# Les frozen
# Quand exim ne peut pas délivrer un message, ni le message d'erreur engendré, il gèle le message d'erreur. Il ne tente pas de le renvoyer.
# Cette option dégèle le message d'erreur après 3 jours, ressaye de le renvoyer et ignore les éventuels erreurs pouvant survenir
ignore_bounce_errors_after = 3d
# Cette option supprime les messages gelés pendant plus de 7 jours
timeout_frozen_after = 7d

# Option à activer dans de gros systèmes, le répertoire de spool est subdivisé en plusieurs sous-repertoires : 0, 1, ... A, B, ... a, b, ... z
# split_spool_directory = true
# Permet de gérer plus efficacement de très grosses queues de mails

# Banière SMTP au lieu d'afficher le nom du logiciel Exim-4.69 ...
smtp_banner = "<NomDNSDeVotreServeurDeMail> ESMTP Agence universitaire de la Francophonie - <Votre Ville>"

# On n'a pas le temps d'attendre plus de 2 mn quand l'autre bout ne réagit plus
smtp_receive_timeout = 2m

# Possible d'activer ces paramètres et les adapter à vos besoins
#smtp_accept_max = 30
#smtp_accept_max_nonmail = 3
#smtp_max_unknown_commands = 3
#smtp_accept_max_per_host = 5

# FIn Section globale, les autres sections commencent donc toutes par begin <nomdesection>

3.2.2 Section des acls

Rappelez-vous, dans la section principale, on avait parlé de deux acls, acl_check_rcpt et acl_check_data ; il faut donc les écrire dans cette section.

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

# On commence la section par  begin acl
begin acl

# Ecriture de l'acl acl_check_rcpt
# Cette acl fait un certain nombre de tests sur les destinataires du message et sur l'emetteur
# Les tests sont exécutés séquentiellement, jusqu'à ce qu'on tombe sur denied ou un accepted
# ACL appelée avant la réception des données

acl_check_rcpt:

# Commencer d'abord par faire du greylisting

# D'abord différer la réception du message et demander au serveur distant de ressayer plus tard
# Mais ne pas différer la réception des mails qui viennent de serveurs whitelistés
 defer
   message        = $sender_host_address is not yet authorized to deliver \
                    mail from <$sender_address> to <$local_part@$domain>. \
                    Please try later.
   log_message    = greylisted.
   !senders       = :
   !hosts         = : +relay_from_hosts : \
                    ${if exists {/etc/greylistd/whitelist-hosts}\
                                {/etc/greylistd/whitelist-hosts}{}} : \
                    ${if exists {/var/lib/greylistd/whitelist-hosts}\
                                {/var/lib/greylistd/whitelist-hosts}{}}
   !authenticated = *
   domains        = +local_domains : +relay_to_domains
   verify         = recipient/callout=20s,use_sender,defer_ok
   condition      = ${readsocket{/var/run/greylistd/socket}\
                                {--grey \
                                 $sender_host_address \
                                 $sender_address \
                                 $local_part@$domain}\
                                {5s}{}{false}}

# Deny si blacklisté par greylist
deny
  message = $sender_host_address is blacklisted from delivering \
                    mail from <$sender_address> to <$local_part@$domain>.
  log_message = blacklisted.
  !senders        = :
  !authenticated = *
  verify         = recipient/callout=20s,use_sender,defer_ok
  condition      = ${readsocket{/var/run/greylistd/socket}\
                                {--black \
                                 $sender_host_address \
                                 $sender_address \
                                 $local_part@$domain}\
                                {5s}{}{false}}

 # Accept si la source est local
 accept  hosts = :
# Fin du greylisting dans l'acl_check_rcpt

# Deny certains caractères (@  .  !  /  | %) qui ne sont pas au bon endroit dans le local_part
 deny    message       = Restricted characters in address
         domains       = +local_domains
         local_parts   = ^[.] : ^.*[@%!/|]

 deny    message       = Restricted characters in address
         domains       = !+local_domains
         local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

# Accepter les mails au postmaster dans tous les domaines locaux sans regarder la source
# Postmaster recevra donc plus de spam que tout le monde à priori
 accept  local_parts   = postmaster
         domains       = +local_domains

# Vérifier si le domaine de l'expéditeur existe, sinon, refuser
 require verify        = sender

# Accepter le message s'il vient d'un hôte dans relay_from_hosts, donc est un client
# On si l'utilisateur s'est authentifié depuis n'importe quel hôte ou réseau.

# Client
 accept  hosts         = +relay_from_hosts
         control       = submission/domain=

# Authentifié
 accept  authenticated = *
         control       = submission/domain=
# control = submission qu'il cause à des MUAs et qu'il aura peut être à corriger des problèmes liés aux MUAs
# "/domain=" permet d'ôter les domaines dans les noms d'utilisateurs reçus par submission.
# Si vous ne gérez pas plusieurs domaines et que vos utilisateurs s'authentifie uniquement avec le local_part et non l'email, pas besoin de ça.

# Si c'est deux conditions (le domaine doit être local ou être un domaine qu'on accepte de relayer) ne sont pas remplies, ==> relay non permis
 require message = relay not permitted
         domains = +local_domains : +relay_to_domains

# A ce niveau, le domaine reçu est bien géré par votre serveur
# Il reste à vérifier que l'utilisateur est bien connu chez vous
 require verify = recipient

# Puis, si le message passe cette étape, on l'accepte du point de vue de cette acl

 accept


# Ecriture de l'acl acl_check_data
# Cette acl est utilisée après la réception du corps du message
# Les tests sont exécutés séquentiellement, jusqu'à ce qu'on tombe sur denied ou un accepted

acl_check_data:

# Commencer d'abord par faire du greylisting
 defer
   message        = $sender_host_address is not yet authorized to deliver \
                    mail from <$sender_address> to <$local_part@$domain>. \
                    Please try later.
   log_message    = greylisted.
   !senders       = :
   !hosts         = : +relay_from_hosts : \
                    ${if exists {/etc/greylistd/whitelist-hosts}\
                                {/etc/greylistd/whitelist-hosts}{}} : \
                    ${if exists {/var/lib/greylistd/whitelist-hosts}\
                                {/var/lib/greylistd/whitelist-hosts}{}}
   !authenticated = *
   domains        = +local_domains : +relay_to_domains
   verify         = recipient/callout=20s,use_sender,defer_ok
   condition      = ${readsocket{/var/run/greylistd/socket}\
                                {--grey \
                                 $sender_host_address \
                                 $sender_address \
                                 $local_part@$domain}\
                                {5s}{}{false}}

deny
  message = $sender_host_address is blacklisted from delivering \
                    mail from <$sender_address> to <$local_part@$domain>.
  log_message = blacklisted.
  !senders        = :
  !authenticated = *
  verify         = recipient/callout=20s,use_sender,defer_ok
  condition      = ${readsocket{/var/run/greylistd/socket}\
                                {--black \
                                 $sender_host_address \
                                 $sender_address \
                                 $local_part@$domain}\
                                {5s}{}{false}}

 accept  hosts = :
# Fin du greylisting dans l'acl_check_rcpt

# Rajout de quelques deny pour les mails virusés, les extensions MIME malformées, les extensions de fichiers windows non sollicitées.
 deny    malware    = *
         message    = Message bi, contient virus mom ! ($malware_name).

 deny    message    = This message contains malformed MIME ($demime_reason).
     demime    = *
   condition = ${if >{$demime_errorlevel}{2}{1}{0}}

 deny message = Blacklisted file extension detected - Extension de fichier non autorisee
      demime = exe:pif:bat:src

# Rajout de warning pour le score spamassassin du mail
 warn    spam       = nobody
         add_header = X-Spam_score: $spam_score\n\
                      X-Spam_score_int: $spam_score_int

# Puis finalement, accepter le message

 accept

# FIN des ACLs ###########################

3.2.3 Section des Routers

La section des Routers est avec celle des Transports à venir les sections où on réfléchit le plus pour faire le plus d'adaptation à nos installations.

Les routeurs précisent la manière dont sont routés les mails, quel mail doit être délivré localement, quel mail doit sortir avec du SMTP, ou faire appel au système d'alias, ou suivre un routage spécifique, ...

Les routeurs sont exécutés les uns à la suite des autres tel qu'ils apparaissent dans le fichier de configuration. L'ordre est donc très important, même si des branchements conditionnels sont possibles.

######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!       #
# An address is passed to each router in turn until it is accepted.  #
######################################################################

begin routers

# Routeur pour faire du mailman
# Faire quelques vérifications et appeler le mailman_transport qui se charge effectivement de transporter le mail s'il remplit ces conditions
mailman_router:
   driver = accept
   domains = +MM_DOMAINS
   require_files = MAILMAN_VAR/lists/$local_part/config.pck
   local_part_suffix_optional
   local_part_suffix = -bounces : -bounces+* : \
                       -confirm+* : -join : -leave : \
                       -owner : -request : -admin
   transport = mailman_transport


# Pour le routage manuel
# Tester que le domaine est dans la liste des domaines à router manuellement
# Puis, route_list permet de dire vers quel prochain serveur est envoyé le mail du domaine en question
# Le transport appelé est remote_smtp qui permet d'envoyer des mails vers un autre serveur smtp
smart_route:
 driver = manualroute
 domains = +MR_DOMAINS : domain1.org : domain2
 transport = remote_smtp
 route_list = +MR_DOMAINS smtp.relaygeneral.gn ; domain1.org smtp1.relay1.net ; domain2 smtp2.relay2.org
 no_more

# Le routeur qui permet d'envoyer des mails sur tout internet, à noter l'appel au transport remote_smtp
dnslookup:
 driver = dnslookup
 domains = ! +local_domains
 transport = remote_smtp
 ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
 no_more

# Les alias sont cherchés littéralement dans le fichier texte /etc/exim4/aliases
# Possible de faire mieux avec des bases de données et des requêtes SQL quand cela est necessaire,
# pour 2 ou 3 alias ce routeur est largement satisfaisant
system_aliases:
 driver = redirect
 allow_fail
 allow_defer
 data = ${lookup{$local_part}lsearch*@{/etc/exim4/aliases}}
 file_transport = address_file
 pipe_transport = address_pipe


# Les deux routeurs suivants gèrent les utilisateurs locaux,
# les utilisateurs venant d'une base de données mysql
mysql_localuser:
 driver = redirect
# 3 options ajoutées pour le recipient_delimiter de postfix roger+xyz=roger
 local_parts = $local_part : $local_part+*
 local_part_suffix = +*
 local_part_suffix_optional
 allow_fail
 allow_defer
 data = ${lookup mysql{select username from utilisateur where username='$local_part'}{$value}fail}
 redirect_router = localuser
 no_more
# Ce qui signifie qu'on a une table utilisateur avec un champ username dans notre base de données dont les
# paramètres ont été fournis dans la section globale

# Routeur appelé par mysql_localuser
# Celui-ci transporte le message avec le transport local_delivery, sinon Unkown user
localuser:
 driver = accept
#  check_local_user #
 local_part_suffix = *+
 local_part_suffix_optional
 transport = local_delivery
 cannot_route_message = Unknown user

## FIN des ROUTERS ########################

3.2.4 Section des Transports

Le transport est l'appareil qui délivre le message à la destination (locale, distante, ...).

Un transport est utilisé si et seulement si quand le message en fonction de son adresse de destination rempli les conditions spécifiées par le routeur qui appelle le transport. Par exmple, pour exécuté le transport mailman, il faut que l'adresse destinataire soit une liste locale. Et les conditions pour qu'un local_part soit une liste locale sont précisées dans le routeur mailman_router.

De ce fait, l'ordre des transports n'est pas important, puisqu'ils sont tous appelés par des routeurs.

######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

begin transports

# Ce transport est utilisé pour délivré les messages à travers les connexions SMTP
remote_smtp:
 driver = smtp

# Ce transport est utilisé pour la livraison locale
# Les répertoire des utilisateurs sont recherchés dans le champ homedir de la table utilisateur de la base de BD mysql
# La livraison se fait sous format maildir
local_delivery:
 driver = appendfile
 user = Debian-exim
 group = mail
 directory_mode = 0770
 mode = 0660
 mode_fail_narrower = false
 delivery_date_add
 envelope_to_add = true
 return_path_add = true
 directory = ${lookup mysql{select homedir from utilisateur where username='$local_part'}}
 maildir_format = true

# Transport pour Mailman
mailman_transport:
   driver = pipe
   command = MAILMAN_WRAP \
             '${if def:local_part_suffix \
                   {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
                   {post}}' \
              $local_part
   current_directory = MAILMAN_VAR
   home_directory = MAILMAN_VAR
   user = MAILMAN_USER
   group = MAILMAN_GROUP

# Deux transports suivants sont utilisés par les alias selon que l'alias renvoie une liste d'autres adresses (address_pipe)
# ou une adresse locale pour laquelle il faut écrire dans un fichier.
address_pipe:
 driver = pipe
 return_output

address_file:
 driver = appendfile
 delivery_date_add
 envelope_to_add
 return_path_add


# FIN des TRANSPORTS ############################"

3.2.5 Section des Retransmissions

Préciser comment est-ce que gère les retransmissions de message échouées

######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################

begin retry

# Une seule règle de retransmission appliquées à tous les domaines et tous les types d'erreurs
# Les deux premières heures, retransmission toutes les 15 mn, puis retransmettre après 1h et augmenter
# le délai de retransmission d'un facteur de 1.5 à chaque nouvelle retransmission jusqu'à 16h, puis
# retransmettre toutes les 6h jusqu'à 4 jours depuis le premier échec.

# Adresse ou Domaine   Erreur      Retransmissions
# ------------------   ------      ---------------

*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h

# A noter qu'il est impératif d'avoir au moins cette ligne (donc une règle générale)
# qui précise comment exim traite les retransmissions, sinon, il ne traitera pas de retransmission par défaut.
# Il est également possible d'avoir plusieurs lignes par domaine et/ou erreur

# FIN  des RETRANSMISSIONS ##############################

3.2.6- Section des Récritures

Préciser comment est-ce que gère les retransmissions de message dont l'envoi a échoué

######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

# Qu'est ce qu'on récrit et comment le fait-on ?

begin rewrite

# Changer les from et reply-to des gens qui sont en @sn.auf.org en auf.org // Des gens comme moi
# A l'extérieur, l'email afficher par les MUA est xyz@auf.org, même si la vraie adresse sur le serveur est en .sn.auf.org
*@sn.auf.org                $1@auf.org    rfF

# Changer les To des gens en sn.auf.org pour ne pas que les mails locaux partent d'abord vers Montreal
*@auf.org               ${lookup{$local_part@$domain}lsearch*@{/etc/exim4/rewrite/$domain}{$value}fail}       T

# FIN des REWRITE ##################################

3.2.7- Section des Authentificateurs

Ce qui permet d'authentifier les utilisateurs ; très utile pour le roaming sans être un openrelay.

######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

begin authenticators

# Une clé secrète est fournie aux utilisateurs dans cet exemple.
#PLAIN:
#  driver                     = plaintext
#  server_set_id              = $auth2
#  server_prompts             = :
#  server_condition           = ${if and {{eq{$auth2}{username}}{eq{$auth3}{mysecret}}}}
#  server_advertise_condition = ${if def:tls_cipher }


# Ici, il faut construire une requête SQL en fonction de la base de données pour récupérer les
# informations d'authentification de l'utilisateur
PLAIN:
 driver                     = plaintext
 server_set_id              = $auth2
 server_prompts             = :
 server_condition           = ${if crypteq{$auth3}{${lookup mysql {select motdepasse from utilisateur where adresse ='$auth2' or (username='thomas' and mail like '%@refer.org')}{$value}}}{yes}{no}}
 server_advertise_condition = ${if def:tls_cipher}


# Un autre exemple
LOGIN:
 driver                     = plaintext
 public_name                = LOGIN
 server_set_id              = $auth1
 server_prompts             = UserName : Password
 server_condition           = ${if crypteq{$auth2}{${lookup mysql {select password from auforg_virtual where (source='$auth1') and (destination not like '%@secours')}{$value}}}{yes}{no}}
 server_advertise_condition = ${if def:tls_cipher}

# FIN des AUTHENTICATORS ################################

###### FIN du Fichier de CONF de exim ###################

4- Configuration de sa-exim

Par défaut, la config de sa-exim n'a rien de spécial ; juste préciser quel est le répertoire de spool, le chemin d'accès à spamc, taille max du corps du message fourni à spamassassin, ... Par défaut, c'est bien bien fait, sauf qu'il faut néanmoins vérifier quelques paramètres.

Le fichier en question est /etc/exim/sa-exim.conf, et je mettrai juste quelques paramètres à vérifier :

# Ce paramètre est le plus important à vérifier, il doit être à 1 et non à 0,
# pour activer sa-exim
#SAEximRunCond: 0 # Pas bon
SAEximRunCond: 1

# Score à partir duquel le message spamé est éliminé en silence
# Puis sauvegarde du mail éliminé dans /var/spool/exim4/SAdevnull
SAdevnull: 20.0
SAdevnullSavCond: 1
SAdevnullsave: /var/spool/exim4/SAdevnull

# Score à partir duquel un message est permanement rejeté
# Puis sauvegarde dans /ar/spool/exim4/SApermreject
SApermreject: 13.0
SApermrejectSavCond: 1
SApermrejectsave: /var/spool/exim4/SApermreject

# Score à partir duquel un message est temprairemement rejeté
# Puis sauvegarde dans /ar/spool/exim4/SAtempreject
SAtempreject: 7.0
SAtemprejectSavCond: 1
SAtemprejectsave: /var/spool/exim4/SAtempreject

# Si vous n'avez pas envie de sauvegarder les messages rejeté de manière silencieuse, permanente,
# ou temporaire, mettez à 0 le paramètre correspondant
# Exemple : SAtemprejectSavCond: 0 pour le cas du temporaire

# Taille max du body à fournir à spamassassin en octets
# Exemple de 500Ko
SAmaxbody: 512000

# 20 Mo pour les mails rejetés sauvegardés
# to archive? Default is 50MB.
SAmaxarchivebody: 52428800

## FIN de sa-exim

5- Création des fichiers et répertoires utilisés dans la conf de exim

Facile, faire un lien entre le fichier alias du système et /etc/exim/aliases Pour écrire une ligne d'alias, c'est tellement compliqué que c'est hors sujet

Créer ce répertoire et mettre vos certificat et/ou clé SSL pour exim (exim.crt et exim.key)

Créer ce fichier et y mettre vos domaines locaux un par ligne Exemple :

@
andriantsoavina.org
refer.org

Fichier censé contenir les IP des clients

127.0.0.1
<IPServeur>
<AutreReseau1AvecNotationPrefixée>
<AutreReseau2AvecNotationPrefixée>
<AutreReseau3AvecNotationPrefixée>

Même syntaxe que local_domains mais concerne les domaines à relayer.

Même syntaxe que relay_to_domains mais concerne les domaines router manuellement

Installez le si ce n'est déjà fait, ou détruisez toute trace de mailman dans la conf de exim

La base de données MySQL doit être créée avec les paramètres précisés à exim et la utilisateur

Créez tout ce qui a été invoqué et qui n'existe pas.

6- Tests et validations

  1. exim -bV : permet de vérifier la version et les options supportées exim, et aussi la syntaxe du fichier de configuration. En cas d'erreur de syntaxe, on est informé par cette commande avant de recharger le fichier.
    Exim version 4.69 #1 built 30-Sep-2008 18:26:44
    Copyright (c) University of Cambridge 2006
    Berkeley DB: Berkeley DB 4.6.21: (September 27, 2007)
    Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning Old_Demime
    Lookups: lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite
    Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
    Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect
    Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
    Fixed never_users: 0
    Size of off_t: 8
  2. exim -bP : Affiche toutes les variables définies dans le runtime configuration file
  3. exim -bt <email> : permet de tester le comportement de exim lorsqu'il reçoit un mail à destination de <email>

    # exim -bt roger@test.gn
    roger@test.gn
        <-- roger@test.gn
      router = localuser, transport = local_delivery
    
    # exim -bt roger@gmail.com
    roger@gmail.com
      router = dnslookup, transport = remote_smtp
      host gmail-smtp-in.l.google.com      [216.239.59.27] MX=5
      host alt1.gmail-smtp-in.l.google.com [209.85.135.27] MX=10
      host alt2.gmail-smtp-in.l.google.com [209.85.220.21] MX=20
      host alt3.gmail-smtp-in.l.google.com [74.125.47.27]  MX=30
      host alt4.gmail-smtp-in.l.google.com [209.85.147.27] MX=40
    
    # exim -bt diffusion-ao@test.gn
    diffusion-ao@test.gn
      router = mailman_router, transport = mailman_transport
  4. exim -v -odf <email> : essaie de livraison réelle avec quelques détails sur les actions prises par exim.

  5. exim -d -odf <email> : essaie de livraison réelle avec un full debug : tous les détails de toutes les actions dans les moindres détails.

  6. exim -bh <IP> : permet de vérifier le relayage depuis cette IP même si on est pas sur une machine qui a cette IP. En gros, ça permet de vérifier que les mails de vos clients sont bien pris en compte, tandis que ceux des non-clients sont "denied"

  7. telnet 127.0.0.1 25 et telnet 127.0.0.1 587
  8. Voir les logs /var/log/exim/mainlog /var/log/exim/rejectlog (et /var/log/exim/paniclog qui ne devrait pas exister si tout se passe bien)

Conclusion

Sources :

exim SpamAssassin rfc 1413 ClamAV http://www.yerbynet.com/Cours.html

ZAO/Exim4 (dernière édition le 2009-08-24 14:37:03 par RogerYerbanga)