Exim sur une lenny
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.
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. Il est possible aussi de faire du greylisting à la sauce Marc Merlins http://marc.merlins.org/
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
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
- freshclam -V : Pour voir la version
- freshclam : pour faire la mise à jour de la base de données
- telnet 127.0.0.1 3310
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.
- clamscan -r -l /home/roger/scan.txt /etc/clamav/
/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)
- tail -f /var/log/clamav/freshclam.log
- tail -f /var/log/clamav/clamav.log
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
- spamassassin -D --lint // Puis avoir le courage de lire et analyser ce qui s'affiche
- spamassassin --lint // Pour les plus pressés, en cas d'erreur, il vous dira quelle est l'erreur
- Trouver les fichiers sample-nonspam.txt et sample-spam.txt ou bien créez vous deux mails : un spam et un nonspam, puis :
spamassassin –t < sample-nonspam.txt > nonspam.out
spamassassin –t < sample-spam.txt > spam.out
- Et lire les fichiers spam.out et nonspam.out à la recherche du score du message.
- utilisation de ps et lecture des logs
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.
Il est possible aussi de faire à la méthode http://mrc.merlins.org/linux/exim/sa.html
2- Installation de exim
Tout simplement : aptitude install exim4-daemon-heavy sa-exim
Pour ceux qui veulent compiler et avoir la toute dernière version non encore dans Debian, voir : http://www.yerbynet.com/Cours/LinuxCompleteMailServer.pdf
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 à gmail.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 Nom de la boite - <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
# Le check_local_user fait un appel au système pour voir si l'utilisateur est connu du système (/etc/passwd)
# check_local_user # Donc, nous, pas besoin
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 exim 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 @yerbynet.com en yerbynet.org // Des gens comme moi
# A l'extérieur, l'email afficher par les MUA est xyz@yerbynet.org, même si la vraie adresse sur le serveur est en .yerbynet.com
*@yerbynet.com $1@yerbynet.org rfF
# En fonction de la correspondance dans le fichier yerbynet.com, changer les To des gens.
*@yerbynet.com ${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'}{$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 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
- /etc/exim4/aliases
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
- /etc/exim4/keys/
Créer ce répertoire et mettre vos certificats et/ou clés SSL pour exim (exim.crt et exim.key)
- /ext/exim4/local_domains
Créer ce fichier et y mettre vos domaines locaux un par ligne Exemple :
@
andriantsoavina.org
greusard.com
- /etc/exim4/relay_from_hosts
Fichier censé contenir les IP des clients
127.0.0.1
<IPServeur>
<AutreReseau1AvecNotationPrefixée>
<AutreReseau2AvecNotationPrefixée>
<AutreReseau3AvecNotationPrefixée>
- /ext/exim4/relay_to_domains
Même syntaxe que local_domains mais concerne les domaines à relayer.
- /ext/exim4/manual_route
Même syntaxe que relay_to_domains mais concerne les domaines router manuellement
- /etc/exim4/rewrite/yerbynet.com
agoliathe@yerbynet.com david@lart.org
- Mailman :
Installez le si ce n'est déjà fait, ou détruisez toute trace de mailman dans la conf de exim
- MySQL :
La base de données MySQL doit être créée avec les paramètres précisés à exim
- Autres :
Créez tout ce qui a été invoqué et qui n'existe pas.
6- Tests et validations
- 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 - exim -bP : Affiche toutes les variables définies dans le runtime configuration file
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_transportexim -v -odf <email> : essaie de livraison réelle avec quelques détails sur les actions prises par exim.
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.
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"
- telnet 127.0.0.1 25 et telnet 127.0.0.1 587
- 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
Amuse-toi bien !
Sources :
exim
SpamAssassin
rfc 1413
ClamAV
http://www.yerbynet.com/Cours/LinuxCompleteMailServer.pdf